Compare commits

...

115 Commits

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

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

* lang

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

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

* Switch order of literals to prevent NullPointerException

* Introduced protections against predictable RNG abuse

---------

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

* Update README.md

* install custom fonts

* Formats etc

* version bump

* disable WIP work

* remove chinese font

---------

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

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

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

Only full sentences should end in a period,

* Update messages_de_DE.properties

* Update messages_de_DE.properties

---------

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

This PR replaces the PR #1003

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

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

* change to `Bean`

* Update AppUpdateShowService.java

* add update message

* revision service

* change shouldShow

* Update githubVersion.js

* rm folder

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

* Change class, add output format

* Add input field for output format

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

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

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

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

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

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

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

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

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

# Update Greek Translations

## Description

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

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

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

* refactor: remove unused variable

---------

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

* Add added error translation block into  uk_UA lang

---------

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

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

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

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

* Fix description for "Split PDF" except AR

* Fix description for "Split PDF" in AR

* Fix one mistake on AR

* Keep clear this branch from other branches
2024-04-03 22:40:35 +01:00
Dimitris Doukas
5d71ffbfaa Update homepage screen in README (#1021)
Update screen of homepage
2024-04-03 22:40:09 +01:00
CocoMaster-AI
c0c137d1b0 Sponsor information supports translate now (#1023)
Sponsored information supports translate now
2024-04-03 10:02:01 +01:00
Anthony Stirling
8625db2885 Update build.gradle 2024-04-01 22:10:33 +01:00
Anthony Stirling
a2a969a0a0 Chinese font and word conv fix (#1014)
* remove lite package

* alphine update for word conversion issue #995
2024-04-01 22:04:27 +01:00
Anthony Stirling
8a6386ca73 remove lite package (#1012) 2024-04-01 18:33:58 +01:00
NicolasFR
255c018415 Update messages_fr_FR.properties (#1011)
fix(lang): fix a translation error
2024-04-01 17:55:22 +01:00
albanobattistella
df27ed6907 Update messages_it_IT.properties (#1010) 2024-04-01 15:04:05 +01:00
CocoMaster-AI
989491b903 Extract text from error pages and sync text variable to all lang (#1008)
* feat: extract text from error pages

* feat: sync text variables to langs.properties

---------

Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2024-04-01 11:04:56 +01:00
NicolasFR
664dd62d8b doc: add --break-system-packages (#1001)
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2024-04-01 10:56:33 +01:00
albanobattistella
3d6b145db5 Update messages_it_IT.properties (#1002) 2024-03-30 19:51:44 +00:00
CocoMaster-AI
37a63242a6 Update messages_ru_RU.properties (#999) 2024-03-30 10:26:51 +00:00
Eric
dfb8c64f5a fix: switch to pdftohtml for pdf to html conversions (#998)
* fix: switch to pdftohtml for pdf to html conversions

* build: include poppler-utils in dockerfile for pdftohtml
2024-03-29 17:02:33 -04:00
github-actions[bot]
27bbf7a513 💾 Update Version (#997)
💾 Sync Versions
> Made via sync_versions.yml

Co-authored-by: GitHub Action action@github.com <GitHub Action action@github.com>
2024-03-29 11:04:05 +00:00
Anthony Stirling
ca890e4b32 Pipeline fix quick 2024-03-29 11:03:13 +00:00
CocoMaster-AI
4834d01223 feat: translate messages_ko_KR.properties, messages_ru_RU.properties completed (#996)
* feat: translate ko_KR.properties completed

* feat: feat: translate ru_RU.properties completed
2024-03-29 10:17:10 +00:00
albanobattistella
84b3bb1aed Update messages_it_IT.properties (#993) 2024-03-28 20:50:29 +00:00
Anthony Stirling
a9679da719 Revert weasy 2024-03-28 19:38:56 +00:00
Anthony Stirling
f10b3ffe3c multiTool.uploadPrompts 2024-03-28 17:45:58 +00:00
SuperFan
ea982d6412 fix: Add MultiTool UploadPrompts zh_CN And en_US (#977)
Co-authored-by: superfan <admin@henniubi.com>
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2024-03-28 17:44:21 +00:00
pixeebot[bot]
1035a3be31 Define a constant for a literal string that is duplicated n times (Sonar) (#978)
Co-authored-by: pixeebot[bot] <104101892+pixeebot[bot]@users.noreply.github.com>
2024-03-28 17:44:10 +00:00
github-actions[bot]
c16db14cd9 Update 3rd Party Licenses (#992)
Signed-off-by: GitHub Action <action@github.com>
Co-authored-by: GitHub Action <action@github.com>
2024-03-28 17:43:30 +00:00
github-actions[bot]
1698f9d5df 💾 Update Version (#991)
💾 Sync Versions
> Made via sync_versions.yml

Co-authored-by: GitHub Action action@github.com <GitHub Action action@github.com>
2024-03-28 17:43:20 +00:00
Anthony Stirling
08e43cc89c fix #986 and #989 2024-03-28 17:09:21 +00:00
NicolasFR
fb1baaa275 fix: Fix package name of openjdk for debian (#990) 2024-03-28 16:53:54 +00:00
CocoMaster-AI
eda838d6f8 feat: Extract translation text from html and finished the mainly translation of zh_CN, zh_TW, ja_JP file (#987)
* feat: translate zh_cn properties

* feat: adjust some description messages_zh_CN.properties

* feat: translate zh_TW file done

* feat: zh_CN semantic optimization

* feat: Supplementary ja_JP translation

* feat: extract rest text

* feat: Sync to all lang.properties

* feat: translate zh_CN, zh_TW, ja_JP file

* fix: small bug

---------

Co-authored-by: yanyu_lin <yanyu_lin@bestsign.cn>
2024-03-28 16:53:39 +00:00
Anthony Stirling
2fff3083ae Update TextFinder.java (#980) 2024-03-26 19:25:16 +00:00
tkymmm
7e2d58b3e8 Update messages_ja_JP.properties (#975) 2024-03-26 06:55:51 +00:00
NeilJared
31ec385282 Update messages_es_ES.properties (#969)
Updated es_ES translation (100% done)
2024-03-25 19:07:53 +00:00
Anthony Stirling
14ef7c0a72 dummy commit (#968)
Update README.md
2024-03-24 10:16:14 +00:00
Anthony Stirling
c9331afeac github bug 2024-03-22 20:15:53 +00:00
Anthony Stirling
09cb92e235 github bug 2024-03-22 20:15:42 +00:00
Anthony Stirling
6bd6e6563b Update Chart.yaml 2024-03-22 20:01:37 +00:00
Anthony Stirling
3c08c20426 Update build.gradle 2024-03-22 19:57:43 +00:00
Anthony Stirling
3800e3e465 Update view-pdf.html 2024-03-22 18:15:10 +00:00
github-actions[bot]
e2bd73dbf3 Update 3rd Party Licenses (#966)
Signed-off-by: GitHub Action <action@github.com>
Co-authored-by: GitHub Action <action@github.com>
2024-03-21 21:42:34 +00:00
github-actions[bot]
a20c3018ae Update 3rd Party Licenses (#965)
Signed-off-by: GitHub Action <action@github.com>
Co-authored-by: GitHub Action <action@github.com>
2024-03-21 21:41:09 +00:00
dependabot[bot]
7f17b33859 Bump org.apache.pdfbox:pdfbox from 3.0.1 to 3.0.2 (#963)
Bumps org.apache.pdfbox:pdfbox from 3.0.1 to 3.0.2.

---
updated-dependencies:
- dependency-name: org.apache.pdfbox:pdfbox
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 21:40:59 +00:00
dependabot[bot]
029937a1c5 Bump org.springframework.boot:spring-boot-starter-test from 3.2.3 to 3.2.4 (#961)
Bump org.springframework.boot:spring-boot-starter-test

Bumps [org.springframework.boot:spring-boot-starter-test](https://github.com/spring-projects/spring-boot) from 3.2.3 to 3.2.4.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.2.3...v3.2.4)

---
updated-dependencies:
- dependency-name: org.springframework.boot:spring-boot-starter-test
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 21:24:20 +00:00
dependabot[bot]
cfcf02708c Bump org.springframework.boot from 3.2.3 to 3.2.4 (#962)
Bumps [org.springframework.boot](https://github.com/spring-projects/spring-boot) from 3.2.3 to 3.2.4.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.2.3...v3.2.4)

---
updated-dependencies:
- dependency-name: org.springframework.boot
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 21:24:15 +00:00
dependabot[bot]
c1724ef74c Bump org.springdoc:springdoc-openapi-starter-webmvc-ui from 2.2.0 to 2.4.0 (#964)
Bump org.springdoc:springdoc-openapi-starter-webmvc-ui

Bumps [org.springdoc:springdoc-openapi-starter-webmvc-ui](https://github.com/springdoc/springdoc-openapi) from 2.2.0 to 2.4.0.
- [Release notes](https://github.com/springdoc/springdoc-openapi/releases)
- [Changelog](https://github.com/springdoc/springdoc-openapi/blob/main/CHANGELOG.md)
- [Commits](https://github.com/springdoc/springdoc-openapi/compare/v2.2.0...v2.4.0)

---
updated-dependencies:
- dependency-name: org.springdoc:springdoc-openapi-starter-webmvc-ui
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 21:24:06 +00:00
github-actions[bot]
3c53f97c36 Update 3rd Party Licenses (#960)
Signed-off-by: GitHub Action <action@github.com>
Co-authored-by: GitHub Action <action@github.com>
2024-03-21 21:17:53 +00:00
dependabot[bot]
aa895d10ac Bump org.springframework.boot:spring-boot-starter-thymeleaf from 3.2.3 to 3.2.4 (#954)
Bump org.springframework.boot:spring-boot-starter-thymeleaf

Bumps [org.springframework.boot:spring-boot-starter-thymeleaf](https://github.com/spring-projects/spring-boot) from 3.2.3 to 3.2.4.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.2.3...v3.2.4)

---
updated-dependencies:
- dependency-name: org.springframework.boot:spring-boot-starter-thymeleaf
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 21:13:55 +00:00
dependabot[bot]
6c603618ce Bump org.springframework.boot:spring-boot-starter-security from 3.2.3 to 3.2.4 (#956)
Bump org.springframework.boot:spring-boot-starter-security

Bumps [org.springframework.boot:spring-boot-starter-security](https://github.com/spring-projects/spring-boot) from 3.2.3 to 3.2.4.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.2.3...v3.2.4)

---
updated-dependencies:
- dependency-name: org.springframework.boot:spring-boot-starter-security
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 21:12:33 +00:00
dependabot[bot]
78aa0d4c61 Bump org.springframework.boot:spring-boot-starter-data-jpa from 3.2.3 to 3.2.4 (#953)
Bump org.springframework.boot:spring-boot-starter-data-jpa

Bumps [org.springframework.boot:spring-boot-starter-data-jpa](https://github.com/spring-projects/spring-boot) from 3.2.3 to 3.2.4.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.2.3...v3.2.4)

---
updated-dependencies:
- dependency-name: org.springframework.boot:spring-boot-starter-data-jpa
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 21:10:56 +00:00
dependabot[bot]
da3fc72e5c Bump org.projectlombok:lombok from 1.18.28 to 1.18.32 (#955)
Bumps [org.projectlombok:lombok](https://github.com/projectlombok/lombok) from 1.18.28 to 1.18.32.
- [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown)
- [Commits](https://github.com/projectlombok/lombok/compare/v1.18.28...v1.18.32)

---
updated-dependencies:
- dependency-name: org.projectlombok:lombok
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 21:09:30 +00:00
dependabot[bot]
a800766cb8 Bump org.commonmark:commonmark from 0.21.0 to 0.22.0 (#957)
Bumps [org.commonmark:commonmark](https://github.com/commonmark/commonmark-java) from 0.21.0 to 0.22.0.
- [Release notes](https://github.com/commonmark/commonmark-java/releases)
- [Changelog](https://github.com/commonmark/commonmark-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/commonmark/commonmark-java/compare/commonmark-parent-0.21.0...commonmark-parent-0.22.0)

---
updated-dependencies:
- dependency-name: org.commonmark:commonmark
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 21:08:00 +00:00
Ludy
67a1529dc7 Change to html5 (#958)
* Change to html5

with Nu Html Checker

* Update scale-pages.html

* Update sign.html

* Update common.html

* Update common.html

* Update login.html
2024-03-21 20:58:01 +00:00
github-actions[bot]
77354f47bf Update 3rd Party Licenses (#952)
Signed-off-by: GitHub Action <action@github.com>
Co-authored-by: GitHub Action <action@github.com>
2024-03-21 20:12:47 +00:00
dependabot[bot]
49ea07fd13 Bump io.github.pixee:java-security-toolkit from 1.1.2 to 1.1.3 (#946)
Bumps [io.github.pixee:java-security-toolkit](https://github.com/pixee/java-security-toolkit) from 1.1.2 to 1.1.3.
- [Release notes](https://github.com/pixee/java-security-toolkit/releases)
- [Commits](https://github.com/pixee/java-security-toolkit/compare/v1.1.2...v1.1.3)

---
updated-dependencies:
- dependency-name: io.github.pixee:java-security-toolkit
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 20:09:55 +00:00
dependabot[bot]
bb69c67b52 Bump org.springframework.boot:spring-boot-starter-actuator from 3.2.3 to 3.2.4 (#950)
Bump org.springframework.boot:spring-boot-starter-actuator

Bumps [org.springframework.boot:spring-boot-starter-actuator](https://github.com/spring-projects/spring-boot) from 3.2.3 to 3.2.4.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.2.3...v3.2.4)

---
updated-dependencies:
- dependency-name: org.springframework.boot:spring-boot-starter-actuator
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 20:09:37 +00:00
dependabot[bot]
6b29c28e2e Bump org.springframework.boot:spring-boot-devtools from 3.2.3 to 3.2.4 (#949)
Bumps [org.springframework.boot:spring-boot-devtools](https://github.com/spring-projects/spring-boot) from 3.2.3 to 3.2.4.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.2.3...v3.2.4)

---
updated-dependencies:
- dependency-name: org.springframework.boot:spring-boot-devtools
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 20:09:32 +00:00
dependabot[bot]
ba0fe43f31 Bump org.springframework.boot:spring-boot-starter-web from 3.2.3 to 3.2.4 (#948)
Bump org.springframework.boot:spring-boot-starter-web

Bumps [org.springframework.boot:spring-boot-starter-web](https://github.com/spring-projects/spring-boot) from 3.2.3 to 3.2.4.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.2.3...v3.2.4)

---
updated-dependencies:
- dependency-name: org.springframework.boot:spring-boot-starter-web
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 20:09:23 +00:00
dependabot[bot]
e54597f108 Bump com.github.jk1.dependency-license-report from 2.5 to 2.6 (#932)
Bumps com.github.jk1.dependency-license-report from 2.5 to 2.6.

---
updated-dependencies:
- dependency-name: com.github.jk1.dependency-license-report
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 20:09:10 +00:00
dependabot[bot]
9809ad9d7b Bump io.micrometer:micrometer-core from 1.12.3 to 1.12.4 (#930)
Bumps [io.micrometer:micrometer-core](https://github.com/micrometer-metrics/micrometer) from 1.12.3 to 1.12.4.
- [Release notes](https://github.com/micrometer-metrics/micrometer/releases)
- [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.12.3...v1.12.4)

---
updated-dependencies:
- dependency-name: io.micrometer:micrometer-core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 19:36:45 +00:00
dependabot[bot]
1d4ad19acd Bump org.springframework:spring-webmvc from 6.1.4 to 6.1.5 (#934)
Bumps [org.springframework:spring-webmvc](https://github.com/spring-projects/spring-framework) from 6.1.4 to 6.1.5.
- [Release notes](https://github.com/spring-projects/spring-framework/releases)
- [Commits](https://github.com/spring-projects/spring-framework/compare/v6.1.4...v6.1.5)

---
updated-dependencies:
- dependency-name: org.springframework:spring-webmvc
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 19:36:12 +00:00
dependabot[bot]
2c24e754be Bump org.apache.pdfbox:xmpbox from 3.0.1 to 3.0.2 (#933)
Bumps org.apache.pdfbox:xmpbox from 3.0.1 to 3.0.2.

---
updated-dependencies:
- dependency-name: org.apache.pdfbox:xmpbox
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 19:35:55 +00:00
albanobattistella
4a3326a560 Update messages_it_IT.properties (#927) 2024-03-17 14:24:07 +00:00
Ludy
24862e2d4a changes characters in multiple languages - Unicode ascii (#925)
* unicode to readable font

* Update messages_de_DE.properties
2024-03-17 11:09:55 +00:00
Ludy
51bb26ae34 Fix: Error after logging out and selecting another language (#924)
Fix exception url after logout
2024-03-17 09:57:17 +00:00
Anthony Stirling
f474651f36 lang, save to browser (#923) 2024-03-17 09:33:05 +00:00
tongkl1
11193b1b6d Fix typo in example yaml file (#922) 2024-03-16 09:49:28 +00:00
github-actions[bot]
3066b3e500 Update 3rd Party Licenses (#919)
Signed-off-by: GitHub Action <action@github.com>
Co-authored-by: GitHub Action <action@github.com>
2024-03-14 23:00:38 +00:00
dependabot[bot]
217f112bc4 Bump com.google.zxing:core from 3.5.2 to 3.5.3 (#779)
Bumps [com.google.zxing:core](https://github.com/zxing/zxing) from 3.5.2 to 3.5.3.
- [Release notes](https://github.com/zxing/zxing/releases)
- [Changelog](https://github.com/zxing/zxing/blob/master/CHANGES)
- [Commits](https://github.com/zxing/zxing/compare/zxing-3.5.2...zxing-3.5.3)

---
updated-dependencies:
- dependency-name: com.google.zxing:core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2024-03-14 22:59:27 +00:00
github-actions[bot]
e1bb0cf5ec Update 3rd Party Licenses (#914)
Signed-off-by: GitHub Action <action@github.com>
Co-authored-by: GitHub Action <action@github.com>
2024-03-13 22:45:32 +00:00
Anthony Stirling
3930c25a75 Frooodle patch 2 (#913)
* Update licenses-update.yml

* Update build.gradle
2024-03-13 22:34:24 +00:00
Anthony Stirling
b27e79cb52 Update build.gradle (#912) 2024-03-13 22:29:55 +00:00
Anthony Stirling
daf6486b86 Update licenses-update.yml (#911) 2024-03-13 22:26:39 +00:00
Ludy
1af41f8ea5 🔨 add Developer tools/scripts (#828)
* 🔨 add Developer tools

* Update downloader.js

* Update game.js

* Update .pre-commit-config.yaml

* Update sync_versions.yml

* removed: mixed line ending tool

* Update swagger.yml

* Update push-docker.yml

* Update build.yml

---------

Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2024-03-13 22:18:15 +00:00
Listiges Känguru
70e4ac21df Update messages_de_DE.properties (#903)
Added missing translations, improved some existing translations.
2024-03-13 22:11:43 +00:00
Anthony Stirling
95d9d85ca2 dep bumps and nonroot bypass (#910)
* dep bumps and nonroot bypass

* log changing
2024-03-13 22:09:56 +00:00
Ludy
9cc7a49d12 Enforcing Username Uniqueness (#906)
* Enforcing Username Uniqueness

Changes in UserService.java:

Added a new method findByUsername to allow searching for usernames regardless of case sensitivity.
Added a new method isUsernameValid to validate the username.
Changes in UserController.java:

Updated the changeUsername method to ensure the new username is valid before changing it.
Updated the editUser method to ensure the new username is unique and valid.
Changes in UserRepository.java:

Added a custom JPQL query to search for usernames regardless of case sensitivity.
Changes in HTML templates (account.html and addUsers.html):

Error messages are displayed if a username is invalid or already exists.

* JPAs auto
2024-03-13 22:09:16 +00:00
Anthony Stirling
ae73595335 Number of fixes and making pipline LIVE ! (#907)
Closes #889 and #332
#710
#901
#885
2024-03-13 19:15:10 +00:00
pavedroad
ac620082ec chore: fix some typos (#900)
Signed-off-by: pavedroad <qcqs@outlook.com>
2024-03-12 19:42:15 -04:00
Anthony Stirling
1e4134c7d1 Number fxes (#898)
* init

* user and pass to just pass lang update

* session management fixes and avoid demo user locking

* fix for UMASK and extract cleanups

* fixes for user #889 and #332

* increase session count for demo site

* fix

* gcc

* formatting

* number fixes init

* || true test

* version bump

* Hardening suggestions for Stirling-PDF / numberFxes (#899)

Switch order of literals to prevent NullPointerException

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

---------

Co-authored-by: pixeebot[bot] <104101892+pixeebot[bot]@users.noreply.github.com>
2024-03-10 14:00:00 +00:00
211 changed files with 8213 additions and 4244 deletions

51
.github/scripts/check_duplicates.py vendored Normal file
View File

@@ -0,0 +1,51 @@
import sys
def find_duplicate_keys(file_path):
"""
Finds duplicate keys in a properties file and returns their occurrences.
This function reads a properties file, identifies any keys that occur more than
once, and returns a dictionary with these keys and the line numbers of their occurrences.
Parameters:
file_path (str): The path to the properties file to be checked.
Returns:
dict: A dictionary where each key is a duplicated key in the file, and the value is a list
of line numbers where the key occurs.
"""
with open(file_path, "r", encoding="utf-8") as file:
lines = file.readlines()
keys = {}
duplicates = {}
for line_number, line in enumerate(lines, start=1):
line = line.strip()
if line and not line.startswith("#") and "=" in line:
key = line.split("=", 1)[0].strip()
if key in keys:
# If the key already exists, add the current line number
duplicates.setdefault(key, []).append(line_number)
# Also add the first instance of the key if not already done
if keys[key] not in duplicates[key]:
duplicates[key].insert(0, keys[key])
else:
# Store the line number of the first instance of the key
keys[key] = line_number
return duplicates
if __name__ == "__main__":
failed = False
for ar in sys.argv[1:]:
duplicates = find_duplicate_keys(ar)
if duplicates:
for key, lines in duplicates.items():
lines_str = ", ".join(map(str, lines))
print(f"{key} duplicated in {ar} on lines {lines_str}")
failed = True
if failed:
sys.exit(1)

84
.github/scripts/check_tabulator.py vendored Normal file
View File

@@ -0,0 +1,84 @@
"""check_tabulator.py"""
import argparse
import sys
def check_tabs(file_path):
"""
Checks for tabs in the specified file.
Args:
file_path (str): The path to the file to be checked.
Returns:
bool: True if tabs are found, False otherwise.
"""
with open(file_path, "r", encoding="utf-8") as file:
content = file.read()
if "\t" in content:
print(f"Tab found in {file_path}")
return True
return False
def replace_tabs_with_spaces(file_path, replace_with=" "):
"""
Replaces tabs with a specified number of spaces in the file.
Args:
file_path (str): The path to the file where tabs will be replaced.
replace_with (str): The character(s) to replace tabs with. Defaults to two spaces.
"""
with open(file_path, "r", encoding="utf-8") as file:
content = file.read()
updated_content = content.replace("\t", replace_with)
with open(file_path, "w", encoding="utf-8") as file:
file.write(updated_content)
def main():
"""
Main function to replace tabs with spaces in the provided files.
The replacement character and files to check are taken from command line arguments.
"""
# Create ArgumentParser instance
parser = argparse.ArgumentParser(
description="Replace tabs in files with specified characters."
)
# Define optional argument `--replace_with`
parser.add_argument(
"--replace_with",
default=" ",
help="Character(s) to replace tabs with. Default is two spaces.",
)
# Define argument for file paths
parser.add_argument("files", metavar="FILE", nargs="+", help="Files to process.")
# Parse arguments
args = parser.parse_args()
# Extract replacement characters and files from the parsed arguments
replace_with = args.replace_with
files_checked = args.files
error = False
for file_path in files_checked:
if check_tabs(file_path):
replace_tabs_with_spaces(file_path, replace_with)
error = True
if error:
print("Error: Originally found tabs in HTML files, now replaced.")
sys.exit(1)
sys.exit(0)
if __name__ == "__main__":
main()

67
.github/scripts/gradle_to_chart.py vendored Normal file
View File

@@ -0,0 +1,67 @@
import re
import yaml
# Paths to the files
chart_yaml_path = "chart/stirling-pdf/Chart.yaml"
gradle_path = "build.gradle"
def get_chart_version(path):
"""
Reads the appVersion from Chart.yaml.
Args:
path (str): The file path to the Chart.yaml.
Returns:
str: The appVersion if found, otherwise an empty string.
"""
with open(path, encoding="utf-8") as file:
chart_yaml = yaml.safe_load(file)
return chart_yaml.get("appVersion", "")
def get_gradle_version(path):
"""
Extracts the version from build.gradle.
Args:
path (str): The file path to the build.gradle.
Returns:
str: The version if found, otherwise an empty string.
"""
with open(path, encoding="utf-8") as file:
for line in file:
if "version =" in line:
# Extracts the value after 'version ='
return re.search(r'version\s*=\s*[\'"](.+?)[\'"]', line).group(1)
return ""
def update_chart_version(path, new_version):
"""
Updates the appVersion in Chart.yaml with a new version.
Args:
path (str): The file path to the Chart.yaml.
new_version (str): The new version to update to.
"""
with open(path, encoding="utf-8") as file:
chart_yaml = yaml.safe_load(file)
chart_yaml["appVersion"] = new_version
with open(path, "w", encoding="utf-8") as file:
yaml.safe_dump(chart_yaml, file)
# Main logic
chart_version = get_chart_version(chart_yaml_path)
gradle_version = get_gradle_version(gradle_path)
if chart_version != gradle_version:
print(
f"Versions do not match. Updating Chart.yaml from {chart_version} to {gradle_version}."
)
update_chart_version(chart_yaml_path, gradle_version)
else:
print("Versions match. No update required.")

View File

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

View File

@@ -5,7 +5,7 @@ on:
branches: branches:
- main - main
paths: paths:
- 'build.gradle' - "build.gradle"
permissions: permissions:
contents: write contents: write
@@ -17,13 +17,15 @@ jobs:
steps: steps:
- name: Check out code - name: Check out code
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Set up JDK 17 - name: Set up JDK 17
uses: actions/setup-java@v3 uses: actions/setup-java@v4
with: with:
java-version: '17' java-version: "17"
distribution: 'adopt' distribution: "adopt"
- uses: gradle/actions/setup-gradle@v3
- name: Run Gradle Command - name: Run Gradle Command
run: ./gradlew clean generateLicenseReport run: ./gradlew clean generateLicenseReport
@@ -32,17 +34,29 @@ jobs:
run: | run: |
mv build/reports/dependency-license/index.json src/main/resources/static/3rdPartyLicenses.json mv build/reports/dependency-license/index.json src/main/resources/static/3rdPartyLicenses.json
- name: Check for Changes - name: Set up git config
id: git-check 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: | run: |
git add src/main/resources/static/3rdPartyLicenses.json git add src/main/resources/static/3rdPartyLicenses.json
git diff --staged --exit-code || echo "changes=true" >> $GITHUB_ENV git diff --staged --quiet || echo "CHANGES_DETECTED=true" >> $GITHUB_ENV
- name: Commit and Push Changes
if: env.changes == 'true'
run: |
git config --global user.name 'Stirling-PDF-Bot'
git config --global user.email 'Stirling-PDF-Bot@stirlingtools.com'
git commit -m "Update 3rd Party Licenses"
git push
- name: Create Pull Request
if: env.CHANGES_DETECTED == 'true'
uses: peter-evans/create-pull-request@v6
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "Update 3rd Party Licenses"
committer: GitHub Action <action@github.com>
author: GitHub Action <action@github.com>
signoff: true
branch: update-3rd-party-licenses
title: "Update 3rd Party Licenses"
body: |
Auto-generated by [create-pull-request][1]
[1]: https://github.com/peter-evans/create-pull-request
draft: false
delete-branch: true

View File

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

View File

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

View File

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

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

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

View File

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

37
.pre-commit-config.yaml Normal file
View File

@@ -0,0 +1,37 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.2.1
hooks:
- id: ruff
args:
- --fix
- --line-length=127
files: ^((.github/scripts)/.+)?[^/]+\.py$
- id: ruff-format
files: ^((.github/scripts)/.+)?[^/]+\.py$
- repo: https://github.com/codespell-project/codespell
rev: v2.2.6
hooks:
- id: codespell
args:
- --ignore-words-list=
- --skip="./.*,*.csv,*.json,*.ambr"
- --quiet-level=2
files: \.(properties|html|css|js|py|md)$
exclude: (.vscode|.devcontainer|src/main/resources|Dockerfile)
- repo: local
hooks:
- id: check-duplicate-properties-keys
name: Check Duplicate Properties Keys
entry: python .github/scripts/check_duplicates.py
language: python
files: ^(src)/.+\.properties$
- repo: local
hooks:
- id: check-html-tabs
name: Check HTML for tabs
# args: ["--replace_with= "]
entry: python .github/scripts/check_tabulator.py
language: python
exclude: ^src/main/resources/static/pdfjs/
files: ^.*(\.html|\.css|\.js)$

View File

@@ -1,5 +1,5 @@
# Main stage # Main stage
FROM alpine:3.19.1 FROM alpine:20240329
# Copy necessary files # Copy necessary files
COPY scripts /scripts 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 && \ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories && \
echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/community" | tee -a /etc/apk/repositories && \ echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/community" | tee -a /etc/apk/repositories && \
echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories && \ echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories && \
apk update && \
apk add --no-cache \ apk add --no-cache \
ca-certificates \ ca-certificates \
tzdata \ tzdata \
tini \ tini \
openssl \
openssl-dev \
bash \ bash \
curl \ curl \
openjdk17-jre \ openjdk17-jre \
@@ -36,6 +39,8 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et
shadow \ shadow \
# Doc conversion # Doc conversion
libreoffice@testing \ libreoffice@testing \
# pdftohtml
poppler-utils \
# OCR MY PDF (unpaper for descew and other advanced featues) # OCR MY PDF (unpaper for descew and other advanced featues)
ocrmypdf \ ocrmypdf \
tesseract-ocr-data-eng \ tesseract-ocr-data-eng \
@@ -54,7 +59,9 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et
# User permissions # User permissions
addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \ addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \
chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \ chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \
chown stirlingpdfuser:stirlingpdfgroup /app.jar chown stirlingpdfuser:stirlingpdfgroup /app.jar && \
tesseract --list-langs && \
rm -rf /var/cache/apk/*
EXPOSE 8080 EXPOSE 8080

View File

@@ -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"]

View File

@@ -1,13 +1,5 @@
## User Guide for Local Directory Scanning and File Processing ## User Guide for Local Directory Scanning and File Processing
### Whilst Pipelines are in alpha...
You must enable this alpha functionality by setting
```yaml
system:
enableAlphaFunctionality: true
```
To true like in the above for your `/config/settings.yml` file, after restarting Stirling-PDF you should see both UI and folder scanning enabled.
### Setting Up Watched Folders: ### Setting Up Watched Folders:
- Create a folder where you want your files to be monitored. This is your 'watched folder'. - Create a folder where you want your files to be monitored. This is your 'watched folder'.
- The default directory for this is `./pipeline/watchedFolders/` - The default directory for this is `./pipeline/watchedFolders/`

View File

@@ -3,7 +3,7 @@
This document provides instructions on how to add additional language packs for the OCR tab in Stirling-PDF, both inside and outside of Docker. This document provides instructions on how to add additional language packs for the OCR tab in Stirling-PDF, both inside and outside of Docker.
## My OCR used to work and now doesn't! ## My OCR used to work and now doesn't!
The paths have changed for the tessadata locations on new docker images, please use ``/usr/share/tessdata`` (Others should still work for backwards compatability but might not) The paths have changed for the tessadata locations on new docker images, please use ``/usr/share/tessdata`` (Others should still work for backwards compatibility but might not)
## How does the OCR Work ## How does the OCR Work
Stirling-PDF uses [OCRmyPDF](https://github.com/ocrmypdf/OCRmyPDF) which in turn uses tesseract for its text recognition. Stirling-PDF uses [OCRmyPDF](https://github.com/ocrmypdf/OCRmyPDF) which in turn uses tesseract for its text recognition.

View File

@@ -42,7 +42,7 @@ For Debian-based systems, you can use the following command:
```bash ```bash
sudo apt-get update sudo apt-get update
sudo apt-get install -y git automake autoconf libtool libleptonica-dev pkg-config zlib1g-dev make g++ java-17-openjdk python3 python3-pip sudo apt-get install -y git automake autoconf libtool libleptonica-dev pkg-config zlib1g-dev make g++ openjdk-17-jdk python3 python3-pip
``` ```
For Fedora-based systems use this command: For Fedora-based systems use this command:
@@ -95,7 +95,7 @@ For Debian-based systems, you can use the following command:
```bash ```bash
sudo apt-get install -y libreoffice-writer libreoffice-calc libreoffice-impress unpaper ocrmypdf 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: For Fedora:

View File

@@ -1,13 +1,6 @@
# Pipeline Configuration and Usage Tutorial # Pipeline Configuration and Usage Tutorial
- Configure the pipeline config file and input files to run files against it
## Whilst Pipelines are in alpha... - For reuse, download the config file and re-upload it when needed, or place it in /pipeline/defaultWebUIConfigs/ to auto-load in the web UI for all users
You must enable this alpha functionality by setting
```yaml
system:
enableAlphaFunctionality: true
```
To true like in the above for your `/config/settings.yml` file, after restarting Stirling-PDF you should see both UI and folder scanning enabled.
## Steps to Configure and Use Your Pipeline ## Steps to Configure and Use Your Pipeline
@@ -40,3 +33,12 @@ To true like in the above for your `/config/settings.yml` file, after restarting
10. **Note on Web UI Limitations** 10. **Note on Web UI Limitations**
- The current web UI version does not support operations that require multiple different types of inputs, such as adding a separate image to a PDF. - The current web UI version does not support operations that require multiple different types of inputs, such as adding a separate image to a PDF.
### Current Limitations
- Cannot have more than one of the same operation
- Cannot input additional files via UI
- All files and operations run in serial mode

107
README.md
View File

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

View File

@@ -1,64 +1,52 @@
|Technology | Ultra-Lite | Lite | Full | | Technology | Ultra-Lite | Full |
|----------------|:----------:|:----:|:----:| |----------------|:----------:|:----:|
| Java | ✔️ | ✔️ | ✔️ | | Java | ✔️ | ✔️ |
| JavaScript | ✔️ | ✔️ | ✔️ | | JavaScript | ✔️ | ✔️ |
| Libre | | ✔️ | ✔️ | | Libre | | ✔️ |
| Python | | | ✔️ | | Python | | ✔️ |
| OpenCV | | | ✔️ | | OpenCV | | ✔️ |
| OCRmyPDF | | | ✔️ | | OCRmyPDF | | ✔️ |
Operation | Ultra-Lite | Full
-------------------------|------------|-----
add-page-numbers | ✔️ | ✔️
add-password | ✔️ | ✔️
Operation | Ultra-Lite | Lite | Full add-image | ✔️ | ✔️
--------------------|------------|------|----- add-watermark | ✔️ | ✔️
add-page-numbers | ✔️ | ✔️ | ✔️ adjust-contrast | ✔️ | ✔️
add-password | ✔️ | ✔️ | ✔️ auto-split-pdf | ✔️ | ✔️
add-image | ✔️ | ✔️ | ✔️ auto-redact | ✔️ | ✔️
add-watermark | ✔️ | ✔️ | ✔️ auto-rename | ✔️ | ✔️
adjust-contrast | ✔️ | ✔️ | ✔️ cert-sign | ✔️ | ✔️
auto-split-pdf | ✔️ | ✔️ | ✔️ crop | ✔️ | ✔️
auto-redact | ✔️ | ✔️ | ✔️ change-metadata | ✔️ | ✔️
auto-rename | ✔️ | ✔️ | ✔️ change-permissions | ✔️ | ✔️
cert-sign | ✔️ | ✔️ | ✔️ compare | ✔️ | ✔️
crop | ✔️ | ✔️ | ✔️ extract-page | ✔️ | ✔️
change-metadata | ✔️ | ✔️ | ✔️ extract-images | ✔️ | ✔️
change-permissions | ✔️ | ✔️ | ✔️ flatten | ✔️ | ✔️
compare | ✔️ | ✔️ | ✔️ get-info-on-pdf | ✔️ | ✔️
extract-page | ✔️ | ✔️ | ✔️ img-to-pdf | ✔️ | ✔️
extract-images | ✔️ | ✔️ | ✔️ markdown-to-pdf | ✔️ | ✔️
flatten | ✔️ | ✔️ | ✔️ merge-pdfs | ✔️ | ✔️
get-info-on-pdf | ✔️ | ✔️ | ✔️ multi-page-layout | ✔️ | ✔️
img-to-pdf | ✔️ | ✔️ | ✔️ overlay-pdf | ✔️ | ✔️
markdown-to-pdf | ✔️ | ✔️ | ✔️ pdf-organizer | ✔️ | ✔️
merge-pdfs | ✔️ | ✔️ | ✔️ pdf-to-csv | ✔️ | ✔️
multi-page-layout | ✔️ | ✔️ | ✔️ pdf-to-img | ✔️ | ✔️
overlay-pdf | ✔️ | ✔️ | ✔️ pdf-to-single-page | ✔️ | ✔️
pdf-organizer | ✔️ | ✔️ | ✔️ remove-pages | ✔️ | ✔️
pdf-to-csv | ✔️ | ✔️ | ✔️ remove-password | ✔️ | ✔️
pdf-to-img | ✔️ | ✔️ | ✔️ rotate-pdf | ✔️ | ✔️
pdf-to-single-page | ✔️ | ✔️ | ✔️ sanitize-pdf | ✔️ | ✔️
remove-pages | ✔️ | ✔️ | ✔️ scale-pages | ✔️ | ✔️
remove-password | ✔️ | ✔️ | ✔️ sign | ✔️ | ✔️
rotate-pdf | ✔️ | ✔️ | ✔️ show-javascript | ✔️ | ✔️
sanitize-pdf | ✔️ | ✔️ | ✔️ split-by-size-or-count | ✔️ | ✔️
scale-pages | ✔️ | ✔️ | ✔️ split-pdf-by-sections | ✔️ | ✔️
sign | ✔️ | ✔️ | ✔️ split-pdfs | ✔️ | ✔️
show-javascript | ✔️ | ✔️ | ✔️ compress-pdf | | ✔️
split-by-size-or-count | ✔️ | ✔️ | ✔️ extract-image-scans | | ✔️
split-pdf-by-sections | ✔️ | ✔️ | ✔️ ocr-pdf | | ✔️
split-pdfs | ✔️ | ✔️ | ✔️ pdf-to-pdfa | | ✔️
file-to-pdf | | ✔️ | ✔️ remove-blanks | | ✔️
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 | | | ✔️

View File

@@ -1,18 +1,18 @@
plugins { plugins {
id 'java' id 'java'
id 'org.springframework.boot' version '3.2.2' id 'org.springframework.boot' version '3.2.4'
id 'io.spring.dependency-management' version '1.1.3' id 'io.spring.dependency-management' version '1.1.3'
id 'org.springdoc.openapi-gradle-plugin' version '1.8.0' id 'org.springdoc.openapi-gradle-plugin' version '1.8.0'
id "io.swagger.swaggerhub" version "1.3.2" id "io.swagger.swaggerhub" version "1.3.2"
id 'edu.sc.seis.launch4j' version '3.0.5' id 'edu.sc.seis.launch4j' version '3.0.5'
id 'com.diffplug.spotless' version '6.25.0' id 'com.diffplug.spotless' version '6.25.0'
id 'com.github.jk1.dependency-license-report' version '2.5' id 'com.github.jk1.dependency-license-report' version '2.6'
} }
import com.github.jk1.license.render.* import com.github.jk1.license.render.*
group = 'stirling.software' group = 'stirling.software'
version = '0.22.1' version = '0.23.0'
sourceCompatibility = '17' sourceCompatibility = '17'
repositories { repositories {
@@ -20,7 +20,6 @@ repositories {
} }
licenseReport { licenseReport {
renderers = [new JsonReportRenderer()] renderers = [new JsonReportRenderer()]
} }
@@ -48,7 +47,6 @@ openApi {
outputFileName = "SwaggerDoc.json" outputFileName = "SwaggerDoc.json"
} }
launch4j { launch4j {
icon = "${projectDir}/src/main/resources/static/favicon.ico" icon = "${projectDir}/src/main/resources/static/favicon.ico"
@@ -87,26 +85,26 @@ spotless {
dependencies { dependencies {
//security updates //security updates
implementation 'ch.qos.logback:logback-classic:1.4.14' implementation 'ch.qos.logback:logback-classic:1.5.3'
implementation 'ch.qos.logback:logback-core:1.4.14' implementation 'ch.qos.logback:logback-core:1.5.3'
implementation 'org.springframework:spring-webmvc:6.1.3' implementation 'org.springframework:spring-webmvc:6.1.5'
implementation("io.github.pixee:java-security-toolkit:1.1.2") implementation("io.github.pixee:java-security-toolkit:1.1.3")
implementation 'org.yaml:snakeyaml:2.2' implementation 'org.yaml:snakeyaml:2.2'
implementation 'org.springframework.boot:spring-boot-starter-web:3.2.2' implementation 'org.springframework.boot:spring-boot-starter-web:3.2.4'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.2.2' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.2.4'
if (System.getenv('DOCKER_ENABLE_SECURITY') != 'false') { if (System.getenv('DOCKER_ENABLE_SECURITY') != 'false') {
implementation 'org.springframework.boot:spring-boot-starter-security:3.2.2' implementation 'org.springframework.boot:spring-boot-starter-security:3.2.4'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.2.RELEASE' implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.2.RELEASE'
implementation "org.springframework.boot:spring-boot-starter-data-jpa:3.2.2" implementation "org.springframework.boot:spring-boot-starter-data-jpa:3.2.4"
//2.2.x requires rebuild of DB file.. need migration path //2.2.x requires rebuild of DB file.. need migration path
implementation "com.h2database:h2:2.1.214" implementation "com.h2database:h2:2.1.214"
} }
testImplementation 'org.springframework.boot:spring-boot-starter-test:3.2.2' testImplementation 'org.springframework.boot:spring-boot-starter-test:3.2.4'
// Batik // Batik
implementation 'org.apache.xmlgraphics:batik-all:1.17' implementation 'org.apache.xmlgraphics:batik-all:1.17'
@@ -139,28 +137,30 @@ dependencies {
exclude group: 'commons-logging', module: 'commons-logging' exclude group: 'commons-logging', module: 'commons-logging'
} }
implementation ('org.apache.pdfbox:pdfbox:3.0.1'){ implementation ('org.apache.pdfbox:pdfbox:3.0.2'){
exclude group: 'commons-logging', module: 'commons-logging' exclude group: 'commons-logging', module: 'commons-logging'
} }
implementation ('org.apache.pdfbox:xmpbox:3.0.1'){ implementation ('org.apache.pdfbox:xmpbox:3.0.2'){
exclude group: 'commons-logging', module: 'commons-logging' exclude group: 'commons-logging', module: 'commons-logging'
} }
implementation 'org.bouncycastle:bcprov-jdk18on:1.77' implementation 'org.bouncycastle:bcprov-jdk18on:1.77'
implementation 'org.bouncycastle:bcpkix-jdk18on:1.77' implementation 'org.bouncycastle:bcpkix-jdk18on:1.77'
implementation 'org.springframework.boot:spring-boot-starter-actuator:3.2.2' implementation 'org.springframework.boot:spring-boot-starter-actuator:3.2.4'
implementation 'io.micrometer:micrometer-core:1.12.3' implementation 'io.micrometer:micrometer-core:1.12.4'
implementation group: 'com.google.zxing', name: 'core', version: '3.5.2' implementation group: 'com.google.zxing', name: 'core', version: '3.5.3'
// https://mvnrepository.com/artifact/org.commonmark/commonmark // https://mvnrepository.com/artifact/org.commonmark/commonmark
implementation 'org.commonmark:commonmark:0.21.0' implementation 'org.commonmark:commonmark:0.22.0'
implementation 'org.commonmark:commonmark-ext-gfm-tables:0.21.0' implementation 'org.commonmark:commonmark-ext-gfm-tables:0.22.0'
// https://mvnrepository.com/artifact/com.github.vladimir-bukhtoyarov/bucket4j-core // https://mvnrepository.com/artifact/com.github.vladimir-bukhtoyarov/bucket4j-core
implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:7.6.0' implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:7.6.0'
developmentOnly("org.springframework.boot:spring-boot-devtools:3.2.2") implementation 'com.fathzer:javaluator:3.0.3'
compileOnly 'org.projectlombok:lombok:1.18.30'
annotationProcessor 'org.projectlombok:lombok:1.18.28' developmentOnly("org.springframework.boot:spring-boot-devtools:3.2.4")
compileOnly 'org.projectlombok:lombok:1.18.32'
annotationProcessor 'org.projectlombok:lombok:1.18.32'
} }
tasks.withType(JavaCompile) { tasks.withType(JavaCompile) {

View File

@@ -1,6 +1,7 @@
apiVersion: v2 apiVersion: v2
appVersion: 0.20.2 appVersion: 0.23.0
description: locally hosted web application that allows you to perform various operations on PDF files description: locally hosted web application that allows you to perform various operations
on PDF files
home: https://github.com/Stirling-Tools/Stirling-PDF home: https://github.com/Stirling-Tools/Stirling-PDF
keywords: keywords:
- stirling-pdf - stirling-pdf

View File

@@ -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

View File

@@ -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

View File

@@ -22,7 +22,7 @@ services:
DOCKER_ENABLE_SECURITY: "true" DOCKER_ENABLE_SECURITY: "true"
SECURITY_ENABLELOGIN: "true" SECURITY_ENABLELOGIN: "true"
PUID: 1002 PUID: 1002
GGID: 1002 PGID: 1002
UMASK: "022" UMASK: "022"
SYSTEM_DEFAULTLOCALE: en-US SYSTEM_DEFAULTLOCALE: en-US
UI_APPNAME: Stirling-PDF UI_APPNAME: Stirling-PDF

View File

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

BIN
images/stirling-home.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

View File

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

View File

@@ -14,8 +14,8 @@ if [ "$DOCKER_ENABLE_SECURITY" = "true" ] && [ "$VERSION_TAG" != "alpha" ]; then
if [ $? -eq 0 ]; then # checks if curl was successful if [ $? -eq 0 ]; then # checks if curl was successful
rm -f app.jar rm -f app.jar
ln -s app-security.jar app.jar ln -s app-security.jar app.jar
chown stirlingpdfuser:stirlingpdfgroup app.jar chown stirlingpdfuser:stirlingpdfgroup app.jar || true
chmod 755 app.jar chmod 755 app.jar || true
fi fi
fi fi
fi fi

View File

@@ -1,23 +1,34 @@
#!/bin/sh #!/bin/bash
# Update the user and group IDs as per environment variables # Update the user and group IDs as per environment variables
if [ ! -z "$PUID" ] && [ "$PUID" != "$(id -u stirlingpdfuser)" ]; then if [ ! -z "$PUID" ] && [ "$PUID" != "$(id -u stirlingpdfuser)" ]; then
usermod -o -u "$PUID" stirlingpdfuser usermod -o -u "$PUID" stirlingpdfuser || true
fi fi
if [ ! -z "$PGID" ] && [ "$PGID" != "$(getent group stirlingpdfgroup | cut -d: -f3)" ]; then if [ ! -z "$PGID" ] && [ "$PGID" != "$(getent group stirlingpdfgroup | cut -d: -f3)" ]; then
groupmod -o -g "$PGID" stirlingpdfgroup groupmod -o -g "$PGID" stirlingpdfgroup || true
fi fi
umask "$UMASK" umask "$UMASK" || true
echo "Setting permissions and ownership for necessary directories..."
chown -R stirlingpdfuser:stirlingpdfgroup $HOME /logs /scripts /usr/share/fonts/opentype/noto /usr/share/tessdata /configs /customFiles /pipeline /app.jar
chmod -R 755 /logs /scripts /usr/share/fonts/opentype/noto /usr/share/tessdata /configs /customFiles /pipeline /app.jar
if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" ]]; then if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" ]]; then
apk add --no-cache calibre@testing apk add --no-cache calibre@testing
fi fi
/scripts/download-security-jar.sh /scripts/download-security-jar.sh
# Run the main command if [[ -n "$LANGS" ]]; then
exec su-exec stirlingpdfuser "$@" /scripts/installFonts.sh $LANGS
fi
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 /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
echo "[WARN] Chown failed, running as host user"
exec "$@"
fi

View File

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

67
scripts/installFonts.sh Normal file
View File

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

View File

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

View File

@@ -6,6 +6,7 @@ import java.nio.file.Paths;
import java.util.Properties; import java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ClassPathResource;
@@ -85,4 +86,10 @@ public class AppConfig {
} }
return "true".equalsIgnoreCase(installOps); return "true".equalsIgnoreCase(installOps);
} }
@ConditionalOnMissingClass("stirling.software.SPDF.config.security.SecurityConfiguration")
@Bean(name = "activSecurity")
public boolean missingActivSecurity() {
return false;
}
} }

View File

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

View File

@@ -129,7 +129,7 @@ public class EndpointConfiguration {
addEndpointToGroup("Other", "sign"); addEndpointToGroup("Other", "sign");
addEndpointToGroup("Other", "flatten"); addEndpointToGroup("Other", "flatten");
addEndpointToGroup("Other", "repair"); addEndpointToGroup("Other", "repair");
addEndpointToGroup("Other", "remove-blanks"); addEndpointToGroup("Other", REMOVE_BLANKS);
addEndpointToGroup("Other", "remove-annotations"); addEndpointToGroup("Other", "remove-annotations");
addEndpointToGroup("Other", "compare"); addEndpointToGroup("Other", "compare");
addEndpointToGroup("Other", "add-page-numbers"); addEndpointToGroup("Other", "add-page-numbers");
@@ -146,7 +146,6 @@ public class EndpointConfiguration {
addEndpointToGroup("CLI", "xlsx-to-pdf"); addEndpointToGroup("CLI", "xlsx-to-pdf");
addEndpointToGroup("CLI", "pdf-to-word"); addEndpointToGroup("CLI", "pdf-to-word");
addEndpointToGroup("CLI", "pdf-to-presentation"); addEndpointToGroup("CLI", "pdf-to-presentation");
addEndpointToGroup("CLI", "pdf-to-text");
addEndpointToGroup("CLI", "pdf-to-html"); addEndpointToGroup("CLI", "pdf-to-html");
addEndpointToGroup("CLI", "pdf-to-xml"); addEndpointToGroup("CLI", "pdf-to-xml");
addEndpointToGroup("CLI", "ocr-pdf"); addEndpointToGroup("CLI", "ocr-pdf");
@@ -154,6 +153,7 @@ public class EndpointConfiguration {
addEndpointToGroup("CLI", "url-to-pdf"); addEndpointToGroup("CLI", "url-to-pdf");
addEndpointToGroup("CLI", "book-to-pdf"); addEndpointToGroup("CLI", "book-to-pdf");
addEndpointToGroup("CLI", "pdf-to-book"); addEndpointToGroup("CLI", "pdf-to-book");
addEndpointToGroup("CLI", "pdf-to-rtf");
// Calibre // Calibre
addEndpointToGroup("Calibre", "book-to-pdf"); addEndpointToGroup("Calibre", "book-to-pdf");
@@ -161,13 +161,13 @@ public class EndpointConfiguration {
// python // python
addEndpointToGroup("Python", "extract-image-scans"); addEndpointToGroup("Python", "extract-image-scans");
addEndpointToGroup("Python", "remove-blanks"); addEndpointToGroup("Python", REMOVE_BLANKS);
addEndpointToGroup("Python", "html-to-pdf"); addEndpointToGroup("Python", "html-to-pdf");
addEndpointToGroup("Python", "url-to-pdf"); addEndpointToGroup("Python", "url-to-pdf");
// openCV // openCV
addEndpointToGroup("OpenCV", "extract-image-scans"); addEndpointToGroup("OpenCV", "extract-image-scans");
addEndpointToGroup("OpenCV", "remove-blanks"); addEndpointToGroup("OpenCV", REMOVE_BLANKS);
// LibreOffice // LibreOffice
addEndpointToGroup("LibreOffice", "repair"); addEndpointToGroup("LibreOffice", "repair");
@@ -175,7 +175,7 @@ public class EndpointConfiguration {
addEndpointToGroup("LibreOffice", "xlsx-to-pdf"); addEndpointToGroup("LibreOffice", "xlsx-to-pdf");
addEndpointToGroup("LibreOffice", "pdf-to-word"); addEndpointToGroup("LibreOffice", "pdf-to-word");
addEndpointToGroup("LibreOffice", "pdf-to-presentation"); addEndpointToGroup("LibreOffice", "pdf-to-presentation");
addEndpointToGroup("LibreOffice", "pdf-to-text"); addEndpointToGroup("LibreOffice", "pdf-to-rtf");
addEndpointToGroup("LibreOffice", "pdf-to-html"); addEndpointToGroup("LibreOffice", "pdf-to-html");
addEndpointToGroup("LibreOffice", "pdf-to-xml"); addEndpointToGroup("LibreOffice", "pdf-to-xml");
@@ -217,7 +217,8 @@ public class EndpointConfiguration {
addEndpointToGroup("Java", "split-by-size-or-count"); addEndpointToGroup("Java", "split-by-size-or-count");
addEndpointToGroup("Java", "overlay-pdf"); addEndpointToGroup("Java", "overlay-pdf");
addEndpointToGroup("Java", "split-pdf-by-sections"); addEndpointToGroup("Java", "split-pdf-by-sections");
addEndpointToGroup("Java", "remove-blanks"); addEndpointToGroup("Java", REMOVE_BLANKS);
addEndpointToGroup("Java", "pdf-to-text");
// Javascript // Javascript
addEndpointToGroup("Javascript", "pdf-organizer"); addEndpointToGroup("Javascript", "pdf-organizer");
@@ -244,4 +245,6 @@ public class EndpointConfiguration {
} }
} }
} }
private static final String REMOVE_BLANKS = "remove-blanks";
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -82,7 +82,7 @@ public class UserAuthenticationFilter extends OncePerRequestFilter {
response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.getWriter() response.getWriter()
.write( .write(
"Authentication required. Please provide a X-API-KEY in request header.\nThis is found in Settings -> Account Settings -> API Key\nAlternativly you can disable authentication if this is unexpected"); "Authentication required. Please provide a X-API-KEY in request header.\nThis is found in Settings -> Account Settings -> API Key\nAlternatively you can disable authentication if this is unexpected");
return; return;
} }
} }

View File

@@ -62,7 +62,7 @@ public class UserService implements UserServiceInterface {
public User addApiKeyToUser(String username) { public User addApiKeyToUser(String username) {
User user = User user =
userRepository userRepository
.findByUsername(username) .findByUsernameIgnoreCase(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found")); .orElseThrow(() -> new UsernameNotFoundException("User not found"));
user.setApiKey(generateApiKey()); user.setApiKey(generateApiKey());
@@ -76,7 +76,7 @@ public class UserService implements UserServiceInterface {
public String getApiKeyForUser(String username) { public String getApiKeyForUser(String username) {
User user = User user =
userRepository userRepository
.findByUsername(username) .findByUsernameIgnoreCase(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found")); .orElseThrow(() -> new UsernameNotFoundException("User not found"));
return user.getApiKey(); return user.getApiKey();
} }
@@ -103,7 +103,7 @@ public class UserService implements UserServiceInterface {
} }
public boolean validateApiKeyForUser(String username, String apiKey) { public boolean validateApiKeyForUser(String username, String apiKey) {
Optional<User> userOpt = userRepository.findByUsername(username); Optional<User> userOpt = userRepository.findByUsernameIgnoreCase(username);
return userOpt.isPresent() && userOpt.get().getApiKey().equals(apiKey); return userOpt.isPresent() && userOpt.get().getApiKey().equals(apiKey);
} }
@@ -136,7 +136,7 @@ public class UserService implements UserServiceInterface {
} }
public void deleteUser(String username) { public void deleteUser(String username) {
Optional<User> userOpt = userRepository.findByUsername(username); Optional<User> userOpt = userRepository.findByUsernameIgnoreCase(username);
if (userOpt.isPresent()) { if (userOpt.isPresent()) {
for (Authority authority : userOpt.get().getAuthorities()) { for (Authority authority : userOpt.get().getAuthorities()) {
if (authority.getAuthority().equals(Role.INTERNAL_API_USER.getRoleId())) { if (authority.getAuthority().equals(Role.INTERNAL_API_USER.getRoleId())) {
@@ -151,12 +151,16 @@ public class UserService implements UserServiceInterface {
return userRepository.findByUsername(username).isPresent(); return userRepository.findByUsername(username).isPresent();
} }
public boolean usernameExistsIgnoreCase(String username) {
return userRepository.findByUsernameIgnoreCase(username).isPresent();
}
public boolean hasUsers() { public boolean hasUsers() {
return userRepository.count() > 0; return userRepository.count() > 0;
} }
public void updateUserSettings(String username, Map<String, String> updates) { public void updateUserSettings(String username, Map<String, String> updates) {
Optional<User> userOpt = userRepository.findByUsername(username); Optional<User> userOpt = userRepository.findByUsernameIgnoreCase(username);
if (userOpt.isPresent()) { if (userOpt.isPresent()) {
User user = userOpt.get(); User user = userOpt.get();
Map<String, String> settingsMap = user.getSettings(); Map<String, String> settingsMap = user.getSettings();
@@ -176,6 +180,10 @@ public class UserService implements UserServiceInterface {
return userRepository.findByUsername(username); return userRepository.findByUsername(username);
} }
public Optional<User> findByUsernameIgnoreCase(String username) {
return userRepository.findByUsernameIgnoreCase(username);
}
public void changeUsername(User user, String newUsername) { public void changeUsername(User user, String newUsername) {
user.setUsername(newUsername); user.setUsername(newUsername);
userRepository.save(user); userRepository.save(user);
@@ -194,4 +202,8 @@ public class UserService implements UserServiceInterface {
public boolean isPasswordCorrect(User user, String currentPassword) { public boolean isPasswordCorrect(User user, String currentPassword) {
return passwordEncoder.matches(currentPassword, user.getPassword()); return passwordEncoder.matches(currentPassword, user.getPassword());
} }
public boolean isUsernameValid(String username) {
return username.matches("[a-zA-Z0-9]+");
}
} }

View File

@@ -51,7 +51,7 @@ public class RearrangePagesPDFController {
String[] pageOrderArr = pagesToDelete.split(","); String[] pageOrderArr = pagesToDelete.split(",");
List<Integer> pagesToRemove = List<Integer> pagesToRemove =
GeneralUtils.parsePageList(pageOrderArr, document.getNumberOfPages(), true); GeneralUtils.parsePageList(pageOrderArr, document.getNumberOfPages(), false);
Collections.sort(pagesToRemove); Collections.sort(pagesToRemove);
@@ -195,7 +195,7 @@ public class RearrangePagesPDFController {
if (sortType != null && sortType.length() > 0) { if (sortType != null && sortType.length() > 0) {
newPageOrder = processSortTypes(sortType, totalPages); newPageOrder = processSortTypes(sortType, totalPages);
} else { } else {
newPageOrder = GeneralUtils.parsePageList(pageOrderArr, totalPages, true); newPageOrder = GeneralUtils.parsePageList(pageOrderArr, totalPages, false);
} }
logger.info("newPageOrder = " + newPageOrder); logger.info("newPageOrder = " + newPageOrder);
logger.info("totalPages = " + totalPages); logger.info("totalPages = " + totalPages);

View File

@@ -27,7 +27,9 @@ import io.github.pixee.security.Filenames;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.model.PdfMetadata;
import stirling.software.SPDF.model.api.PDFWithPageNums; import stirling.software.SPDF.model.api.PDFWithPageNums;
import stirling.software.SPDF.utils.PdfUtils;
import stirling.software.SPDF.utils.WebResponseUtils; import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@@ -49,12 +51,15 @@ public class SplitPDFController {
// open the pdf document // open the pdf document
PDDocument document = Loader.loadPDF(file.getBytes()); PDDocument document = Loader.loadPDF(file.getBytes());
PdfMetadata metadata = PdfUtils.extractMetadataFromPdf(document);
List<Integer> pageNumbers = request.getPageNumbersList(document, true); int totalPages = document.getNumberOfPages();
if (!pageNumbers.contains(document.getNumberOfPages() - 1)) { List<Integer> pageNumbers = request.getPageNumbersList(document, false);
System.out.println(
pageNumbers.stream().map(String::valueOf).collect(Collectors.joining(",")));
if (!pageNumbers.contains(totalPages - 1)) {
// Create a mutable ArrayList so we can add to it // Create a mutable ArrayList so we can add to it
pageNumbers = new ArrayList<>(pageNumbers); pageNumbers = new ArrayList<>(pageNumbers);
pageNumbers.add(document.getNumberOfPages() - 1); pageNumbers.add(totalPages - 1);
} }
logger.info( logger.info(
@@ -69,10 +74,13 @@ public class SplitPDFController {
for (int i = previousPageNumber; i <= splitPoint; i++) { for (int i = previousPageNumber; i <= splitPoint; i++) {
PDPage page = document.getPage(i); PDPage page = document.getPage(i);
splitDocument.addPage(page); splitDocument.addPage(page);
logger.debug("Adding page {} to split document", i); logger.info("Adding page {} to split document", i);
} }
previousPageNumber = splitPoint + 1; previousPageNumber = splitPoint + 1;
// Transfer metadata to split pdf
PdfUtils.setMetadataToPdf(splitDocument, metadata);
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
splitDocument.save(baos); splitDocument.save(baos);

View File

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

View File

@@ -43,7 +43,7 @@ public class UserController {
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
@PostMapping("/register") @PostMapping("/register")
public String register(@ModelAttribute UsernameAndPass requestModel, Model model) { public String register(@ModelAttribute UsernameAndPass requestModel, Model model) {
if (userService.usernameExists(requestModel.getUsername())) { if (userService.usernameExistsIgnoreCase(requestModel.getUsername())) {
model.addAttribute("error", "Username already exists"); model.addAttribute("error", "Username already exists");
return "register"; return "register";
} }
@@ -61,10 +61,16 @@ public class UserController {
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response, HttpServletResponse response,
RedirectAttributes redirectAttributes) { RedirectAttributes redirectAttributes) {
if (!userService.isUsernameValid(newUsername)) {
return new RedirectView("/account?messageType=invalidUsername");
}
if (principal == null) { if (principal == null) {
return new RedirectView("/account?messageType=notAuthenticated"); return new RedirectView("/account?messageType=notAuthenticated");
} }
// The username MUST be unique when renaming
Optional<User> userOpt = userService.findByUsername(principal.getName()); Optional<User> userOpt = userService.findByUsername(principal.getName());
if (userOpt == null || userOpt.isEmpty()) { if (userOpt == null || userOpt.isEmpty()) {
@@ -73,6 +79,10 @@ public class UserController {
User user = userOpt.get(); User user = userOpt.get();
if (user.getUsername().equals(newUsername)) {
return new RedirectView("/account?messageType=usernameExists");
}
if (!userService.isPasswordCorrect(user, currentPassword)) { if (!userService.isPasswordCorrect(user, currentPassword)) {
return new RedirectView("/account?messageType=incorrectPassword"); return new RedirectView("/account?messageType=incorrectPassword");
} }
@@ -88,7 +98,7 @@ public class UserController {
// Logout using Spring's utility // Logout using Spring's utility
new SecurityContextLogoutHandler().logout(request, response, null); new SecurityContextLogoutHandler().logout(request, response, null);
return new RedirectView("/login?messageType=credsUpdated"); return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED);
} }
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
@@ -104,7 +114,7 @@ public class UserController {
return new RedirectView("/change-creds?messageType=notAuthenticated"); return new RedirectView("/change-creds?messageType=notAuthenticated");
} }
Optional<User> userOpt = userService.findByUsername(principal.getName()); Optional<User> userOpt = userService.findByUsernameIgnoreCase(principal.getName());
if (userOpt == null || userOpt.isEmpty()) { if (userOpt == null || userOpt.isEmpty()) {
return new RedirectView("/change-creds?messageType=userNotFound"); return new RedirectView("/change-creds?messageType=userNotFound");
@@ -121,7 +131,7 @@ public class UserController {
// Logout using Spring's utility // Logout using Spring's utility
new SecurityContextLogoutHandler().logout(request, response, null); new SecurityContextLogoutHandler().logout(request, response, null);
return new RedirectView("/login?messageType=credsUpdated"); return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED);
} }
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
@@ -137,7 +147,7 @@ public class UserController {
return new RedirectView("/account?messageType=notAuthenticated"); return new RedirectView("/account?messageType=notAuthenticated");
} }
Optional<User> userOpt = userService.findByUsername(principal.getName()); Optional<User> userOpt = userService.findByUsernameIgnoreCase(principal.getName());
if (userOpt == null || userOpt.isEmpty()) { if (userOpt == null || userOpt.isEmpty()) {
return new RedirectView("/account?messageType=userNotFound"); return new RedirectView("/account?messageType=userNotFound");
@@ -154,7 +164,7 @@ public class UserController {
// Logout using Spring's utility // Logout using Spring's utility
new SecurityContextLogoutHandler().logout(request, response, null); new SecurityContextLogoutHandler().logout(request, response, null);
return new RedirectView("/login?messageType=credsUpdated"); return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED);
} }
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
@@ -186,7 +196,19 @@ public class UserController {
@RequestParam(name = "forceChange", required = false, defaultValue = "false") @RequestParam(name = "forceChange", required = false, defaultValue = "false")
boolean forceChange) { boolean forceChange) {
if (userService.usernameExists(username)) { if (!userService.isUsernameValid(username)) {
return new RedirectView("/addUsers?messageType=invalidUsername");
}
Optional<User> userOpt = userService.findByUsernameIgnoreCase(username);
if (userOpt.isPresent()) {
User user = userOpt.get();
if (user != null && user.getUsername().equalsIgnoreCase(username)) {
return new RedirectView("/addUsers?messageType=usernameExists");
}
}
if (userService.usernameExistsIgnoreCase(username)) {
return new RedirectView("/addUsers?messageType=usernameExists"); return new RedirectView("/addUsers?messageType=usernameExists");
} }
try { try {
@@ -210,7 +232,7 @@ public class UserController {
public RedirectView deleteUser( public RedirectView deleteUser(
@PathVariable(name = "username") String username, Authentication authentication) { @PathVariable(name = "username") String username, Authentication authentication) {
if (!userService.usernameExists(username)) { if (!userService.usernameExistsIgnoreCase(username)) {
return new RedirectView("/addUsers?messageType=deleteUsernameExists"); return new RedirectView("/addUsers?messageType=deleteUsernameExists");
} }
@@ -218,7 +240,7 @@ public class UserController {
String currentUsername = authentication.getName(); String currentUsername = authentication.getName();
// Check if the provided username matches the current session's username // Check if the provided username matches the current session's username
if (currentUsername.equals(username)) { if (currentUsername.equalsIgnoreCase(username)) {
return new RedirectView("/addUsers?messageType=deleteCurrentUser"); return new RedirectView("/addUsers?messageType=deleteCurrentUser");
} }
invalidateUserSessions(username); invalidateUserSessions(username);
@@ -270,4 +292,6 @@ public class UserController {
} }
return ResponseEntity.ok(apiKey); return ResponseEntity.ok(apiKey);
} }
private static final String LOGIN_MESSAGETYPE_CREDSUPDATED = "/login?messageType=credsUpdated";
} }

View File

@@ -37,7 +37,7 @@ public class ConvertBookToPDFController {
if (!bookAndHtmlFormatsInstalled) { if (!bookAndHtmlFormatsInstalled) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"bookAndHtmlFormatsInstalled flag is False, this functionality is not avaiable"); "bookAndHtmlFormatsInstalled flag is False, this functionality is not available");
} }
if (fileInput == null) { if (fileInput == null) {

View File

@@ -45,7 +45,7 @@ public class ConvertPDFToBookController {
if (!bookAndHtmlFormatsInstalled) { if (!bookAndHtmlFormatsInstalled) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"bookAndHtmlFormatsInstalled flag is False, this functionality is not avaiable"); "bookAndHtmlFormatsInstalled flag is False, this functionality is not available");
} }
if (fileInput == null) { if (fileInput == null) {

View File

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

View File

@@ -29,18 +29,6 @@ import stirling.software.SPDF.utils.WebResponseUtils;
@Tag(name = "Convert", description = "Convert APIs") @Tag(name = "Convert", description = "Convert APIs")
public class ConvertPDFToOffice { 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") @PostMapping(consumes = "multipart/form-data", value = "/pdf/presentation")
@Operation( @Operation(
summary = "Convert PDF to Presentation format", summary = "Convert PDF to Presentation format",

View File

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

View File

@@ -6,8 +6,6 @@ import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@@ -28,10 +26,6 @@ import stirling.software.SPDF.utils.WebResponseUtils;
@RequestMapping("/api/v1/convert") @RequestMapping("/api/v1/convert")
public class ConvertWebsiteToPDF { public class ConvertWebsiteToPDF {
@Autowired
@Qualifier("bookAndHtmlFormatsInstalled")
private boolean bookAndHtmlFormatsInstalled;
@PostMapping(consumes = "multipart/form-data", value = "/url/pdf") @PostMapping(consumes = "multipart/form-data", value = "/url/pdf")
@Operation( @Operation(
summary = "Convert a URL to a PDF", summary = "Convert a URL to a PDF",
@@ -53,11 +47,7 @@ public class ConvertWebsiteToPDF {
// Prepare the OCRmyPDF command // Prepare the OCRmyPDF command
List<String> command = new ArrayList<>(); List<String> command = new ArrayList<>();
if (!bookAndHtmlFormatsInstalled) { command.add("weasyprint");
command.add("weasyprint");
} else {
command.add("wkhtmltopdf");
}
command.add(URL); command.add(URL);
command.add(tempOutputFile.toString()); command.add(tempOutputFile.toString());

View File

@@ -130,7 +130,7 @@ public class AutoRenameController {
// Sanitize the header string by removing characters not allowed in a filename. // Sanitize the header string by removing characters not allowed in a filename.
if (header != null && header.length() < 255) { if (header != null && header.length() < 255) {
header = header.replaceAll("[/\\\\?%*:|\"<>]", ""); header = header.replaceAll("[/\\\\?%*:|\"<>]", "").trim();
return WebResponseUtils.pdfDocToWebResponse(document, header + ".pdf"); return WebResponseUtils.pdfDocToWebResponse(document, header + ".pdf");
} else { } else {
logger.info("File has no good title to be found"); logger.info("File has no good title to be found");

View File

@@ -58,7 +58,7 @@ public class AutoSplitPdfController {
PDDocument document = Loader.loadPDF(file.getBytes()); PDDocument document = Loader.loadPDF(file.getBytes());
PDFRenderer pdfRenderer = new PDFRenderer(document); PDFRenderer pdfRenderer = new PDFRenderer(document);
pdfRenderer.setSubsamplingAllowed(true);
List<PDDocument> splitDocuments = new ArrayList<>(); List<PDDocument> splitDocuments = new ArrayList<>();
List<ByteArrayOutputStream> splitDocumentsBoas = new ArrayList<>(); List<ByteArrayOutputStream> splitDocumentsBoas = new ArrayList<>();

View File

@@ -59,7 +59,7 @@ public class BlankPageController {
List<Integer> pagesToKeepIndex = new ArrayList<>(); List<Integer> pagesToKeepIndex = new ArrayList<>();
int pageIndex = 0; int pageIndex = 0;
PDFRenderer pdfRenderer = new PDFRenderer(document); PDFRenderer pdfRenderer = new PDFRenderer(document);
pdfRenderer.setSubsamplingAllowed(true);
for (PDPage page : pages) { for (PDPage page : pages) {
logger.info("checking page " + pageIndex); logger.info("checking page " + pageIndex);
textStripper.setStartPage(pageIndex + 1); textStripper.setStartPage(pageIndex + 1);

View File

@@ -2,9 +2,7 @@ package stirling.software.SPDF.controller.api.misc;
import java.awt.Image; import java.awt.Image;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;
@@ -75,194 +73,208 @@ public class CompressController {
long inputFileSize = Files.size(tempInputFile); long inputFileSize = Files.size(tempInputFile);
// Prepare the output file path // Prepare the output file path
Path tempOutputFile = Files.createTempFile("output_", ".pdf");
// Determine initial optimization level based on expected size reduction, only if in
// autoMode
if (autoMode) {
double sizeReductionRatio = expectedOutputSize / (double) inputFileSize;
if (sizeReductionRatio > 0.7) {
optimizeLevel = 1;
} else if (sizeReductionRatio > 0.5) {
optimizeLevel = 2;
} else if (sizeReductionRatio > 0.35) {
optimizeLevel = 3;
} else {
optimizeLevel = 3;
}
}
boolean sizeMet = false;
while (!sizeMet && optimizeLevel <= 4) {
// Prepare the Ghostscript command
List<String> command = new ArrayList<>();
command.add("gs");
command.add("-sDEVICE=pdfwrite");
command.add("-dCompatibilityLevel=1.4");
switch (optimizeLevel) {
case 1:
command.add("-dPDFSETTINGS=/prepress");
break;
case 2:
command.add("-dPDFSETTINGS=/printer");
break;
case 3:
command.add("-dPDFSETTINGS=/ebook");
break;
case 4:
command.add("-dPDFSETTINGS=/screen");
break;
default:
command.add("-dPDFSETTINGS=/default");
}
command.add("-dNOPAUSE");
command.add("-dQUIET");
command.add("-dBATCH");
command.add("-sOutputFile=" + tempOutputFile.toString());
command.add(tempInputFile.toString());
ProcessExecutorResult returnCode =
ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT)
.runCommandWithOutputHandling(command);
// Check if file size is within expected size or not auto mode so instantly finish
long outputFileSize = Files.size(tempOutputFile);
if (outputFileSize <= expectedOutputSize || !autoMode) {
sizeMet = true;
} else {
// Increase optimization level for next iteration
optimizeLevel++;
if (autoMode && optimizeLevel > 3) {
System.out.println("Skipping level 4 due to bad results in auto mode");
sizeMet = true;
} else if (optimizeLevel == 5) {
Path tempOutputFile = null;
byte[] pdfBytes;
try {
tempOutputFile = Files.createTempFile("output_", ".pdf");
// Determine initial optimization level based on expected size reduction, only if in
// autoMode
if (autoMode) {
double sizeReductionRatio = expectedOutputSize / (double) inputFileSize;
if (sizeReductionRatio > 0.7) {
optimizeLevel = 1;
} else if (sizeReductionRatio > 0.5) {
optimizeLevel = 2;
} else if (sizeReductionRatio > 0.35) {
optimizeLevel = 3;
} else { } else {
System.out.println( optimizeLevel = 3;
"Increasing ghostscript optimisation level to " + optimizeLevel);
} }
} }
}
if (expectedOutputSize != null && autoMode) { boolean sizeMet = false;
long outputFileSize = Files.size(tempOutputFile); while (!sizeMet && optimizeLevel <= 4) {
if (outputFileSize > expectedOutputSize) { // Prepare the Ghostscript command
try (PDDocument doc = Loader.loadPDF(new File(tempOutputFile.toString()))) { List<String> command = new ArrayList<>();
long previousFileSize = 0; command.add("gs");
double scaleFactor = 1.0; command.add("-sDEVICE=pdfwrite");
while (true) { command.add("-dCompatibilityLevel=1.4");
for (PDPage page : doc.getPages()) {
PDResources res = page.getResources();
for (COSName name : res.getXObjectNames()) { switch (optimizeLevel) {
PDXObject xobj = res.getXObject(name); case 1:
if (xobj instanceof PDImageXObject) { command.add("-dPDFSETTINGS=/prepress");
PDImageXObject image = (PDImageXObject) xobj; break;
case 2:
command.add("-dPDFSETTINGS=/printer");
break;
case 3:
command.add("-dPDFSETTINGS=/ebook");
break;
case 4:
command.add("-dPDFSETTINGS=/screen");
break;
default:
command.add("-dPDFSETTINGS=/default");
}
// Get the image in BufferedImage format command.add("-dNOPAUSE");
BufferedImage bufferedImage = image.getImage(); command.add("-dQUIET");
command.add("-dBATCH");
command.add("-sOutputFile=" + tempOutputFile.toString());
command.add(tempInputFile.toString());
// Calculate the new dimensions ProcessExecutorResult returnCode =
int newWidth = (int) (bufferedImage.getWidth() * scaleFactor); ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT)
int newHeight = (int) (bufferedImage.getHeight() * scaleFactor); .runCommandWithOutputHandling(command);
// If the new dimensions are zero, skip this iteration // Check if file size is within expected size or not auto mode so instantly finish
if (newWidth == 0 || newHeight == 0) { long outputFileSize = Files.size(tempOutputFile);
continue; if (outputFileSize <= expectedOutputSize || !autoMode) {
sizeMet = true;
} else {
// Increase optimization level for next iteration
optimizeLevel++;
if (autoMode && optimizeLevel > 4) {
System.out.println("Skipping level 5 due to bad results in auto mode");
sizeMet = true;
} else {
System.out.println(
"Increasing ghostscript optimisation level to " + optimizeLevel);
}
}
}
if (expectedOutputSize != null && autoMode) {
long outputFileSize = Files.size(tempOutputFile);
byte[] fileBytes = Files.readAllBytes(tempOutputFile);
if (outputFileSize > expectedOutputSize) {
try (PDDocument doc = Loader.loadPDF(fileBytes)) {
long previousFileSize = 0;
double scaleFactorConst = 0.9f;
double scaleFactor = 0.9f;
while (true) {
for (PDPage page : doc.getPages()) {
PDResources res = page.getResources();
if (res != null && res.getXObjectNames() != null) {
for (COSName name : res.getXObjectNames()) {
PDXObject xobj = res.getXObject(name);
if (xobj != null && xobj instanceof PDImageXObject) {
PDImageXObject image = (PDImageXObject) xobj;
// Get the image in BufferedImage format
BufferedImage bufferedImage = image.getImage();
// Calculate the new dimensions
int newWidth =
(int)
(bufferedImage.getWidth()
* scaleFactorConst);
int newHeight =
(int)
(bufferedImage.getHeight()
* scaleFactorConst);
// If the new dimensions are zero, skip this iteration
if (newWidth == 0 || newHeight == 0) {
continue;
}
// Otherwise, proceed with the scaling
Image scaledImage =
bufferedImage.getScaledInstance(
newWidth,
newHeight,
Image.SCALE_SMOOTH);
// Convert the scaled image back to a BufferedImage
BufferedImage scaledBufferedImage =
new BufferedImage(
newWidth,
newHeight,
BufferedImage.TYPE_INT_RGB);
scaledBufferedImage
.getGraphics()
.drawImage(scaledImage, 0, 0, null);
// Compress the scaled image
ByteArrayOutputStream compressedImageStream =
new ByteArrayOutputStream();
ImageIO.write(
scaledBufferedImage,
"jpeg",
compressedImageStream);
byte[] imageBytes = compressedImageStream.toByteArray();
compressedImageStream.close();
PDImageXObject compressedImage =
PDImageXObject.createFromByteArray(
doc,
imageBytes,
image.getCOSObject().toString());
// Replace the image in the resources with the
// compressed
// version
res.put(name, compressedImage);
}
} }
// Otherwise, proceed with the scaling
Image scaledImage =
bufferedImage.getScaledInstance(
newWidth, newHeight, Image.SCALE_SMOOTH);
// Convert the scaled image back to a BufferedImage
BufferedImage scaledBufferedImage =
new BufferedImage(
newWidth,
newHeight,
BufferedImage.TYPE_INT_RGB);
scaledBufferedImage
.getGraphics()
.drawImage(scaledImage, 0, 0, null);
// Compress the scaled image
ByteArrayOutputStream compressedImageStream =
new ByteArrayOutputStream();
ImageIO.write(
scaledBufferedImage, "jpeg", compressedImageStream);
byte[] imageBytes = compressedImageStream.toByteArray();
compressedImageStream.close();
// Convert compressed image back to PDImageXObject
ByteArrayInputStream bais =
new ByteArrayInputStream(imageBytes);
PDImageXObject compressedImage =
PDImageXObject.createFromByteArray(
doc,
imageBytes,
image.getCOSObject().toString());
// Replace the image in the resources with the compressed
// version
res.put(name, compressedImage);
} }
} }
}
// save the document to tempOutputFile again // save the document to tempOutputFile again
doc.save(tempOutputFile.toString()); doc.save(tempOutputFile.toString());
long currentSize = Files.size(tempOutputFile); long currentSize = Files.size(tempOutputFile);
// Check if the overall PDF size is still larger than expectedOutputSize // Check if the overall PDF size is still larger than expectedOutputSize
if (currentSize > expectedOutputSize) { if (currentSize > expectedOutputSize) {
// Log the current file size and scaleFactor // Log the current file size and scaleFactor
System.out.println( System.out.println(
"Current file size: " "Current file size: "
+ FileUtils.byteCountToDisplaySize(currentSize)); + FileUtils.byteCountToDisplaySize(currentSize));
System.out.println("Current scale factor: " + scaleFactor); System.out.println("Current scale factor: " + scaleFactor);
// The file is still too large, reduce scaleFactor and try again // The file is still too large, reduce scaleFactor and try again
scaleFactor *= 0.9; // reduce scaleFactor by 10% scaleFactor *= 0.9f; // reduce scaleFactor by 10%
// Avoid scaleFactor being too small, causing the image to shrink to 0 // Avoid scaleFactor being too small, causing the image to shrink to
if (scaleFactor < 0.2 || previousFileSize == currentSize) { // 0
throw new RuntimeException( if (scaleFactor < 0.2f || previousFileSize == currentSize) {
"Could not reach the desired size without excessively degrading image quality, lowest size recommended is " throw new RuntimeException(
+ FileUtils.byteCountToDisplaySize(currentSize) "Could not reach the desired size without excessively degrading image quality, lowest size recommended is "
+ ", " + FileUtils.byteCountToDisplaySize(currentSize)
+ currentSize + ", "
+ " bytes"); + currentSize
+ " bytes");
}
previousFileSize = currentSize;
} else {
// The file is small enough, break the loop
break;
} }
previousFileSize = currentSize;
} else {
// The file is small enough, break the loop
break;
} }
} }
} }
} }
// Read the optimized PDF file
pdfBytes = Files.readAllBytes(tempOutputFile);
// Check if optimized file is larger than the original
if (pdfBytes.length > inputFileSize) {
// Log the occurrence
logger.warn(
"Optimized file is larger than the original. Returning the original file instead.");
// Read the original file again
pdfBytes = Files.readAllBytes(tempInputFile);
}
} finally {
// Clean up the temporary files
Files.delete(tempInputFile);
Files.delete(tempOutputFile);
} }
// Read the optimized PDF file
byte[] pdfBytes = Files.readAllBytes(tempOutputFile);
// Check if optimized file is larger than the original
if (pdfBytes.length > inputFileSize) {
// Log the occurrence
logger.warn(
"Optimized file is larger than the original. Returning the original file instead.");
// Read the original file again
pdfBytes = Files.readAllBytes(tempInputFile);
}
// Clean up the temporary files
Files.delete(tempInputFile);
Files.delete(tempOutputFile);
// Return the optimized PDF as a response // Return the optimized PDF as a response
String outputFilename = String outputFilename =
Filenames.toSimpleFileName(inputFile.getOriginalFilename()) Filenames.toSimpleFileName(inputFile.getOriginalFilename())

View File

@@ -9,7 +9,6 @@ import java.nio.file.StandardCopyOption;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@@ -84,6 +83,7 @@ public class ExtractImageScansController {
// Load PDF document // Load PDF document
try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) { try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) {
PDFRenderer pdfRenderer = new PDFRenderer(document); PDFRenderer pdfRenderer = new PDFRenderer(document);
pdfRenderer.setSubsamplingAllowed(true);
int pageCount = document.getNumberOfPages(); int pageCount = document.getNumberOfPages();
images = new ArrayList<>(); images = new ArrayList<>();
@@ -142,8 +142,7 @@ public class ExtractImageScansController {
.runCommandWithOutputHandling(command); .runCommandWithOutputHandling(command);
// Read the output photos in temp directory // Read the output photos in temp directory
List<Path> tempOutputFiles = List<Path> tempOutputFiles = Files.list(tempDir).sorted().toList();
Files.list(tempDir).sorted().collect(Collectors.toList());
for (Path tempOutputFile : tempOutputFiles) { for (Path tempOutputFile : tempOutputFiles) {
byte[] imageBytes = Files.readAllBytes(tempOutputFile); byte[] imageBytes = Files.readAllBytes(tempOutputFile);
processedImageBytes.add(imageBytes); processedImageBytes.add(imageBytes);
@@ -155,7 +154,7 @@ public class ExtractImageScansController {
// Create zip file if multiple images // Create zip file if multiple images
if (processedImageBytes.size() > 1) { if (processedImageBytes.size() > 1) {
String outputZipFilename = String outputZipFilename =
fileName.replaceFirst("[.][^.]+$", "") + "_processed.zip"; fileName.replaceFirst(REPLACEFIRST, "") + "_processed.zip";
tempZipFile = Files.createTempFile("output_", ".zip"); tempZipFile = Files.createTempFile("output_", ".zip");
try (ZipOutputStream zipOut = try (ZipOutputStream zipOut =
@@ -164,7 +163,7 @@ public class ExtractImageScansController {
for (int i = 0; i < processedImageBytes.size(); i++) { for (int i = 0; i < processedImageBytes.size(); i++) {
ZipEntry entry = ZipEntry entry =
new ZipEntry( new ZipEntry(
fileName.replaceFirst("[.][^.]+$", "") fileName.replaceFirst(REPLACEFIRST, "")
+ "_" + "_"
+ (i + 1) + (i + 1)
+ ".png"); + ".png");
@@ -186,7 +185,7 @@ public class ExtractImageScansController {
byte[] imageBytes = processedImageBytes.get(0); byte[] imageBytes = processedImageBytes.get(0);
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
imageBytes, imageBytes,
fileName.replaceFirst("[.][^.]+$", "") + ".png", fileName.replaceFirst(REPLACEFIRST, "") + ".png",
MediaType.IMAGE_PNG); MediaType.IMAGE_PNG);
} }
} finally { } finally {
@@ -218,4 +217,6 @@ public class ExtractImageScansController {
}); });
} }
} }
private static final String REPLACEFIRST = "[.][^.]+$";
} }

View File

@@ -1,27 +1,25 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import java.awt.AlphaComposite;
import java.awt.Color; import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform; import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp; import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp; import java.awt.image.BufferedImageOp;
import java.awt.image.ConvolveOp; import java.awt.image.ConvolveOp;
import java.awt.image.Kernel; import java.awt.image.Kernel;
import java.awt.image.RescaleOp;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Random; import java.util.Random;
import javax.imageio.ImageIO;
import org.apache.pdfbox.Loader; import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.rendering.PDFRenderer;
@@ -29,16 +27,17 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import io.github.pixee.security.Filenames; 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.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.model.api.PDFFile;
import stirling.software.SPDF.utils.PdfUtils;
import stirling.software.SPDF.utils.WebResponseUtils; import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@@ -48,97 +47,38 @@ public class FakeScanControllerWIP {
private static final Logger logger = LoggerFactory.getLogger(FakeScanControllerWIP.class); private static final Logger logger = LoggerFactory.getLogger(FakeScanControllerWIP.class);
// TODO //TODO
@Hidden //@PostMapping(consumes = "multipart/form-data", value = "/fake-scan")
// @PostMapping(consumes = "multipart/form-data", value = "/fakeScan") //@Operation(
@Operation( // summary = "Repair a PDF file",
summary = "Repair a PDF file", // description =
description = // "This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response.")
"This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response.") public ResponseEntity<byte[]> fakeScan(@ModelAttribute PDFFile request) throws IOException {
public ResponseEntity<byte[]> repairPdf(@ModelAttribute PDFFile request) throws IOException {
MultipartFile inputFile = request.getFileInput(); MultipartFile inputFile = request.getFileInput();
// Load the PDF document
PDDocument document = Loader.loadPDF(inputFile.getBytes()); PDDocument document = Loader.loadPDF(inputFile.getBytes());
PDFRenderer pdfRenderer = new PDFRenderer(document); PDFRenderer renderer = new PDFRenderer(document);
for (int page = 0; page < document.getNumberOfPages(); ++page) { List<BufferedImage> images = new ArrayList<>();
BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB); // Convert each page to an image
ImageIO.write(image, "png", new File("scanned-" + (page + 1) + ".png")); for (int i = 0; i < document.getNumberOfPages(); i++) {
BufferedImage image = renderer.renderImageWithDPI(i, 150, ImageType.GRAY);
images.add(processImage(image));
} }
document.close(); document.close();
// Constants // Create a new PDF document with the processed images
int scannedness = 90; // Value between 0 and 100
int dirtiness = 0; // Value between 0 and 100
// Load the source image
BufferedImage sourceImage = ImageIO.read(new File("scanned-1.png"));
// Create the destination image
BufferedImage destinationImage =
new BufferedImage(
sourceImage.getWidth(), sourceImage.getHeight(), sourceImage.getType());
// Apply a brightness and contrast effect based on the "scanned-ness"
float scaleFactor = 1.0f + (scannedness / 100.0f) * 0.5f; // Between 1.0 and 1.5
float offset = scannedness * 1.5f; // Between 0 and 150
BufferedImageOp op = new RescaleOp(scaleFactor, offset, null);
op.filter(sourceImage, destinationImage);
// Apply a rotation effect
double rotationRequired =
Math.toRadians(
(new SecureRandom().nextInt(3 - 1)
+ 1)); // Random angle between 1 and 3 degrees
double locationX = destinationImage.getWidth() / 2;
double locationY = destinationImage.getHeight() / 2;
AffineTransform tx =
AffineTransform.getRotateInstance(rotationRequired, locationX, locationY);
AffineTransformOp rotateOp = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
destinationImage = rotateOp.filter(destinationImage, null);
// Apply a blur effect based on the "scanned-ness"
float blurIntensity = scannedness / 100.0f * 0.2f; // Between 0.0 and 0.2
float[] matrix = {
blurIntensity, blurIntensity, blurIntensity,
blurIntensity, blurIntensity, blurIntensity,
blurIntensity, blurIntensity, blurIntensity
};
BufferedImageOp blurOp =
new ConvolveOp(new Kernel(3, 3, matrix), ConvolveOp.EDGE_NO_OP, null);
destinationImage = blurOp.filter(destinationImage, null);
// Add noise to the image based on the "dirtiness"
Random random = new SecureRandom();
for (int y = 0; y < destinationImage.getHeight(); y++) {
for (int x = 0; x < destinationImage.getWidth(); x++) {
if (random.nextInt(100) < dirtiness) {
// Change the pixel color to black randomly based on the "dirtiness"
destinationImage.setRGB(x, y, Color.BLACK.getRGB());
}
}
}
// Save the image
ImageIO.write(destinationImage, "PNG", new File("scanned-1.png"));
PDDocument documentOut = new PDDocument();
for (int page = 1; page <= document.getNumberOfPages(); ++page) {
BufferedImage bim = ImageIO.read(new File("scanned-" + page + ".png"));
// Adjust the dimensions of the page
PDPage pdPage = new PDPage(new PDRectangle(bim.getWidth() - 1, bim.getHeight() - 1));
documentOut.addPage(pdPage);
PDImageXObject pdImage = LosslessFactory.createFromImage(documentOut, bim);
PDPageContentStream contentStream = new PDPageContentStream(documentOut, pdPage);
// Draw the image with a slight offset and enlarged dimensions
contentStream.drawImage(pdImage, -1, -1, bim.getWidth() + 2, bim.getHeight() + 2);
contentStream.close();
}
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
documentOut.save(baos); PDDocument newDocument = new PDDocument();
documentOut.close(); for (BufferedImage img : images) {
// PDPageContentStream contentStream = new PDPageContentStream(newDocument, new
// PDPage());
PDImageXObject pdImage = JPEGFactory.createFromImage(newDocument, img);
PdfUtils.addImageToDocument(newDocument, pdImage, "maintainAspectRatio", false);
}
newDocument.save(baos);
newDocument.close();
// Return the optimized PDF as a response // Return the optimized PDF as a response
String outputFilename = String outputFilename =
@@ -147,4 +87,164 @@ public class FakeScanControllerWIP {
+ "_scanned.pdf"; + "_scanned.pdf";
return WebResponseUtils.boasToWebResponse(baos, outputFilename); 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;
}
} }

View File

@@ -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);
}
}
}

View File

@@ -88,7 +88,7 @@ public class StampController {
// Load the input PDF // Load the input PDF
PDDocument document = Loader.loadPDF(pdfFile.getBytes()); PDDocument document = Loader.loadPDF(pdfFile.getBytes());
List<Integer> pageNumbers = request.getPageNumbersList(document, false); List<Integer> pageNumbers = request.getPageNumbersList(document, true);
for (int pageIndex : pageNumbers) { for (int pageIndex : pageNumbers) {
int zeroBasedIndex = pageIndex - 1; int zeroBasedIndex = pageIndex - 1;

View File

@@ -12,7 +12,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
@@ -50,9 +49,6 @@ public class PipelineController {
@PostMapping("/handleData") @PostMapping("/handleData")
public ResponseEntity<byte[]> handleData(@ModelAttribute HandleDataRequest request) public ResponseEntity<byte[]> handleData(@ModelAttribute HandleDataRequest request)
throws JsonMappingException, JsonProcessingException { throws JsonMappingException, JsonProcessingException {
if (!Boolean.TRUE.equals(applicationProperties.getSystem().getEnableAlphaFunctionality())) {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
MultipartFile[] files = request.getFileInput(); MultipartFile[] files = request.getFileInput();
String jsonString = request.getJson(); String jsonString = request.getJson();

View File

@@ -26,7 +26,6 @@ import org.springframework.stereotype.Service;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import stirling.software.SPDF.model.ApplicationProperties;
import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineConfig;
import stirling.software.SPDF.model.PipelineOperation; import stirling.software.SPDF.model.PipelineOperation;
@@ -36,7 +35,6 @@ public class PipelineDirectoryProcessor {
private static final Logger logger = LoggerFactory.getLogger(PipelineDirectoryProcessor.class); private static final Logger logger = LoggerFactory.getLogger(PipelineDirectoryProcessor.class);
@Autowired private ObjectMapper objectMapper; @Autowired private ObjectMapper objectMapper;
@Autowired private ApiDocService apiDocService; @Autowired private ApiDocService apiDocService;
@Autowired private ApplicationProperties applicationProperties;
final String watchedFoldersDir = "./pipeline/watchedFolders/"; final String watchedFoldersDir = "./pipeline/watchedFolders/";
final String finishedFoldersDir = "./pipeline/finishedFolders/"; final String finishedFoldersDir = "./pipeline/finishedFolders/";
@@ -45,9 +43,6 @@ public class PipelineDirectoryProcessor {
@Scheduled(fixedRate = 60000) @Scheduled(fixedRate = 60000)
public void scanFolders() { public void scanFolders() {
if (!Boolean.TRUE.equals(applicationProperties.getSystem().getEnableAlphaFunctionality())) {
return;
}
Path watchedFolderPath = Paths.get(watchedFoldersDir); Path watchedFolderPath = Paths.get(watchedFoldersDir);
if (!Files.exists(watchedFolderPath)) { if (!Files.exists(watchedFolderPath)) {
try { try {

View File

@@ -83,6 +83,7 @@ public class RedactController {
if (convertPDFToImage) { if (convertPDFToImage) {
PDDocument imageDocument = new PDDocument(); PDDocument imageDocument = new PDDocument();
PDFRenderer pdfRenderer = new PDFRenderer(document); PDFRenderer pdfRenderer = new PDFRenderer(document);
pdfRenderer.setSubsamplingAllowed(true);
for (int page = 0; page < document.getNumberOfPages(); ++page) { for (int page = 0; page < document.getNumberOfPages(); ++page) {
BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB); BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
PDPage newPage = new PDPage(new PDRectangle(bim.getWidth(), bim.getHeight())); PDPage newPage = new PDPage(new PDRectangle(bim.getWidth(), bim.getHeight()));

View File

@@ -54,33 +54,32 @@ public class SanitizeController {
boolean removeLinks = request.isRemoveLinks(); boolean removeLinks = request.isRemoveLinks();
boolean removeFonts = request.isRemoveFonts(); boolean removeFonts = request.isRemoveFonts();
try (PDDocument document = Loader.loadPDF(inputFile.getBytes())) { PDDocument document = Loader.loadPDF(inputFile.getBytes());
if (removeJavaScript) { if (removeJavaScript) {
sanitizeJavaScript(document); sanitizeJavaScript(document);
}
if (removeEmbeddedFiles) {
sanitizeEmbeddedFiles(document);
}
if (removeMetadata) {
sanitizeMetadata(document);
}
if (removeLinks) {
sanitizeLinks(document);
}
if (removeFonts) {
sanitizeFonts(document);
}
return WebResponseUtils.pdfDocToWebResponse(
document,
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
.replaceFirst("[.][^.]+$", "")
+ "_sanitized.pdf");
} }
if (removeEmbeddedFiles) {
sanitizeEmbeddedFiles(document);
}
if (removeMetadata) {
sanitizeMetadata(document);
}
if (removeLinks) {
sanitizeLinks(document);
}
if (removeFonts) {
sanitizeFonts(document);
}
return WebResponseUtils.pdfDocToWebResponse(
document,
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
.replaceFirst("[.][^.]+$", "")
+ "_sanitized.pdf");
} }
private void sanitizeJavaScript(PDDocument document) throws IOException { private void sanitizeJavaScript(PDDocument document) throws IOException {
@@ -140,25 +139,29 @@ public class SanitizeController {
for (PDPage page : allPages) { for (PDPage page : allPages) {
PDResources res = page.getResources(); PDResources res = page.getResources();
if (res != null && res.getCOSObject() != null) {
// Remove embedded files from the PDF res.getCOSObject().removeItem(COSName.getPDFName("EmbeddedFiles"));
res.getCOSObject().removeItem(COSName.getPDFName("EmbeddedFiles")); }
} }
} }
private void sanitizeMetadata(PDDocument document) { private void sanitizeMetadata(PDDocument document) {
PDMetadata metadata = document.getDocumentCatalog().getMetadata(); if (document.getDocumentCatalog() != null) {
if (metadata != null) { PDMetadata metadata = document.getDocumentCatalog().getMetadata();
document.getDocumentCatalog().setMetadata(null); if (metadata != null) {
document.getDocumentCatalog().setMetadata(null);
}
} }
} }
private void sanitizeLinks(PDDocument document) throws IOException { private void sanitizeLinks(PDDocument document) throws IOException {
for (PDPage page : document.getPages()) { for (PDPage page : document.getPages()) {
for (PDAnnotation annotation : page.getAnnotations()) { for (PDAnnotation annotation : page.getAnnotations()) {
if (annotation instanceof PDAnnotationLink) { if (annotation != null && annotation instanceof PDAnnotationLink) {
PDAction action = ((PDAnnotationLink) annotation).getAction(); PDAction action = ((PDAnnotationLink) annotation).getAction();
if (action instanceof PDActionLaunch || action instanceof PDActionURI) { if (action != null
&& (action instanceof PDActionLaunch
|| action instanceof PDActionURI)) {
((PDAnnotationLink) annotation).setAction(null); ((PDAnnotationLink) annotation).setAction(null);
} }
} }
@@ -168,7 +171,11 @@ public class SanitizeController {
private void sanitizeFonts(PDDocument document) { private void sanitizeFonts(PDDocument document) {
for (PDPage page : document.getPages()) { for (PDPage page : document.getPages()) {
page.getResources().getCOSObject().removeItem(COSName.getPDFName("Font")); if (page != null
&& page.getResources() != null
&& page.getResources().getCOSObject() != null) {
page.getResources().getCOSObject().removeItem(COSName.getPDFName("Font"));
}
} }
} }
} }

View File

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

View File

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

View File

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

View File

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

View File

@@ -33,13 +33,13 @@ public class PDFWithPageNums extends PDFFile {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
return GeneralUtils.parsePageString(pageNumbers, pageCount, zeroCount); return GeneralUtils.parsePageList(pageNumbers, pageCount, zeroCount);
} }
@Hidden @Hidden
public List<Integer> getPageNumbersList(PDDocument doc, boolean zeroCount) { public List<Integer> getPageNumbersList(PDDocument doc, boolean zeroCount) {
int pageCount = 0; int pageCount = 0;
pageCount = doc.getNumberOfPages(); pageCount = doc.getNumberOfPages();
return GeneralUtils.parsePageString(pageNumbers, pageCount, zeroCount); return GeneralUtils.parsePageList(pageNumbers, pageCount, zeroCount);
} }
} }

View File

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

View File

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

View File

@@ -19,6 +19,16 @@ public class TextFinder extends PDFTextStripper {
private final boolean wholeWordSearch; private final boolean wholeWordSearch;
private final List<PDFText> textOccurrences = new ArrayList<>(); private final List<PDFText> textOccurrences = new ArrayList<>();
private class MatchInfo {
int startIndex;
int matchLength;
MatchInfo(int startIndex, int matchLength) {
this.startIndex = startIndex;
this.matchLength = matchLength;
}
}
public TextFinder(String searchText, boolean useRegex, boolean wholeWordSearch) public TextFinder(String searchText, boolean useRegex, boolean wholeWordSearch)
throws IOException { throws IOException {
this.searchText = searchText.toLowerCase(); this.searchText = searchText.toLowerCase();
@@ -27,36 +37,37 @@ public class TextFinder extends PDFTextStripper {
setSortByPosition(true); setSortByPosition(true);
} }
private List<Integer> findOccurrencesInText(String searchText, String content) { private List<MatchInfo> findOccurrencesInText(String searchText, String content) {
List<Integer> indexes = new ArrayList<>(); List<MatchInfo> matches = new ArrayList<>();
Pattern pattern; Pattern pattern;
if (useRegex) { if (useRegex) {
// Use regex-based search // Use regex-based search
pattern = pattern =
wholeWordSearch wholeWordSearch
? Pattern.compile("(\\b|_|\\.)" + searchText + "(\\b|_|\\.)") ? Pattern.compile("\\b" + searchText + "\\b")
: Pattern.compile(searchText); : Pattern.compile(searchText);
} else { } else {
// Use normal text search // Use normal text search
pattern = pattern =
wholeWordSearch wholeWordSearch
? Pattern.compile( ? Pattern.compile("\\b" + Pattern.quote(searchText) + "\\b")
"(\\b|_|\\.)" + Pattern.quote(searchText) + "(\\b|_|\\.)")
: Pattern.compile(Pattern.quote(searchText)); : Pattern.compile(Pattern.quote(searchText));
} }
Matcher matcher = pattern.matcher(content); Matcher matcher = pattern.matcher(content);
while (matcher.find()) { while (matcher.find()) {
indexes.add(matcher.start()); matches.add(new MatchInfo(matcher.start(), matcher.end() - matcher.start()));
} }
return indexes; return matches;
} }
@Override @Override
protected void writeString(String text, List<TextPosition> textPositions) { protected void writeString(String text, List<TextPosition> textPositions) {
for (Integer index : findOccurrencesInText(searchText, text.toLowerCase())) { for (MatchInfo match : findOccurrencesInText(searchText, text.toLowerCase())) {
if (index + searchText.length() <= textPositions.size()) { int index = match.startIndex;
if (index + match.matchLength <= textPositions.size()) {
// Initial values based on the first character // Initial values based on the first character
TextPosition first = textPositions.get(index); TextPosition first = textPositions.get(index);
float minX = first.getX(); float minX = first.getX();
@@ -65,7 +76,7 @@ public class TextFinder extends PDFTextStripper {
float maxY = first.getY() + first.getHeight(); float maxY = first.getY() + first.getHeight();
// Loop over the rest of the characters and adjust bounding box values // Loop over the rest of the characters and adjust bounding box values
for (int i = index; i < index + searchText.length(); i++) { for (int i = index; i < index + match.matchLength; i++) {
TextPosition position = textPositions.get(i); TextPosition position = textPositions.get(i);
minX = Math.min(minX, position.getX()); minX = Math.min(minX, position.getX());
minY = Math.min(minY, position.getY()); minY = Math.min(minY, position.getY());

View File

@@ -7,6 +7,8 @@ import org.springframework.data.jpa.repository.JpaRepository;
import stirling.software.SPDF.model.User; import stirling.software.SPDF.model.User;
public interface UserRepository extends JpaRepository<User, String> { public interface UserRepository extends JpaRepository<User, String> {
Optional<User> findByUsernameIgnoreCase(String username);
Optional<User> findByUsername(String username); Optional<User> findByUsername(String username);
User findByApiKey(String apiKey); User findByApiKey(String apiKey);

View File

@@ -12,11 +12,12 @@ import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor; import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import com.fathzer.soft.javaluator.DoubleEvaluator;
import io.github.pixee.security.HostValidator; import io.github.pixee.security.HostValidator;
import io.github.pixee.security.Urls; import io.github.pixee.security.Urls;
@@ -87,6 +88,7 @@ public class GeneralUtils {
} }
sizeStr = sizeStr.trim().toUpperCase(); sizeStr = sizeStr.trim().toUpperCase();
sizeStr = sizeStr.replace(",", ".").replace(" ", "");
try { try {
if (sizeStr.endsWith("KB")) { if (sizeStr.endsWith("KB")) {
return (long) return (long)
@@ -115,91 +117,115 @@ public class GeneralUtils {
return null; return null;
} }
public static List<Integer> parsePageString(String pageOrder, int totalPages) { public static List<Integer> parsePageList(String pages, int totalPages, boolean oneBased) {
return parsePageString(pageOrder, totalPages, false); if (pages == null) {
} return List.of(1); // Default to first page if input is null
public static List<Integer> parsePageString(
String pageOrder, int totalPages, boolean isOneBased) {
if (pageOrder == null || pageOrder.isEmpty()) {
return Collections.singletonList(1);
} }
if (pageOrder.matches("\\d+")) { try {
// Convert the single number string to an integer and return it in a list return parsePageList(pages.split(","), totalPages, oneBased);
return Collections.singletonList(Integer.parseInt(pageOrder)); } catch (NumberFormatException e) {
return List.of(1); // Default to first page if input is invalid
} }
return parsePageList(pageOrder.split(","), totalPages, isOneBased);
} }
public static List<Integer> parsePageList(String[] pageOrderArr, int totalPages) { public static List<Integer> parsePageList(String[] pages, int totalPages) {
return parsePageList(pageOrderArr, totalPages, false); return parsePageList(pages, totalPages, false);
} }
public static List<Integer> parsePageList( public static List<Integer> parsePageList(String[] pages, int totalPages, boolean oneBased) {
String[] pageOrderArr, int totalPages, boolean isOneBased) { List<Integer> result = new ArrayList<>();
List<Integer> newPageOrder = new ArrayList<>(); int offset = oneBased ? 1 : 0;
for (String page : pages) {
if ("all".equalsIgnoreCase(page)) {
int adjustmentFactor = isOneBased ? 1 : 0;
// loop through the page order array
for (String element : pageOrderArr) {
if ("all".equalsIgnoreCase(element)) {
for (int i = 0; i < totalPages; i++) { for (int i = 0; i < totalPages; i++) {
newPageOrder.add(i + adjustmentFactor); result.add(i + offset);
} }
// As all pages are already added, no need to check further } else if (page.contains(",")) {
break; // Split the string into parts, could be single pages or ranges
} else if (element.matches("\\d*n\\+?-?\\d*|\\d*\\+?n")) { String[] parts = page.split(",");
// Handle page order as a function for (String part : parts) {
int coefficient = 0; result.addAll(handlePart(part, totalPages, offset));
int constant = 0;
boolean coefficientExists = false;
boolean constantExists = false;
if (element.contains("n")) {
String[] parts = element.split("n");
if (!"".equals(parts[0]) && parts[0] != null) {
coefficient = Integer.parseInt(parts[0]);
coefficientExists = true;
}
if (parts.length > 1 && !"".equals(parts[1]) && parts[1] != null) {
constant = Integer.parseInt(parts[1]);
constantExists = true;
}
} else if (element.contains("+")) {
constant = Integer.parseInt(element.replace("+", ""));
constantExists = true;
}
for (int i = 1; i <= totalPages; i++) {
int pageNum = coefficientExists ? coefficient * i : i;
pageNum += constantExists ? constant : 0;
if (pageNum <= totalPages && pageNum > 0) {
newPageOrder.add(pageNum - adjustmentFactor);
}
}
} else if (element.contains("-")) {
// split the range into start and end page
String[] range = element.split("-");
int start = Integer.parseInt(range[0]);
int end = Integer.parseInt(range[1]);
// check if the end page is greater than total pages
if (end > totalPages) {
end = totalPages;
}
// loop through the range of pages
for (int j = start; j <= end; j++) {
// print the current index
newPageOrder.add(j - adjustmentFactor);
} }
} else { } else {
// if the element is a single page result.addAll(handlePart(page, totalPages, offset));
newPageOrder.add(Integer.parseInt(element) - adjustmentFactor);
} }
} }
return new ArrayList<>(
new java.util.LinkedHashSet<>(result)); // Remove duplicates and maintain order
}
return newPageOrder; public static List<Integer> evaluateNFunc(String expression, int maxValue) {
List<Integer> results = new ArrayList<>();
DoubleEvaluator evaluator = new DoubleEvaluator();
// Validate the expression
if (!expression.matches("[0-9n+\\-*/() ]+")) {
throw new IllegalArgumentException("Invalid expression");
}
int n = 0;
while (true) {
// Replace 'n' with the current value of n, correctly handling numbers before 'n'
String sanitizedExpression = insertMultiplicationBeforeN(expression, n);
Double result = evaluator.evaluate(sanitizedExpression);
// Check if the result is null or not within bounds
if (result == null || result <= 0 || result.intValue() > maxValue) {
if (n != 0) break;
} else {
results.add(result.intValue());
}
n++;
}
return results;
}
private static String insertMultiplicationBeforeN(String expression, int nValue) {
// 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.replace("n", String.valueOf(nValue));
}
private static List<Integer> handlePart(String part, int totalPages, int offset) {
List<Integer> partResult = new ArrayList<>();
// First check for n-syntax because it should not be processed as a range
if (part.contains("n")) {
partResult = evaluateNFunc(part, totalPages);
// Adjust the results according to the offset
for (int i = 0; i < partResult.size(); i++) {
int adjustedValue = partResult.get(i) - 1 + offset;
partResult.set(i, adjustedValue);
}
} else if (part.contains("-")) {
// Process ranges only if it's not n-syntax
String[] rangeParts = part.split("-");
try {
int start = Integer.parseInt(rangeParts[0]);
int end = Integer.parseInt(rangeParts[1]);
for (int i = start; i <= end; i++) {
if (i >= 1 && i <= totalPages) {
partResult.add(i - 1 + offset);
}
}
} catch (NumberFormatException e) {
// Range is invalid, ignore this part
}
} else {
// This is a single page number
try {
int pageNum = Integer.parseInt(part.trim());
if (pageNum >= 1 && pageNum <= totalPages) {
partResult.add(pageNum - 1 + offset);
}
} catch (NumberFormatException ignored) {
// Ignore invalid numbers
}
}
return partResult;
} }
public static boolean createDir(String path) { public static boolean createDir(String path) {

View File

@@ -25,6 +25,71 @@ import io.github.pixee.security.Filenames;
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
public class PDFToFile { 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( public ResponseEntity<byte[]> processPdfToOfficeFormat(
MultipartFile inputFile, String outputFormat, String libreOfficeFilter) MultipartFile inputFile, String outputFormat, String libreOfficeFilter)
throws IOException, InterruptedException { throws IOException, InterruptedException {
@@ -39,17 +104,7 @@ public class PDFToFile {
// Validate output format // Validate output format
List<String> allowedFormats = List<String> allowedFormats =
Arrays.asList( Arrays.asList("doc", "docx", "odt", "ppt", "pptx", "odp", "rtf", "xml", "txt:Text");
"doc",
"docx",
"odt",
"ppt",
"pptx",
"odp",
"rtf",
"html",
"xml",
"txt:Text");
if (!allowedFormats.contains(outputFormat)) { if (!allowedFormats.contains(outputFormat)) {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST); return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
} }

View File

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

View File

@@ -24,6 +24,7 @@ public class ProcessExecutor {
public enum Processes { public enum Processes {
LIBRE_OFFICE, LIBRE_OFFICE,
PDFTOHTML,
OCR_MY_PDF, OCR_MY_PDF,
PYTHON_OPENCV, PYTHON_OPENCV,
GHOSTSCRIPT, GHOSTSCRIPT,
@@ -45,6 +46,7 @@ public class ProcessExecutor {
int semaphoreLimit = int semaphoreLimit =
switch (key) { switch (key) {
case LIBRE_OFFICE -> 1; case LIBRE_OFFICE -> 1;
case PDFTOHTML -> 1;
case OCR_MY_PDF -> 2; case OCR_MY_PDF -> 2;
case PYTHON_OPENCV -> 8; case PYTHON_OPENCV -> 8;
case GHOSTSCRIPT -> 16; case GHOSTSCRIPT -> 16;
@@ -56,6 +58,7 @@ public class ProcessExecutor {
long timeoutMinutes = long timeoutMinutes =
switch (key) { switch (key) {
case LIBRE_OFFICE -> 30; case LIBRE_OFFICE -> 30;
case PDFTOHTML -> 5;
case OCR_MY_PDF -> 30; case OCR_MY_PDF -> 30;
case PYTHON_OPENCV -> 30; case PYTHON_OPENCV -> 30;
case GHOSTSCRIPT -> 5; case GHOSTSCRIPT -> 5;
@@ -169,27 +172,35 @@ public class ProcessExecutor {
errorReaderThread.join(); errorReaderThread.join();
outputReaderThread.join(); outputReaderThread.join();
if (!liveUpdates) { if (outputLines.size() > 0) {
if (outputLines.size() > 0) { String outputMessage = String.join("\n", outputLines);
String outputMessage = String.join("\n", outputLines); messages += outputMessage;
messages += outputMessage; if (!liveUpdates) {
logger.info("Command output:\n" + outputMessage); logger.info("Command output:\n" + outputMessage);
} }
}
if (errorLines.size() > 0) { if (errorLines.size() > 0) {
String errorMessage = String.join("\n", errorLines); String errorMessage = String.join("\n", errorLines);
messages += errorMessage; messages += errorMessage;
if (!liveUpdates) {
logger.warn("Command error output:\n" + errorMessage); logger.warn("Command error output:\n" + errorMessage);
if (exitCode != 0) {
throw new IOException(
"Command process failed with exit code "
+ exitCode
+ ". Error message: "
+ errorMessage);
}
} }
} else if (exitCode != 0) { if (exitCode != 0) {
throw new IOException("Command process failed with exit code " + exitCode); throw new IOException(
"Command process failed with exit code "
+ exitCode
+ ". Error message: "
+ errorMessage);
}
}
if (exitCode != 0) {
throw new IOException(
"Command process failed with exit code "
+ exitCode
+ "\nLogs: "
+ messages);
} }
} finally { } finally {
semaphore.release(); semaphore.release();

View File

@@ -1,11 +0,0 @@
fileToPDF.fileTypesList=Microsoft Word: (DOC, DOCX, DOT, DOTX) <br> \
Microsoft Excel: (CSV, XLS, XLSX, XLT, XLTX, SLK, DIF) <br> \
Microsoft PowerPoint: (PPT, PPTX) <br> \
OpenDocument Formats: (ODT, OTT, ODS, OTS, ODP, OTP, ODG, OTG) <br> \
Plain Text: (TXT, TEXT, XML) <br> \
Rich Text Format: (RTF) <br> \
Images: (BMP, GIF, JPEG, PNG, TIF, PBM, PGM, PPM, RAS, XBM, XPM, SVG, SVM, WMF) <br> \
HTML: (HTML) <br> \
Lotus Word Pro: (LWP) <br> \
StarOffice formats: (SDA, SDC, SDD, SDW, STC, STD, STI, STW, SXD, SXG, SXI, SXW) <br> \
Other formats: (DBF, FODS, VSD, VOR, VOR3, VOR4, UOP, PCT, PS, PDF)

View File

@@ -13,16 +13,17 @@ processTimeWarning=تحذير: يمكن أن تستغرق هذه العملية
pageOrderPrompt=ترتيب الصفحات (أدخل قائمة بأرقام الصفحات مفصولة بفواصل): pageOrderPrompt=ترتيب الصفحات (أدخل قائمة بأرقام الصفحات مفصولة بفواصل):
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=اذهب goToPage=اذهب
true=\u0635\u062D\u064A\u062D true=صحيح
false=\u062E\u0637\u0623 false=خطأ
unknown=\u063A\u064A\u0631 \u0645\u0639\u0631\u0648\u0641 unknown=غير معروف
save=\u062D\u0641\u0638 save=حفظ
close=\u0625\u063A\u0644\u0627\u0642 saveToBrowser=Save to Browser
close=إغلاق
filesSelected=الملفات المحددة filesSelected=الملفات المحددة
noFavourites=لم تتم إضافة أي مفضلات noFavourites=لم تتم إضافة أي مفضلات
downloadComplete=Download Complete downloadComplete=Download Complete
bored=الانتظار بالملل؟ bored=الانتظار بالملل؟
alphabet=\u0627\u0644\u0623\u0628\u062C\u062F\u064A\u0629 alphabet=الأبجدية
downloadPdf=تنزيل PDF downloadPdf=تنزيل PDF
text=نص text=نص
font=الخط font=الخط
@@ -53,18 +54,32 @@ notAuthenticatedMessage=User not authenticated.
userNotFoundMessage=User not found. userNotFoundMessage=User not found.
incorrectPasswordMessage=Current password is incorrect. incorrectPasswordMessage=Current password is incorrect.
usernameExistsMessage=New Username already exists. usernameExistsMessage=New Username already exists.
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Cannot delete currently logged in user.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. 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
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Pipeline Menu (Beta)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Upload Custom
pipeline.configureButton=Configure pipeline.configureButton=Configure
pipeline.defaultOption=Custom pipeline.defaultOption=Custom
pipeline.submitButton=Submit pipeline.submitButton=Submit
pipeline.help=Pipeline Help
pipeline.scanHelp=Folder Scanning Help
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -90,23 +105,25 @@ navbar.security=الأمان
navbar.other=أخرى navbar.other=أخرى
navbar.darkmode=الوضع الداكن navbar.darkmode=الوضع الداكن
navbar.pageOps=عمليات الصفحة navbar.pageOps=عمليات الصفحة
navbar.settings=\u0625\u0639\u062F\u0627\u062F\u0627\u062A navbar.settings=إعدادات
############# #############
# SETTINGS # # SETTINGS #
############# #############
settings.title=\u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A settings.title=الإعدادات
settings.update=\u0627\u0644\u062A\u062D\u062F\u064A\u062B \u0645\u062A\u0627\u062D settings.update=التحديث متاح
settings.appVersion=\u0625\u0635\u062F\u0627\u0631 \u0627\u0644\u062A\u0637\u0628\u064A\u0642: settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.downloadOption.title=\u062A\u062D\u062F\u064A\u062F \u062E\u064A\u0627\u0631 \u0627\u0644\u062A\u0646\u0632\u064A\u0644 (\u0644\u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0630\u0627\u062A \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0648\u0627\u062D\u062F \u063A\u064A\u0631 \u0627\u0644\u0645\u0636\u063A\u0648\u0637): settings.appVersion=إصدار التطبيق:
settings.downloadOption.1=\u0641\u062A\u062D \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0646\u0627\u0641\u0630\u0629 settings.downloadOption.title=تحديد خيار التنزيل (للتنزيلات ذات الملف الواحد غير المضغوط):
settings.downloadOption.2=\u0641\u062A\u062D \u0641\u064A \u0646\u0627\u0641\u0630\u0629 \u062C\u062F\u064A\u062F\u0629 settings.downloadOption.1=فتح في نفس النافذة
settings.downloadOption.3=\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u0645\u0644\u0641 settings.downloadOption.2=فتح في نافذة جديدة
settings.zipThreshold=\u0645\u0644\u0641\u0627\u062A \u0645\u0636\u063A\u0648\u0637\u0629 \u0639\u0646\u062F \u062A\u062C\u0627\u0648\u0632 \u0639\u062F\u062F \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u0645 \u062A\u0646\u0632\u064A\u0644\u0647\u0627 settings.downloadOption.3=تنزيل الملف
settings.zipThreshold=ملفات مضغوطة عند تجاوز عدد الملفات التي تم تنزيلها
settings.signOut=Sign Out settings.signOut=Sign Out
settings.accountSettings=Account Settings settings.accountSettings=Account Settings
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -145,6 +162,7 @@ adminUserSettings.header=Admin User Control Settings
adminUserSettings.admin=Admin adminUserSettings.admin=Admin
adminUserSettings.user=User adminUserSettings.user=User
adminUserSettings.addUser=Add New User adminUserSettings.addUser=Add New User
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
adminUserSettings.roles=Roles adminUserSettings.roles=Roles
adminUserSettings.role=Role adminUserSettings.role=Role
adminUserSettings.actions=Actions adminUserSettings.actions=Actions
@@ -227,25 +245,25 @@ home.compressPdfs.desc=ضغط ملفات PDF لتقليل حجم الملف.
compressPdfs.tags=squish,small,tiny compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=\u062A\u063A\u064A\u064A\u0631 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629 home.changeMetadata.title=تغيير البيانات الوصفية
home.changeMetadata.desc=\u062A\u063A\u064A\u064A\u0631 / \u0625\u0632\u0627\u0644\u0629 / \u0625\u0636\u0627\u0641\u0629 \u0628\u064A\u0627\u0646\u0627\u062A \u0623\u0648\u0644\u064A\u0629 \u0645\u0646 \u0645\u0633\u062A\u0646\u062F PDF home.changeMetadata.desc=تغيير / إزالة / إضافة بيانات أولية من مستند PDF
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=\u062A\u062D\u0648\u064A\u0644 \u0627\u0644\u0645\u0644\u0641 \u0625\u0644\u0649 PDF home.fileToPDF.title=تحويل الملف إلى PDF
home.fileToPDF.desc=\u062A\u062D\u0648\u064A\u0644 \u0623\u064A \u0645\u0644\u0641 \u062A\u0642\u0631\u064A\u0628\u0627 \u0625\u0644\u0649 PDF (DOCX \u0648PNG \u0648XLS \u0648PPT \u0648TXT \u0648\u0627\u0644\u0645\u0632\u064A\u062F) home.fileToPDF.desc=تحويل أي ملف تقريبا إلى PDF (DOCX وPNG وXLS وPPT وTXT والمزيد)
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=\u062A\u0634\u063A\u064A\u0644 OCR \u0639\u0644\u0649 PDF \u0648 / \u0623\u0648 \u0645\u0633\u062D \u0636\u0648\u0626\u064A home.ocr.title=تشغيل OCR على PDF و / أو مسح ضوئي
home.ocr.desc=\u064A\u0642\u0648\u0645 \u0628\u0631\u0646\u0627\u0645\u062C \u0627\u0644\u062A\u0646\u0638\u064A\u0641 \u0628\u0645\u0633\u062D \u0648\u0627\u0643\u062A\u0634\u0627\u0641 \u0627\u0644\u0646\u0635 \u0645\u0646 \u0627\u0644\u0635\u0648\u0631 \u062F\u0627\u062E\u0644 \u0645\u0644\u0641 PDF \u0648\u064A\u0639\u064A\u062F \u0625\u0636\u0627\u0641\u062A\u0647 \u0643\u0646\u0635 home.ocr.desc=يقوم برنامج التنظيف بمسح واكتشاف النص من الصور داخل ملف PDF ويعيد إضافته كنص
ocr.tags=recognition,text,image,scan,read,identify,detection,editable ocr.tags=recognition,text,image,scan,read,identify,detection,editable
home.extractImages.title=\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0627\u0644\u0635\u0648\u0631 home.extractImages.title=استخراج الصور
home.extractImages.desc=\u064A\u0633\u062A\u062E\u0631\u062C \u062C\u0645\u064A\u0639 \u0627\u0644\u0635\u0648\u0631 \u0645\u0646 \u0645\u0644\u0641 PDF \u0648\u064A\u062D\u0641\u0638\u0647\u0627 \u0641\u064A \u0627\u0644\u0631\u0645\u0632 \u0627\u0644\u0628\u0631\u064A\u062F\u064A home.extractImages.desc=يستخرج جميع الصور من ملف PDF ويحفظها في الرمز البريدي
extractImages.tags=picture,photo,save,archive,zip,capture,grab extractImages.tags=picture,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=\u062A\u062D\u0648\u064A\u0644 \u0645\u0644\u0641\u0627\u062A PDF \u0625\u0644\u0649 PDF / A home.pdfToPDFA.title=تحويل ملفات PDF إلى PDF / A
home.pdfToPDFA.desc=\u062A\u062D\u0648\u064A\u0644 PDF \u0625\u0644\u0649 PDF / A \u0644\u0644\u062A\u062E\u0632\u064A\u0646 \u0637\u0648\u064A\u0644 \u0627\u0644\u0645\u062F\u0649 home.pdfToPDFA.desc=تحويل PDF إلى PDF / A للتخزين طويل المدى
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=تحويل PDF إلى Word home.PDFToWord.title=تحويل PDF إلى Word
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Convert To Single Page
pageExtracter.title=Extract Pages pageExtracter.title=Extract Pages
pageExtracter.header=Extract Pages pageExtracter.header=Extract Pages
pageExtracter.submit=Extract pageExtracter.submit=Extract
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -687,38 +706,38 @@ ScannerImageSplit.selectText.10=يضبط حجم الحدود المضافة وا
#OCR #OCR
ocr.title=\u0627\u0644\u062A\u0639\u0631\u0641 \u0627\u0644\u0636\u0648\u0626\u064A \u0639\u0644\u0649 \u0627\u0644\u062D\u0631\u0648\u0641 / \u062A\u0646\u0638\u064A\u0641 \u0627\u0644\u0645\u0633\u062D \u0627\u0644\u0636\u0648\u0626\u064A ocr.title=التعرف الضوئي على الحروف / تنظيف المسح الضوئي
ocr.header=\u0645\u0633\u062D \u0627\u0644\u0645\u0633\u062D \u0627\u0644\u0636\u0648\u0626\u064A / \u0627\u0644\u062A\u0639\u0631\u0641 \u0627\u0644\u0636\u0648\u0626\u064A \u0639\u0644\u0649 \u0627\u0644\u062D\u0631\u0648\u0641 (\u0627\u0644\u062A\u0639\u0631\u0641 \u0627\u0644\u0636\u0648\u0626\u064A \u0639\u0644\u0649 \u0627\u0644\u062D\u0631\u0648\u0641) ocr.header=مسح المسح الضوئي / التعرف الضوئي على الحروف (التعرف الضوئي على الحروف)
ocr.selectText.1=\u062D\u062F\u062F \u0627\u0644\u0644\u063A\u0627\u062A \u0627\u0644\u062A\u064A \u0633\u064A\u062A\u0645 \u0627\u0643\u062A\u0634\u0627\u0641\u0647\u0627 \u062F\u0627\u062E\u0644 \u0645\u0644\u0641 PDF (\u0627\u0644\u0644\u063A\u0627\u062A \u0627\u0644\u0645\u062F\u0631\u062C\u0629 \u0647\u064A \u062A\u0644\u0643 \u0627\u0644\u062A\u064A \u062A\u0645 \u0627\u0643\u062A\u0634\u0627\u0641\u0647\u0627 \u062D\u0627\u0644\u064A\u064B\u0627): ocr.selectText.1=حدد اللغات التي سيتم اكتشافها داخل ملف PDF (اللغات المدرجة هي تلك التي تم اكتشافها حاليًا):
ocr.selectText.2=\u0625\u0646\u062A\u0627\u062C \u0645\u0644\u0641 \u0646\u0635\u064A \u064A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0646\u0635 OCR \u0628\u062C\u0627\u0646\u0628 \u0645\u0644\u0641 PDF \u0627\u0644\u0630\u064A \u062A\u0645 \u0625\u0639\u062F\u0627\u062F\u0647 \u0628\u0648\u0627\u0633\u0637\u0629 OCR ocr.selectText.2=إنتاج ملف نصي يحتوي على نص OCR بجانب ملف PDF الذي تم إعداده بواسطة OCR
ocr.selectText.3=\u062A\u0645 \u0645\u0633\u062D \u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u0635\u062D\u064A\u062D\u0629 \u0636\u0648\u0626\u064A\u064B\u0627 \u0628\u0632\u0627\u0648\u064A\u0629 \u0645\u0646\u062D\u0631\u0641\u0629 \u0639\u0646 \u0637\u0631\u064A\u0642 \u062A\u062F\u0648\u064A\u0631\u0647\u0627 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649 \u0641\u064A \u0645\u0643\u0627\u0646\u0647\u0627 ocr.selectText.3=تم مسح الصفحات الصحيحة ضوئيًا بزاوية منحرفة عن طريق تدويرها مرة أخرى في مكانها
ocr.selectText.4=\u0635\u0641\u062D\u0629 \u0646\u0638\u064A\u0641\u0629 \u0644\u0630\u0644\u0643 \u0645\u0646 \u063A\u064A\u0631 \u0627\u0644\u0645\u062D\u062A\u0645\u0644 \u0623\u0646 \u064A\u062C\u062F OCR \u0646\u0635\u064B\u0627 \u0641\u064A \u0636\u0648\u0636\u0627\u0621 \u0627\u0644\u062E\u0644\u0641\u064A\u0629. (\u0644\u0627 \u064A\u0648\u062C\u062F \u062A\u063A\u064A\u064A\u0631 \u0641\u064A \u0627\u0644\u0625\u062E\u0631\u0627\u062C) ocr.selectText.4=صفحة نظيفة لذلك من غير المحتمل أن يجد OCR نصًا في ضوضاء الخلفية. (لا يوجد تغيير في الإخراج)
ocr.selectText.5=\u0635\u0641\u062D\u0629 \u0646\u0638\u064A\u0641\u0629 \u060C \u0644\u0630\u0644\u0643 \u0645\u0646 \u063A\u064A\u0631 \u0627\u0644\u0645\u062D\u062A\u0645\u0644 \u0623\u0646 \u064A\u062C\u062F OCR \u0646\u0635\u064B\u0627 \u0641\u064A \u0636\u0648\u0636\u0627\u0621 \u0627\u0644\u062E\u0644\u0641\u064A\u0629 \u060C \u0648\u064A\u062D\u0627\u0641\u0638 \u0639\u0644\u0649 \u0627\u0644\u062A\u0646\u0638\u064A\u0641 \u0641\u064A \u0627\u0644\u0625\u062E\u0631\u0627\u062C. ocr.selectText.5=صفحة نظيفة ، لذلك من غير المحتمل أن يجد OCR نصًا في ضوضاء الخلفية ، ويحافظ على التنظيف في الإخراج.
ocr.selectText.6=\u064A\u062A\u062C\u0627\u0647\u0644 \u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0646\u0635 \u062A\u0641\u0627\u0639\u0644\u064A \u060C \u0641\u0642\u0637 \u0635\u0641\u062D\u0627\u062A OCRs \u0627\u0644\u062A\u064A \u0647\u064A \u0635\u0648\u0631 ocr.selectText.6=يتجاهل الصفحات التي تحتوي على نص تفاعلي ، فقط صفحات OCRs التي هي صور
ocr.selectText.7=\u0641\u0631\u0636 \u0627\u0644\u062A\u0639\u0631\u0641 \u0627\u0644\u0636\u0648\u0626\u064A \u0639\u0644\u0649 \u0627\u0644\u062D\u0631\u0648\u0641 \u060C \u0633\u064A\u0624\u062F\u064A \u0627\u0644\u062A\u0639\u0631\u0641 \u0627\u0644\u0636\u0648\u0626\u064A \u0639\u0644\u0649 \u0627\u0644\u062D\u0631\u0648\u0641 \u0639\u0644\u0649 \u0643\u0644 \u0635\u0641\u062D\u0629 \u0625\u0644\u0649 \u0625\u0632\u0627\u0644\u0629 \u062C\u0645\u064A\u0639 \u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0646\u0635 \u0627\u0644\u0623\u0635\u0644\u064A ocr.selectText.7=فرض التعرف الضوئي على الحروف ، سيؤدي التعرف الضوئي على الحروف على كل صفحة إلى إزالة جميع عناصر النص الأصلي
ocr.selectText.8=\u0639\u0627\u062F\u064A (\u062E\u0637\u0623 \u0625\u0630\u0627 \u0643\u0627\u0646 PDF \u064A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0646\u0635) ocr.selectText.8=عادي (خطأ إذا كان PDF يحتوي على نص)
ocr.selectText.9=\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0625\u0636\u0627\u0641\u064A\u0629 ocr.selectText.9=إعدادات إضافية
ocr.selectText.10=\u0648\u0636\u0639 \u0627\u0644\u062A\u0639\u0631\u0641 \u0627\u0644\u0636\u0648\u0626\u064A \u0639\u0644\u0649 \u0627\u0644\u062D\u0631\u0648\u0641 ocr.selectText.10=وضع التعرف الضوئي على الحروف
ocr.selectText.11=إزالة الصور بعد التعرف الضوئي على الحروف (يزيل كل الصور ، يكون مفيدًا فقط إذا كان جزءًا من خطوة التحويل) ocr.selectText.11=إزالة الصور بعد التعرف الضوئي على الحروف (يزيل كل الصور ، يكون مفيدًا فقط إذا كان جزءًا من خطوة التحويل)
ocr.selectText.12=نوع العرض (متقدم) ocr.selectText.12=نوع العرض (متقدم)
ocr.help=\u064A\u0631\u062C\u0649 \u0642\u0631\u0627\u0621\u0629 \u0647\u0630\u0647 \u0627\u0644\u0648\u062B\u0627\u0626\u0642 \u062D\u0648\u0644 \u0643\u064A\u0641\u064A\u0629 \u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0647\u0630\u0627 \u0644\u0644\u063A\u0627\u062A \u0623\u062E\u0631\u0649 \u0648 / \u0623\u0648 \u0627\u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0644\u064A\u0633 \u0641\u064A \u0639\u0627\u0645\u0644 \u0627\u0644\u0625\u0631\u0633\u0627\u0621 ocr.help=يرجى قراءة هذه الوثائق حول كيفية استخدام هذا للغات أخرى و / أو الاستخدام ليس في عامل الإرساء
ocr.credit=\u062A\u0633\u062A\u062E\u062F\u0645 \u0647\u0630\u0647 \u0627\u0644\u062E\u062F\u0645\u0629 OCRmyPDF \u0648 Tesseract \u0644 OCR. ocr.credit=تستخدم هذه الخدمة OCRmyPDF و Tesseract ل OCR.
ocr.submit=\u0645\u0639\u0627\u0644\u062C\u0629 PDF \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 OCR ocr.submit=معالجة PDF باستخدام OCR
#extractImages #extractImages
extractImages.title=\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0627\u0644\u0635\u0648\u0631 extractImages.title=استخراج الصور
extractImages.header=\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0627\u0644\u0635\u0648\u0631 extractImages.header=استخراج الصور
extractImages.selectText=\u062D\u062F\u062F \u062A\u0646\u0633\u064A\u0642 \u0627\u0644\u0635\u0648\u0631\u0629 \u0644\u062A\u062D\u0648\u064A\u0644 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0645\u0633\u062A\u062E\u0631\u062C\u0629 \u0625\u0644\u0649 extractImages.selectText=حدد تنسيق الصورة لتحويل الصور المستخرجة إلى
extractImages.submit=\u0627\u0633\u062A\u062E\u0631\u0627\u062C extractImages.submit=استخراج
#File to PDF #File to PDF
fileToPDF.title=\u0645\u0644\u0641 \u0625\u0644\u0649 PDF fileToPDF.title=ملف إلى PDF
fileToPDF.header=\u062A\u062D\u0648\u064A\u0644 \u0623\u064A \u0645\u0644\u0641 \u0625\u0644\u0649 PDF fileToPDF.header=تحويل أي ملف إلى PDF
fileToPDF.credit=\u062A\u0633\u062A\u062E\u062F\u0645 \u0647\u0630\u0647 \u0627\u0644\u062E\u062F\u0645\u0629 \u0644\u064A\u0628\u0631 \u0623\u0648\u0641\u064A\u0633 \u0648\u0623\u0648\u0646\u0648\u0643\u0648\u0646\u0641 \u0644\u062A\u062D\u0648\u064A\u0644 \u0627\u0644\u0645\u0644\u0641\u0627\u062A. fileToPDF.credit=تستخدم هذه الخدمة ليبر أوفيس وأونوكونف لتحويل الملفات.
fileToPDF.supportedFileTypes=\u064A\u062C\u0628 \u0623\u0646 \u062A\u062A\u0636\u0645\u0646 \u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0645\u062F\u0639\u0648\u0645\u0629 \u0645\u0627 \u064A\u0644\u064A \u0648\u0644\u0643\u0646 \u0644\u0644\u062D\u0635\u0648\u0644 \u0639\u0644\u0649 \u0642\u0627\u0626\u0645\u0629 \u0645\u062D\u062F\u062B\u0629 \u0643\u0627\u0645\u0644\u0629 \u0628\u0627\u0644\u062A\u0646\u0633\u064A\u0642\u0627\u062A \u0627\u0644\u0645\u062F\u0639\u0648\u0645\u0629 \u060C \u064A\u0631\u062C\u0649 \u0627\u0644\u0631\u062C\u0648\u0639 \u0625\u0644\u0649 \u0648\u062B\u0627\u0626\u0642 LibreOffice fileToPDF.supportedFileTypes=يجب أن تتضمن أنواع الملفات المدعومة ما يلي ولكن للحصول على قائمة محدثة كاملة بالتنسيقات المدعومة ، يرجى الرجوع إلى وثائق LibreOffice
fileToPDF.submit=\u062A\u062D\u0648\u064A\u0644 \u0625\u0644\u0649 PDF fileToPDF.submit=تحويل إلى PDF
#compress #compress
@@ -753,11 +772,23 @@ merge.submit=دمج
pdfOrganiser.title=منظم الصفحة pdfOrganiser.title=منظم الصفحة
pdfOrganiser.header=منظم صفحات PDF pdfOrganiser.header=منظم صفحات PDF
pdfOrganiser.submit=إعادة ترتيب الصفحات 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)
#multiTool #multiTool
multiTool.title=أداة متعددة PDF multiTool.title=أداة متعددة PDF
multiTool.header=أداة متعددة PDF multiTool.header=أداة متعددة PDF
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=View PDF
@@ -768,6 +799,7 @@ pageRemover.title=مزيل الصفحة
pageRemover.header=مزيل صفحة PDF pageRemover.header=مزيل صفحة PDF
pageRemover.pagesToDelete=الصفحات المراد حذفها (أدخل قائمة بأرقام الصفحات مفصولة بفواصل): pageRemover.pagesToDelete=الصفحات المراد حذفها (أدخل قائمة بأرقام الصفحات مفصولة بفواصل):
pageRemover.submit=حذف الصفحات pageRemover.submit=حذف الصفحات
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=حدد زاوية الدوران (بمضاعفات 90 درج
rotate.submit=استدارة rotate.submit=استدارة
#merge #split-pdfs
split.title=انقسام PDF split.title=انقسام PDF
split.header=تقسيم PDF split.header=تقسيم PDF
split.desc.1=الأرقام التي تحددها هي رقم الصفحة التي تريد تقسيمها split.desc.1=الأرقام التي تحددها هي رقم الصفحة التي تريد تقسيمها
split.desc.2=على هذا النحو ، سيؤدي تحديد 1،3،7-8 إلى تقسيم مستند من 10 صفحات إلى 6 PDFS منفصلة مع: split.desc.2=على هذا النحو ، سيؤدي تحديد 1،3،7-9 إلى تقسيم مستند من 10 صفحات إلى 6 PDFS منفصلة مع:
split.desc.3=المستند رقم 1: الصفحة 1 split.desc.3=المستند رقم 1: الصفحة 1
split.desc.4=المستند رقم 2: الصفحتان 2 و 3 split.desc.4=المستند رقم 2: الصفحتان 2 و 3
split.desc.5=المستند رقم 3: الصفحة 4 و 5 و 6 split.desc.5=المستند رقم 3: الصفحة 4 و 5 و 6 و 7
split.desc.6=المستند رقم 4: الصفحة 7 split.desc.6=المستند رقم 4: الصفحة 8
split.desc.7=المستند رقم 5: الصفحة 8 split.desc.7=المستند رقم 5: الصفحة 9
split.desc.8=المستند رقم 6: الصفحتان 9 و 10 split.desc.8=المستند رقم 6: الصفحة 10
split.splitPages=أدخل الصفحات المراد تقسيمها: split.splitPages=أدخل الصفحات المراد تقسيمها:
split.submit=Split split.submit=Split
@@ -800,23 +832,23 @@ imageToPDF.selectLabel=Image Fit Options
imageToPDF.fillPage=Fill Page imageToPDF.fillPage=Fill Page
imageToPDF.fitDocumentToImage=Fit Page to Image imageToPDF.fitDocumentToImage=Fit Page to Image
imageToPDF.maintainAspectRatio=Maintain Aspect Ratios imageToPDF.maintainAspectRatio=Maintain Aspect Ratios
imageToPDF.selectText.2=\u062F\u0648\u0631\u0627\u0646 PDF \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627 imageToPDF.selectText.2=دوران PDF تلقائيًا
imageToPDF.selectText.3=\u0627\u0644\u0645\u0646\u0637\u0642 \u0627\u0644\u0645\u062A\u0639\u062F\u062F \u0644\u0644\u0645\u0644\u0641\u0627\u062A (\u0645\u0641\u0639\u0651\u0644 \u0641\u0642\u0637 \u0625\u0630\u0627 \u0643\u0646\u062A \u062A\u0639\u0645\u0644 \u0645\u0639 \u0635\u0648\u0631 \u0645\u062A\u0639\u062F\u062F\u0629) imageToPDF.selectText.3=المنطق المتعدد للملفات (مفعّل فقط إذا كنت تعمل مع صور متعددة)
imageToPDF.selectText.4=\u062F\u0645\u062C \u0641\u064A \u0645\u0644\u0641 PDF \u0648\u0627\u062D\u062F imageToPDF.selectText.4=دمج في ملف PDF واحد
imageToPDF.selectText.5=\u062A\u062D\u0648\u064A\u0644 \u0625\u0644\u0649 \u0645\u0644\u0641\u0627\u062A PDF \u0645\u0646\u0641\u0635\u0644\u0629 imageToPDF.selectText.5=تحويل إلى ملفات PDF منفصلة
#pdfToImage #pdfToImage
pdfToImage.title=تحويل PDF إلى صورة pdfToImage.title=تحويل PDF إلى صورة
pdfToImage.header=تحويل PDF إلى صورة pdfToImage.header=تحويل PDF إلى صورة
pdfToImage.selectText=تنسيق الصورة pdfToImage.selectText=تنسيق الصورة
pdfToImage.singleOrMultiple=\u0646\u0648\u0639 \u0646\u062A\u064A\u062C\u0629 \u0627\u0644\u0635\u0648\u0631\u0629 pdfToImage.singleOrMultiple=نوع نتيجة الصورة
pdfToImage.single=\u0635\u0648\u0631\u0629 \u0648\u0627\u062D\u062F\u0629 \u0643\u0628\u064A\u0631\u0629 pdfToImage.single=صورة واحدة كبيرة
pdfToImage.multi=\u0635\u0648\u0631 \u0645\u062A\u0639\u062F\u062F\u0629 pdfToImage.multi=صور متعددة
pdfToImage.colorType=\u0646\u0648\u0639 \u0627\u0644\u0644\u0648\u0646 pdfToImage.colorType=نوع اللون
pdfToImage.color=\u0627\u0644\u0644\u0648\u0646 pdfToImage.color=اللون
pdfToImage.grey=\u062A\u062F\u0631\u062C \u0627\u0644\u0631\u0645\u0627\u062F\u064A pdfToImage.grey=تدرج الرمادي
pdfToImage.blackwhite=\u0623\u0628\u064A\u0636 \u0648\u0623\u0633\u0648\u062F (\u0642\u062F \u064A\u0641\u0642\u062F \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A!) pdfToImage.blackwhite=أبيض وأسود (قد يفقد البيانات!)
pdfToImage.submit=تحول pdfToImage.submit=تحول
@@ -851,10 +883,12 @@ watermark.selectText.3=حجم الخط:
watermark.selectText.4=دوران (0-360): watermark.selectText.4=دوران (0-360):
watermark.selectText.5=widthSpacer (مسافة بين كل علامة مائية أفقيًا): watermark.selectText.5=widthSpacer (مسافة بين كل علامة مائية أفقيًا):
watermark.selectText.6=heightSpacer (مسافة بين كل علامة مائية عموديًا): watermark.selectText.6=heightSpacer (مسافة بين كل علامة مائية عموديًا):
watermark.selectText.7=\u0627\u0644\u062A\u0639\u062A\u064A\u0645 (0\u066A - 100\u066A): watermark.selectText.7=التعتيم (0٪ - 100٪):
watermark.selectText.8=Watermark Type: watermark.selectText.8=Watermark Type:
watermark.selectText.9=Watermark Image: watermark.selectText.9=Watermark Image:
watermark.submit=إضافة علامة مائية watermark.submit=إضافة علامة مائية
watermark.type.1=Text
watermark.type.2=Image
#Change permissions #Change permissions
@@ -883,29 +917,30 @@ removePassword.submit=إزالة
#changeMetadata #changeMetadata
changeMetadata.title=\u0627\u0644\u0639\u0646\u0648\u0627\u0646: changeMetadata.title=العنوان:
changeMetadata.header=\u062A\u063A\u064A\u064A\u0631 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629 changeMetadata.header=تغيير البيانات الوصفية
changeMetadata.selectText.1=\u064A\u0631\u062C\u0649 \u062A\u0639\u062F\u064A\u0644 \u0627\u0644\u0645\u062A\u063A\u064A\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u0631\u063A\u0628 \u0641\u064A \u062A\u063A\u064A\u064A\u0631\u0647\u0627 changeMetadata.selectText.1=يرجى تعديل المتغيرات التي ترغب في تغييرها
changeMetadata.selectText.2=\u062D\u0630\u0641 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0623\u0648\u0644\u064A\u0629 changeMetadata.selectText.2=حذف كل البيانات الأولية
changeMetadata.selectText.3=\u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0623\u0648\u0644\u064A\u0629 \u0627\u0644\u0645\u062E\u0635\u0635\u0629: changeMetadata.selectText.3=إظهار البيانات الأولية المخصصة:
changeMetadata.author=\u0627\u0644\u0645\u0624\u0644\u0641: changeMetadata.author=المؤلف:
changeMetadata.creationDate=\u062A\u0627\u0631\u064A\u062E \u0627\u0644\u0625\u0646\u0634\u0627\u0621 (yyyy / MM / dd HH: mm: ss): changeMetadata.creationDate=تاريخ الإنشاء (yyyy / MM / dd HH: mm: ss):
changeMetadata.creator=\u0627\u0644\u0645\u0646\u0634\u0626: changeMetadata.creator=المنشئ:
changeMetadata.keywords=\u0627\u0644\u0643\u0644\u0645\u0627\u062A \u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629: changeMetadata.keywords=الكلمات الرئيسية:
changeMetadata.modDate=\u062A\u0627\u0631\u064A\u062E \u0627\u0644\u062A\u0639\u062F\u064A\u0644 (yyyy / MM / dd HH: mm: ss): changeMetadata.modDate=تاريخ التعديل (yyyy / MM / dd HH: mm: ss):
changeMetadata.producer=\u0627\u0644\u0645\u0646\u062A\u062C: changeMetadata.producer=المنتج:
changeMetadata.subject=\u0627\u0644\u0645\u0648\u0636\u0648\u0639: changeMetadata.subject=الموضوع:
changeMetadata.trapped=\u0645\u062D\u0627\u0635\u0631: changeMetadata.trapped=محاصر:
changeMetadata.selectText.4=\u0628\u064A\u0627\u0646\u0627\u062A \u0648\u0635\u0641\u064A\u0629 \u0623\u062E\u0631\u0649: changeMetadata.selectText.4=بيانات وصفية أخرى:
changeMetadata.selectText.5=\u0625\u0636\u0627\u0641\u0629 \u0625\u062F\u062E\u0627\u0644 \u0628\u064A\u0627\u0646\u0627\u062A \u0623\u0648\u0644\u064A\u0629 \u0645\u062E\u0635\u0635 changeMetadata.selectText.5=إضافة إدخال بيانات أولية مخصص
changeMetadata.submit=\u062A\u063A\u064A\u064A\u0631 changeMetadata.submit=تغيير
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF \u0625\u0644\u0649 PDF / A pdfToPDFA.title=PDF إلى PDF / A
pdfToPDFA.header=PDF \u0625\u0644\u0649 PDF / A pdfToPDFA.header=PDF إلى PDF / A
pdfToPDFA.credit=\u062A\u0633\u062A\u062E\u062F\u0645 \u0647\u0630\u0647 \u0627\u0644\u062E\u062F\u0645\u0629 OCRmyPDF \u0644\u062A\u062D\u0648\u064A\u0644 PDF / A. pdfToPDFA.credit=تستخدم هذه الخدمة OCRmyPDF لتحويل PDF / A.
pdfToPDFA.submit=\u062A\u062D\u0648\u064A\u0644 pdfToPDFA.submit=تحويل
pdfToPDFA.tip=Currently does not work for multiple inputs at once
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=تحويل
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF إلى HTML PDFToHTML.title=PDF إلى HTML
PDFToHTML.header=PDF إلى HTML PDFToHTML.header=PDF إلى HTML
PDFToHTML.credit=تستخدم هذه الخدمة LibreOffice لتحويل الملفات. PDFToHTML.credit=تستخدم هذه الخدمة pdftohtml لتحويل الملفات.
PDFToHTML.submit=تحويل PDFToHTML.submit=تحويل
@@ -989,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses
@@ -998,3 +1042,16 @@ licenses.version=Version
licenses.license=License 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

View File

@@ -17,6 +17,7 @@ true=Вярно
false=Невярно false=Невярно
unknown=Непознат unknown=Непознат
save=Съхранете save=Съхранете
saveToBrowser=Save to Browser
close=Затворете close=Затворете
filesSelected=избрани файлове filesSelected=избрани файлове
noFavourites=Няма добавени любими noFavourites=Няма добавени любими
@@ -53,18 +54,32 @@ notAuthenticatedMessage=Потребителят не е автентикира
userNotFoundMessage=Потребителят не е намерен userNotFoundMessage=Потребителят не е намерен
incorrectPasswordMessage=Текущата парола е неправилна. incorrectPasswordMessage=Текущата парола е неправилна.
usernameExistsMessage=Новият потребител вече съществува. usernameExistsMessage=Новият потребител вече съществува.
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Cannot delete currently logged in user.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. 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
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Pipeline Menu (Beta)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Upload Custom
pipeline.configureButton=Configure pipeline.configureButton=Configure
pipeline.defaultOption=Custom pipeline.defaultOption=Custom
pipeline.submitButton=Submit pipeline.submitButton=Submit
pipeline.help=Pipeline Help
pipeline.scanHelp=Folder Scanning Help
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,6 +112,7 @@ navbar.settings=Настройки
############# #############
settings.title=Настройки settings.title=Настройки
settings.update=Налична актуализация settings.update=Налична актуализация
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Версия на приложението: settings.appVersion=Версия на приложението:
settings.downloadOption.title=Изберете опция за изтегляне (за изтегляния на един файл без да е архивиран): settings.downloadOption.title=Изберете опция за изтегляне (за изтегляния на един файл без да е архивиран):
settings.downloadOption.1=Отваряне в същия прозорец settings.downloadOption.1=Отваряне в същия прозорец
@@ -105,8 +121,9 @@ settings.downloadOption.3=Изтегли файл
settings.zipThreshold=Архивирайте файловете, когато броят на изтеглените файлове надвишава settings.zipThreshold=Архивирайте файловете, когато броят на изтеглените файлове надвишава
settings.signOut=Изход settings.signOut=Изход
settings.accountSettings=Настройки на акаунта settings.accountSettings=Настройки на акаунта
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Промяна на идентификационните данни changeCreds.title=Промяна на идентификационните данни
changeCreds.header=Актуализирайте данните за акаунта си changeCreds.header=Актуализирайте данните за акаунта си
@@ -145,6 +162,7 @@ adminUserSettings.header=Настройки за администраторск
adminUserSettings.admin=Администратор adminUserSettings.admin=Администратор
adminUserSettings.user=Потребител adminUserSettings.user=Потребител
adminUserSettings.addUser=Добавяне на нов потребител adminUserSettings.addUser=Добавяне на нов потребител
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
adminUserSettings.roles=Роли adminUserSettings.roles=Роли
adminUserSettings.role=Роля adminUserSettings.role=Роля
adminUserSettings.actions=Действия adminUserSettings.actions=Действия
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Преобразуване към единична стр
pageExtracter.title=Extract Pages pageExtracter.title=Extract Pages
pageExtracter.header=Extract Pages pageExtracter.header=Extract Pages
pageExtracter.submit=Extract pageExtracter.submit=Extract
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -753,11 +772,23 @@ merge.submit=Обединяване
pdfOrganiser.title=Организатор на страници pdfOrganiser.title=Организатор на страници
pdfOrganiser.header=Организатор на PDF страници pdfOrganiser.header=Организатор на PDF страници
pdfOrganiser.submit=Пренареждане на страниците 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)
#multiTool #multiTool
multiTool.title=PDF Мулти инструмент multiTool.title=PDF Мулти инструмент
multiTool.header=PDF Мулти инструмент multiTool.header=PDF Мулти инструмент
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=View PDF
@@ -768,6 +799,7 @@ pageRemover.title=Премахване на страници
pageRemover.header=Премахване на PDF страници pageRemover.header=Премахване на PDF страници
pageRemover.pagesToDelete=Страници за изтриване (Въведете списък с номера на страници, разделени със запетая) : pageRemover.pagesToDelete=Страници за изтриване (Въведете списък с номера на страници, разделени със запетая) :
pageRemover.submit=Изтриване на страници pageRemover.submit=Изтриване на страници
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=Изберете ъгъл на въртене (кратно
rotate.submit=Завъртане rotate.submit=Завъртане
#merge #split-pdfs
split.title=Разделяне на PDF split.title=Разделяне на PDF
split.header=Разделяне на PDF split.header=Разделяне на PDF
split.desc.1=Числата, които избирате, са номера на страницата, на която искате да направите разделяне split.desc.1=Числата, които избирате, са номера на страницата, на която искате да направите разделяне
split.desc.2=Така че избирането на 1,3,7-8 ще раздели документ от 10 страници на 6 отделни PDF файла с: split.desc.2=Така че избирането на 1,3,7-9 ще раздели документ от 10 страници на 6 отделни PDF файла с:
split.desc.3=Документ #1: Страница 1 split.desc.3=Документ #1: Страница 1
split.desc.4=Документ #2: Страница 2 и 3 split.desc.4=Документ #2: Страница 2 и 3
split.desc.5=Документ #3: Страница 4, 5 и 6 split.desc.5=Документ #3: Страница 4, 5, 6 и 7
split.desc.6=Документ #4: Страница 7 split.desc.6=Документ #4: Страница 8
split.desc.7=Документ #5: Страница 8 split.desc.7=Документ #5: Страница 9
split.desc.8=Документ #6: Страница 9 и 10 split.desc.8=Документ #6: Страница 10
split.splitPages=Въведете страници за разделяне: split.splitPages=Въведете страници за разделяне:
split.submit=Разделяне split.submit=Разделяне
@@ -855,6 +887,8 @@ watermark.selectText.7=Непрозрачност (0% - 100%):
watermark.selectText.8=Тип воден знак: watermark.selectText.8=Тип воден знак:
watermark.selectText.9=Изображение за воден знак: watermark.selectText.9=Изображение за воден знак:
watermark.submit=Добавяне на воден знак watermark.submit=Добавяне на воден знак
watermark.type.1=Text
watermark.type.2=Image
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDF към PDF/A
pdfToPDFA.header=PDF към PDF/A pdfToPDFA.header=PDF към PDF/A
pdfToPDFA.credit=Тази услуга използва OCRmyPDF за PDF/A преобразуване. pdfToPDFA.credit=Тази услуга използва OCRmyPDF за PDF/A преобразуване.
pdfToPDFA.submit=Преобразуване pdfToPDFA.submit=Преобразуване
pdfToPDFA.tip=Currently does not work for multiple inputs at once
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=Преобразуване
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF към HTML PDFToHTML.title=PDF към HTML
PDFToHTML.header=PDF към HTML PDFToHTML.header=PDF към HTML
PDFToHTML.credit=Тази услуга използва LibreOffice за преобразуване на файлове. PDFToHTML.credit=Тази услуга използва pdftohtml за преобразуване на файлове.
PDFToHTML.submit=Преобразуване PDFToHTML.submit=Преобразуване
@@ -989,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses
@@ -998,3 +1042,16 @@ licenses.version=Version
licenses.license=License 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

View File

@@ -17,6 +17,7 @@ true=Verdader
false=Fals false=Fals
unknown=Desconegut unknown=Desconegut
save=Desa save=Desa
saveToBrowser=Save to Browser
close=Tanca close=Tanca
filesSelected=fitxers seleccionats filesSelected=fitxers seleccionats
noFavourites=No s'ha afegit cap favorit noFavourites=No s'ha afegit cap favorit
@@ -53,18 +54,32 @@ notAuthenticatedMessage=User not authenticated.
userNotFoundMessage=User not found. userNotFoundMessage=User not found.
incorrectPasswordMessage=Current password is incorrect. incorrectPasswordMessage=Current password is incorrect.
usernameExistsMessage=New Username already exists. usernameExistsMessage=New Username already exists.
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Cannot delete currently logged in user.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. 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
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Pipeline Menu (Beta)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Upload Custom
pipeline.configureButton=Configure pipeline.configureButton=Configure
pipeline.defaultOption=Custom pipeline.defaultOption=Custom
pipeline.submitButton=Submit pipeline.submitButton=Submit
pipeline.help=Pipeline Help
pipeline.scanHelp=Folder Scanning Help
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,6 +112,7 @@ navbar.settings=Opcions
############# #############
settings.title=Opcions settings.title=Opcions
settings.update=Actualització Disponible settings.update=Actualització Disponible
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Versió App: settings.appVersion=Versió App:
settings.downloadOption.title=Trieu l'opció de descàrrega (per a descàrregues d'un sol fitxer no zip): settings.downloadOption.title=Trieu l'opció de descàrrega (per a descàrregues d'un sol fitxer no zip):
settings.downloadOption.1=Obre mateixa finestra settings.downloadOption.1=Obre mateixa finestra
@@ -105,8 +121,9 @@ settings.downloadOption.3=Descarrega Arxiu
settings.zipThreshold=Comprimiu els fitxers quan el nombre de fitxers baixats superi settings.zipThreshold=Comprimiu els fitxers quan el nombre de fitxers baixats superi
settings.signOut=Sortir settings.signOut=Sortir
settings.accountSettings=Account Settings settings.accountSettings=Account Settings
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -145,6 +162,7 @@ adminUserSettings.header=Usuari Admin Opcions Control
adminUserSettings.admin=Admin adminUserSettings.admin=Admin
adminUserSettings.user=Usuari adminUserSettings.user=Usuari
adminUserSettings.addUser=Afegir Usuari adminUserSettings.addUser=Afegir Usuari
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
adminUserSettings.roles=Rols adminUserSettings.roles=Rols
adminUserSettings.role=Rol adminUserSettings.role=Rol
adminUserSettings.actions=Accions adminUserSettings.actions=Accions
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Convert To Single Page
pageExtracter.title=Extract Pages pageExtracter.title=Extract Pages
pageExtracter.header=Extract Pages pageExtracter.header=Extract Pages
pageExtracter.submit=Extract pageExtracter.submit=Extract
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -753,11 +772,23 @@ merge.submit=Fusiona
pdfOrganiser.title=Organitzador de pàgines pdfOrganiser.title=Organitzador de pàgines
pdfOrganiser.header=Organitzador de pàgines PDF pdfOrganiser.header=Organitzador de pàgines PDF
pdfOrganiser.submit=Reorganitza Pàgines pdfOrganiser.submit=Reorganitza Pàgines
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)
#multiTool #multiTool
multiTool.title=PDF Multi Tool multiTool.title=PDF Multi Tool
multiTool.header=PDF Multi Tool multiTool.header=PDF Multi Tool
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=View PDF
@@ -768,6 +799,7 @@ pageRemover.title=Eliminació Pàgines
pageRemover.header=Eliminació Pàgines PDF pageRemover.header=Eliminació Pàgines PDF
pageRemover.pagesToDelete=Pàgines a esborrar (Números de pàgina) : pageRemover.pagesToDelete=Pàgines a esborrar (Números de pàgina) :
pageRemover.submit=Esborra Pàgines pageRemover.submit=Esborra Pàgines
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=Selecciona l'angle de gir (en múltiples de 90 graus):
rotate.submit=Rota rotate.submit=Rota
#merge #split-pdfs
split.title=Divideix PDF split.title=Divideix PDF
split.header=Divideix PDF split.header=Divideix PDF
split.desc.1=Els números seleccionats són el número de pàgina en què voleu fer la divisió split.desc.1=Els números seleccionats són el número de pàgina en què voleu fer la divisió
split.desc.2=Per tant, seleccionant 1,3,7-8 dividiria un document de 10 pàgines en 6 PDFS separats amb: split.desc.2=Per tant, seleccionant 1,3,7-9 dividiria un document de 10 pàgines en 6 PDFS separats amb:
split.desc.3=Document #1: Pàgina 1 split.desc.3=Document #1: Pàgina 1
split.desc.4=Document #2: Pàgina 2 i 3 split.desc.4=Document #2: Pàgina 2 i 3
split.desc.5=Document #3: Pàgina 4, 5 i 6 split.desc.5=Document #3: Pàgina 4, 5, 6 i 7
split.desc.6=Document #4: Pàgina 7 split.desc.6=Document #4: Pàgina 8
split.desc.7=Document #5: Pàgina 8 split.desc.7=Document #5: Pàgina 9
split.desc.8=Document #6: Pàgina 9 i 10 split.desc.8=Document #6: Pàgina 10
split.splitPages=Introdueix pàgines per dividir-les: split.splitPages=Introdueix pàgines per dividir-les:
split.submit=Divideix split.submit=Divideix
@@ -855,6 +887,8 @@ watermark.selectText.7=Opacitat (0% - 100%):
watermark.selectText.8=Watermark Type: watermark.selectText.8=Watermark Type:
watermark.selectText.9=Watermark Image: watermark.selectText.9=Watermark Image:
watermark.submit=Afegir Marca d'Aigua watermark.submit=Afegir Marca d'Aigua
watermark.type.1=Text
watermark.type.2=Image
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDF a PDF/A
pdfToPDFA.header=PDF a PDF/A pdfToPDFA.header=PDF a PDF/A
pdfToPDFA.credit=Utilitza OCRmyPDF per la conversió a PDF/A pdfToPDFA.credit=Utilitza OCRmyPDF per la conversió a PDF/A
pdfToPDFA.submit=Converteix pdfToPDFA.submit=Converteix
pdfToPDFA.tip=Currently does not work for multiple inputs at once
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=Converteix
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF a HTML PDFToHTML.title=PDF a HTML
PDFToHTML.header=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 PDFToHTML.submit=Converteix
@@ -989,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses
@@ -998,3 +1042,16 @@ licenses.version=Version
licenses.license=License 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

View File

@@ -8,7 +8,7 @@ pdfPrompt=PDF auswählen
multiPdfPrompt=PDFs auswählen(2+) multiPdfPrompt=PDFs auswählen(2+)
multiPdfDropPrompt=Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin) multiPdfDropPrompt=Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin)
imgPrompt=Wählen Sie ein Bild imgPrompt=Wählen Sie ein Bild
genericSubmit=Einreichen genericSubmit=Absenden
processTimeWarning=Achtung: Abhängig von der Dateigröße kann dieser Prozess bis zu einer Minute dauern processTimeWarning=Achtung: Abhängig von der Dateigröße kann dieser Prozess bis zu einer Minute dauern
pageOrderPrompt=Seitenreihenfolge (Geben Sie eine durch Komma getrennte Liste von Seitenzahlen ein): pageOrderPrompt=Seitenreihenfolge (Geben Sie eine durch Komma getrennte Liste von Seitenzahlen ein):
pageSelectionPrompt=Benutzerdefinierte Seitenauswahl (Geben Sie eine durch Kommas getrennte Liste von Seitenzahlen 1,5,6 oder Funktionen wie 2n+1 ein): pageSelectionPrompt=Benutzerdefinierte Seitenauswahl (Geben Sie eine durch Kommas getrennte Liste von Seitenzahlen 1,5,6 oder Funktionen wie 2n+1 ein):
@@ -17,10 +17,11 @@ true=Wahr
false=Falsch false=Falsch
unknown=Unbekannt unknown=Unbekannt
save=Speichern save=Speichern
saveToBrowser=Im Browser speichern
close=Schließen close=Schließen
filesSelected=Dateien ausgewählt filesSelected=Dateien ausgewählt
noFavourites=Keine Favoriten hinzugefügt noFavourites=Keine Favoriten hinzugefügt
downloadComplete=Download Complete downloadComplete=Download abgeschlossen
bored=Langeweile beim Warten? bored=Langeweile beim Warten?
alphabet=Alphabet alphabet=Alphabet
downloadPdf=PDF herunterladen downloadPdf=PDF herunterladen
@@ -53,30 +54,44 @@ notAuthenticatedMessage=Benutzer nicht authentifiziert.
userNotFoundMessage=Benutzer nicht gefunden. userNotFoundMessage=Benutzer nicht gefunden.
incorrectPasswordMessage=Das Passwort ist falsch. incorrectPasswordMessage=Das Passwort ist falsch.
usernameExistsMessage=Neuer Benutzername existiert bereits. 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. deleteCurrentUserMessage=Der aktuell angemeldete Benutzer kann nicht gelöscht werden.
deleteUsernameExistsMessage=Der Benutzername existiert nicht und kann nicht gelöscht werden. deleteUsernameExistsMessage=Der Benutzername existiert nicht und kann nicht gelöscht werden.
error=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
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline-Menü (Alpha) pipeline.header=Pipeline-Menü (Beta)
pipeline.uploadButton=Benutzerdefinierter Upload pipeline.uploadButton=Benutzerdefinierter Upload
pipeline.configureButton=Konfigurieren pipeline.configureButton=Konfigurieren
pipeline.defaultOption=Benutzerdefiniert pipeline.defaultOption=Benutzerdefiniert
pipeline.submitButton=Speichern pipeline.submitButton=Speichern
pipeline.help=Hilfe für Pipeline
pipeline.scanHelp=Hilfe zum Ordnerscan
###################### ######################
# Pipeline Options # # Pipeline Options #
###################### ######################
pipelineOptions.header=Pipeline-Konfiguration pipelineOptions.header=Pipeline-Konfiguration
pipelineOptions.pipelineNameLabel=Pipeline-Name pipelineOptions.pipelineNameLabel=Pipeline-Name
pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.saveSettings=Operations-Einstellungen speichern
pipelineOptions.pipelineNamePrompt=Geben Sie hier den Namen der Pipeline ein pipelineOptions.pipelineNamePrompt=Geben Sie hier den Namen der Pipeline ein
pipelineOptions.selectOperation=Vorgang auswählen pipelineOptions.selectOperation=Vorgang auswählen
pipelineOptions.addOperationButton=Vorgang hinzufügen pipelineOptions.addOperationButton=Vorgang hinzufügen
pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.pipelineHeader=Pipeline:
pipelineOptions.saveButton=Downloaden pipelineOptions.saveButton=Herunterladen
pipelineOptions.validateButton=Validieren pipelineOptions.validateButton=Validieren
@@ -88,7 +103,7 @@ pipelineOptions.validateButton=Validieren
navbar.convert=Konvertieren navbar.convert=Konvertieren
navbar.security=Sicherheit navbar.security=Sicherheit
navbar.other=Anderes navbar.other=Anderes
navbar.darkmode=Dark Mode navbar.darkmode=Dunkler Modus
navbar.pageOps=Seitenoperationen navbar.pageOps=Seitenoperationen
navbar.settings=Einstellungen navbar.settings=Einstellungen
@@ -97,6 +112,7 @@ navbar.settings=Einstellungen
############# #############
settings.title=Einstellungen settings.title=Einstellungen
settings.update=Update verfügbar settings.update=Update verfügbar
settings.updateAvailable={0} ist die aktuelle installierte Version. Eine neue Version ({1}) ist verfügbar.
settings.appVersion=App-Version: settings.appVersion=App-Version:
settings.downloadOption.title=Download-Option wählen (für einzelne Dateien, die keine Zip-Downloads sind): settings.downloadOption.title=Download-Option wählen (für einzelne Dateien, die keine Zip-Downloads sind):
settings.downloadOption.1=Im selben Fenster öffnen settings.downloadOption.1=Im selben Fenster öffnen
@@ -105,12 +121,13 @@ settings.downloadOption.3=Datei herunterladen
settings.zipThreshold=Dateien komprimieren, wenn die Anzahl der heruntergeladenen Dateien überschritten wird settings.zipThreshold=Dateien komprimieren, wenn die Anzahl der heruntergeladenen Dateien überschritten wird
settings.signOut=Abmelden settings.signOut=Abmelden
settings.accountSettings=Kontoeinstellungen settings.accountSettings=Kontoeinstellungen
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Anmeldeinformationen ändern changeCreds.title=Anmeldeinformationen ändern
changeCreds.header=Aktualisieren Sie Ihre Kontodaten changeCreds.header=Aktualisieren Sie Ihre Kontodaten
changeCreds.changePassword=You are using default login credentials. Please enter a new password changeCreds.changePassword=Sie verwenden die Standard-Zugangsdaten. Bitte geben Sie ein neues Passwort ein.
changeCreds.newUsername=Neuer Benutzername changeCreds.newUsername=Neuer Benutzername
changeCreds.oldPassword=Aktuelles Passwort changeCreds.oldPassword=Aktuelles Passwort
changeCreds.newPassword=Neues Passwort changeCreds.newPassword=Neues Passwort
@@ -131,7 +148,7 @@ account.newPassword=Neues Passwort
account.changePassword=Passwort ändern account.changePassword=Passwort ändern
account.confirmNewPassword=Neues Passwort bestätigen account.confirmNewPassword=Neues Passwort bestätigen
account.signOut=Abmelden account.signOut=Abmelden
account.yourApiKey=Dein API Schlüssel account.yourApiKey=Dein API-Schlüssel
account.syncTitle=Browsereinstellungen mit Konto synchronisieren account.syncTitle=Browsereinstellungen mit Konto synchronisieren
account.settingsCompare=Einstellungen vergleichen: account.settingsCompare=Einstellungen vergleichen:
account.property=Eigenschaft account.property=Eigenschaft
@@ -142,9 +159,10 @@ account.syncToAccount=Synchronisiere Konto <- Browser
adminUserSettings.title=Benutzerkontrolle adminUserSettings.title=Benutzerkontrolle
adminUserSettings.header=Administrator-Benutzerkontrolle adminUserSettings.header=Administrator-Benutzerkontrolle
adminUserSettings.admin=Admin adminUserSettings.admin=Administrator
adminUserSettings.user=Benutzer adminUserSettings.user=Benutzer
adminUserSettings.addUser=Neuen Benutzer hinzufügen adminUserSettings.addUser=Neuen Benutzer hinzufügen
adminUserSettings.usernameInfo=Der Benutzername darf nur Buchstaben und Zahlen enthalten, keine Leerzeichen oder Sonderzeichen.
adminUserSettings.roles=Rollen adminUserSettings.roles=Rollen
adminUserSettings.role=Rolle adminUserSettings.role=Rolle
adminUserSettings.actions=Aktion adminUserSettings.actions=Aktion
@@ -165,96 +183,96 @@ home.searchBar=Suche nach Funktionen...
home.viewPdf.title=PDF anzeigen home.viewPdf.title=PDF anzeigen
home.viewPdf.desc=Anzeigen, Kommentieren, Text oder Bilder hinzufügen home.viewPdf.desc=Anzeigen, Kommentieren, Text oder Bilder hinzufügen
viewPdf.tags=view,read,annotate,text,image viewPdf.tags=anzeigen,lesen,kommentieren,text,bild
home.multiTool.title=PDF-Multitool home.multiTool.title=PDF-Multitool
home.multiTool.desc=Seiten zusammenführen, drehen, neu anordnen und entfernen home.multiTool.desc=Seiten zusammenführen, drehen, neu anordnen und entfernen
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
home.merge.title=Zusammenführen home.merge.title=Zusammenführen
home.merge.desc=Mehrere PDF-Dateien zu einer einzigen zusammenführen. home.merge.desc=Mehrere PDF-Dateien zu einer einzigen zusammenführen
merge.tags=merge,Page operations,Back end,server side merge.tags=zusammenführen,seitenvorgänge,back end,serverseite
home.split.title=Aufteilen home.split.title=Aufteilen
home.split.desc=PDFs in mehrere Dokumente aufteilen. home.split.desc=PDFs in mehrere Dokumente aufteilen
split.tags=Page operations,divide,Multi Page,cut,server side split.tags=seitenoperationen,teilen,mehrseitig,ausschneiden,serverseitig
home.rotate.title=Drehen home.rotate.title=Drehen
home.rotate.desc=Drehen Sie Ihre PDFs ganz einfach. home.rotate.desc=Drehen Sie Ihre PDFs ganz einfach
rotate.tags=server side rotate.tags=serverseitig
home.imageToPdf.title=Bild zu PDF home.imageToPdf.title=Bild zu PDF
home.imageToPdf.desc=Konvertieren Sie ein Bild (PNG, JPEG, GIF) in ein PDF. home.imageToPdf.desc=Konvertieren Sie ein Bild (PNG, JPEG, GIF) in ein PDF
imageToPdf.tags=conversion,img,jpg,picture,photo imageToPdf.tags=konvertierung,img,jpg,bild,foto
home.pdfToImage.title=PDF zu Bild home.pdfToImage.title=PDF zu Bild
home.pdfToImage.desc=Konvertieren Sie ein PDF in ein Bild (PNG, JPEG, GIF). home.pdfToImage.desc=Konvertieren Sie ein PDF in ein Bild (PNG, JPEG, GIF)
pdfToImage.tags=conversion,img,jpg,picture,photo pdfToImage.tags=konvertierung,img,jpg,bild,foto
home.pdfOrganiser.title=Organisieren home.pdfOrganiser.title=Organisieren
home.pdfOrganiser.desc=Seiten entfernen und Seitenreihenfolge ändern. home.pdfOrganiser.desc=Seiten entfernen und Seitenreihenfolge ändern
pdfOrganiser.tags=duplex,even,odd,sort,move pdfOrganiser.tags=duplex,gerade,ungerade,sortieren,verschieben
home.addImage.title=Bild einfügen home.addImage.title=Bild einfügen
home.addImage.desc=Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit). home.addImage.desc=Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit)
addImage.tags=img,jpg,picture,photo addImage.tags=img,jpg,bild,foto
home.watermark.title=Wasserzeichen hinzufügen home.watermark.title=Wasserzeichen hinzufügen
home.watermark.desc=Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu. home.watermark.desc=Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo watermark.tags=text,wiederholend,beschriftung,besitzen,urheberrecht,marke,img,jpg,bild,foto
home.permissions.title=Berechtigungen ändern home.permissions.title=Berechtigungen ändern
home.permissions.desc=Die Berechtigungen für Ihr PDF-Dokument verändern. home.permissions.desc=Die Berechtigungen für Ihr PDF-Dokument verändern
permissions.tags=read,write,edit,print permissions.tags=lesen,schreiben,bearbeiten,drucken
home.removePages.title=Entfernen home.removePages.title=Entfernen
home.removePages.desc=Ungewollte Seiten aus dem PDF entfernen. home.removePages.desc=Ungewollte Seiten aus dem PDF entfernen
removePages.tags=Remove pages,delete pages removePages.tags=seiten entfernen,seiten löschen
home.addPassword.title=Passwort hinzufügen home.addPassword.title=Passwort hinzufügen
home.addPassword.desc=Das PDF mit einem Passwort verschlüsseln. home.addPassword.desc=Das PDF mit einem Passwort verschlüsseln
addPassword.tags=secure,security addPassword.tags=sicher,sicherheit
home.removePassword.title=Passwort entfernen home.removePassword.title=Passwort entfernen
home.removePassword.desc=Den Passwortschutz eines PDFs entfernen. home.removePassword.desc=Den Passwortschutz eines PDFs entfernen
removePassword.tags=secure,Decrypt,security,unpassword,delete password removePassword.tags=sichern,entschlüsseln,sicherheit,passwort aufheben,passwort löschen
home.compressPdfs.title=Komprimieren home.compressPdfs.title=Komprimieren
home.compressPdfs.desc=PDF komprimieren um die Dateigröße zu reduzieren. home.compressPdfs.desc=PDF komprimieren um die Dateigröße zu reduzieren
compressPdfs.tags=squish,small,tiny compressPdfs.tags=komprimieren,verkleinern,minimieren
home.changeMetadata.title=Metadaten ändern home.changeMetadata.title=Metadaten ändern
home.changeMetadata.desc=Ändern/Entfernen/Hinzufügen von Metadaten aus einem PDF-Dokument home.changeMetadata.desc=Ändern/Entfernen/Hinzufügen von Metadaten aus einem PDF-Dokument
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats changeMetadata.tags==titel,autor,datum,erstellung,uhrzeit,herausgeber,produzent,statistiken
home.fileToPDF.title=Datei in PDF konvertieren home.fileToPDF.title=Datei in PDF konvertieren
home.fileToPDF.desc=Konvertieren Sie nahezu jede Datei in PDF (DOCX, PNG, XLS, PPT, TXT und mehr) home.fileToPDF.desc=Konvertieren Sie nahezu jede Datei in PDF (DOCX, PNG, XLS, PPT, TXT und mehr)
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint fileToPDF.tags=transformation,format,dokument,bild,folie,text,konvertierung,büro,dokumente,word,excel,powerpoint
home.ocr.title=Führe OCR/Cleanup-Scans aus home.ocr.title=Führe OCR/Cleanup-Scans aus
home.ocr.desc=Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fügt ihn erneut als Text hinzu. home.ocr.desc=Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fügt ihn erneut als Text hinzu
ocr.tags=recognition,text,image,scan,read,identify,detection,editable ocr.tags=erkennung,text,bild,scannen,lesen,identifizieren,erkennung,bearbeitbar
home.extractImages.title=Bilder extrahieren home.extractImages.title=Bilder extrahieren
home.extractImages.desc=Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Archiv home.extractImages.desc=Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Archiv
extractImages.tags=picture,photo,save,archive,zip,capture,grab extractImages.tags=bild,foto,speichern,archivieren,zippen,erfassen,greifen
home.pdfToPDFA.title=PDF zu PDF/A konvertieren home.pdfToPDFA.title=PDF zu PDF/A konvertieren
home.pdfToPDFA.desc=PDF zu PDF/A für Langzeitarchivierung konvertieren home.pdfToPDFA.desc=PDF zu PDF/A für Langzeitarchivierung konvertieren
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation pdfToPDFA.tags=archiv,langfristig,standard,konvertierung,speicherung,aufbewahrung
home.PDFToWord.title=PDF zu Word home.PDFToWord.title=PDF zu Word
home.PDFToWord.desc=PDF in Word-Formate konvertieren (DOC, DOCX und ODT) home.PDFToWord.desc=PDF in Word-Formate konvertieren (DOC, DOCX und ODT)
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile PDFToWord.tags=doc,docx,odt,word,transformation,format,konvertierung,office,microsoft,docfile
home.PDFToPresentation.title=PDF zu Präsentation home.PDFToPresentation.title=PDF zu Präsentation
home.PDFToPresentation.desc=PDF in Präsentationsformate konvertieren (PPT, PPTX und ODP) home.PDFToPresentation.desc=PDF in Präsentationsformate konvertieren (PPT, PPTX und ODP)
PDFToPresentation.tags=slides,show,office,microsoft PDFToPresentation.tags=folien,show,büro,microsoft
home.PDFToText.title=PDF in Text/RTF home.PDFToText.title=PDF in Text/RTF
home.PDFToText.desc=PDF in Text- oder RTF-Format konvertieren home.PDFToText.desc=PDF in Text- oder RTF-Format konvertieren
@@ -262,88 +280,88 @@ PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDF in HTML home.PDFToHTML.title=PDF in HTML
home.PDFToHTML.desc=PDF in HTML-Format konvertieren home.PDFToHTML.desc=PDF in HTML-Format konvertieren
PDFToHTML.tags=web content,browser friendly PDFToHTML.tags=webinhalte,browserfreundlich
home.PDFToXML.title=PDF in XML home.PDFToXML.title=PDF in XML
home.PDFToXML.desc=PDF in XML-Format konvertieren home.PDFToXML.desc=PDF in XML-Format konvertieren
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert PDFToXML.tags=datenextraktion,strukturierter inhalt,interop,transformation,konvertierung
home.ScannerImageSplit.title=Gescannte Fotos erkennen/aufteilen home.ScannerImageSplit.title=Gescannte Fotos erkennen/aufteilen
home.ScannerImageSplit.desc=Teilt mehrere Fotos innerhalb eines Fotos/PDF home.ScannerImageSplit.desc=Teilt mehrere Fotos innerhalb eines Fotos/PDF
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize ScannerImageSplit.tags=separat,automatische erkennung,scans,mehrere fotos,organisieren
home.sign.title=Signieren home.sign.title=Signieren
home.sign.desc=Fügt PDF-Signaturen durch Zeichnung, Text oder Bild hinzu home.sign.desc=Fügt PDF-Signaturen durch Zeichnung, Text oder Bild hinzu
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature sign.tags=autorisieren,initialen,gezeichnete signatur,textzeichen,bildsignatur
home.flatten.title=Abflachen home.flatten.title=Abflachen
home.flatten.desc=Alle interaktiven Elemente und Formulare aus einem PDF entfernen home.flatten.desc=Alle interaktiven Elemente und Formulare aus einem PDF entfernen
flatten.tags=static,deactivate,non-interactive,streamline flatten.tags=statisch,deaktivieren,nicht interaktiv,optimieren
home.repair.title=Reparatur home.repair.title=Reparatur
home.repair.desc=Versucht, ein beschädigtes/kaputtes PDF zu reparieren home.repair.desc=Versucht, ein beschädigtes/kaputtes PDF zu reparieren
repair.tags=fix,restore,correction,recover repair.tags=reparieren,wiederherstellen,korrigieren,wiederherstellen
home.removeBlanks.title=Leere Seiten entfernen home.removeBlanks.title=Leere Seiten entfernen
home.removeBlanks.desc=Erkennt und entfernt leere Seiten aus einem Dokument home.removeBlanks.desc=Erkennt und entfernt leere Seiten aus einem Dokument
removeBlanks.tags=cleanup,streamline,non-content,organize removeBlanks.tags=aufräumen,rationalisieren,nicht inhaltsreich,organisieren
home.removeAnnotations.title=Anmerkungen entfernen home.removeAnnotations.title=Anmerkungen entfernen
home.removeAnnotations.desc=Entfernt alle Kommentare/Anmerkungen aus einem PDF home.removeAnnotations.desc=Entfernt alle Kommentare/Anmerkungen aus einem PDF
removeAnnotations.tags=comments,highlight,notes,markup,remove removeAnnotations.tags=kommentare,hervorheben,notizen,markieren,entfernen
home.compare.title=Vergleichen home.compare.title=Vergleichen
home.compare.desc=Vergleicht und zeigt die Unterschiede zwischen zwei PDF-Dokumenten an home.compare.desc=Vergleicht und zeigt die Unterschiede zwischen zwei PDF-Dokumenten an
compare.tags=differentiate,contrast,changes,analysis compare.tags=differenzieren,kontrastieren,verändern,analysieren
home.certSign.title=Mit Zertifikat signieren home.certSign.title=Mit Zertifikat signieren
home.certSign.desc=Ein PDF mit einem Zertifikat/Schlüssel (PEM/P12) signieren home.certSign.desc=Ein PDF mit einem Zertifikat/Schlüssel (PEM/P12) signieren
certSign.tags=authenticate,PEM,P12,official,encrypt certSign.tags=authentifizieren,pem,p12,offiziell,verschlüsseln
home.pageLayout.title=Mehrseitiges Layout home.pageLayout.title=Mehrseitiges Layout
home.pageLayout.desc=Mehrere Seiten eines PDF zu einer Seite zusammenführen home.pageLayout.desc=Mehrere Seiten eines PDF zu einer Seite zusammenführen
pageLayout.tags=merge,composite,single-view,organize pageLayout.tags=zusammenführen,zusammensetzen,einzelansicht,organisieren
home.scalePages.title=Seitengröße/Skalierung anpassen home.scalePages.title=Seitengröße/Skalierung anpassen
home.scalePages.desc=Größe/Skalierung der Seite und/oder des Inhalts ändern home.scalePages.desc=Größe/Skalierung der Seite und/oder des Inhalts ändern
scalePages.tags=resize,modify,dimension,adapt scalePages.tags=größe ändern,ändern,dimensionieren,anpassen
home.pipeline.title=Pipeline (Fortgeschritten) home.pipeline.title=Pipeline (Fortgeschritten)
home.pipeline.desc=Mehrere Aktionen auf ein PDF anwenden, definiert durch ein Pipeline Skript home.pipeline.desc=Mehrere Aktionen auf ein PDF anwenden, definiert durch ein Pipeline Skript
pipeline.tags=automate,sequence,scripted,batch-process pipeline.tags=automatisieren,sequenzieren,skriptgesteuert,batch prozess
home.add-page-numbers.title=Seitenzahlen hinzufügen home.add-page-numbers.title=Seitenzahlen hinzufügen
home.add-page-numbers.desc=Hinzufügen von Seitenzahlen an einer bestimmten Stelle home.add-page-numbers.desc=Hinzufügen von Seitenzahlen an einer bestimmten Stelle
add-page-numbers.tags=paginate,label,organize,index add-page-numbers.tags=paginieren,beschriften,organisieren,indizieren
home.auto-rename.title=PDF automatisch umbenennen home.auto-rename.title=PDF automatisch umbenennen
home.auto-rename.desc=PDF-Datei anhand von erkannten Kopfzeilen umbenennen home.auto-rename.desc=PDF-Datei anhand von erkannten Kopfzeilen umbenennen
auto-rename.tags=auto-detect,header-based,organize,relabel auto-rename.tags=automatisch erkennen,header basiert,organisieren,neu kennzeichnen
home.adjust-contrast.title=Farben/Kontrast anpassen home.adjust-contrast.title=Farben/Kontrast anpassen
home.adjust-contrast.desc=Kontrast, Sättigung und Helligkeit einer PDF anpassen home.adjust-contrast.desc=Kontrast, Sättigung und Helligkeit einer PDF anpassen
adjust-contrast.tags=color-correction,tune,modify,enhance adjust-contrast.tags=farbkorrektur,abstimmung,änderung,verbesserung
home.crop.title=PDF zuschneiden home.crop.title=PDF zuschneiden
home.crop.desc=PDF zuschneiden um die Größe zu verändern (Text bleibt erhalten!) home.crop.desc=PDF zuschneiden um die Größe zu verändern (Text bleibt erhalten!)
crop.tags=trim,shrink,edit,shape crop.tags=trimmen,verkleinern,bearbeiten,formen
home.autoSplitPDF.title=PDF automatisch teilen home.autoSplitPDF.title=PDF automatisch teilen
home.autoSplitPDF.desc=Physisch gescannte PDF anhand von Splitter-Seiten und QR-Codes aufteilen home.autoSplitPDF.desc=Physisch gescannte PDF anhand von Splitter-Seiten und QR-Codes aufteilen
autoSplitPDF.tags=QR-based,separate,scan-segment,organize autoSplitPDF.tags=qr basiert,trennen,segment scannen,organisieren
home.sanitizePdf.title=PDF Bereinigen home.sanitizePdf.title=PDF Bereinigen
home.sanitizePdf.desc=Entfernen von Skripten und anderen Elementen aus PDF-Dateien home.sanitizePdf.desc=Entfernen von Skripten und anderen Elementen aus PDF-Dateien
sanitizePdf.tags=clean,secure,safe,remove-threats sanitizePdf.tags=sauber,sicher,sicher,bedrohungen entfernen
home.URLToPDF.title=URL/Website zu PDF home.URLToPDF.title=URL/Website zu PDF
home.URLToPDF.desc=Konvertiert jede http(s)URL zu PDF home.URLToPDF.desc=Konvertiert jede http(s)URL zu PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive URLToPDF.tags=web capture,seite speichern,web to doc,archiv
home.HTMLToPDF.title=HTML zu PDF home.HTMLToPDF.title=HTML zu PDF
home.HTMLToPDF.desc=Konvertiert jede HTML-Datei oder Zip-Archiv zu PDF home.HTMLToPDF.desc=Konvertiert jede HTML-Datei oder Zip-Archiv zu PDF
HTMLToPDF.tags=markup,web-content,transformation,convert HTMLToPDF.tags=markup,webinhalt,transformation,konvertierung
home.MarkdownToPDF.title=Markdown zu PDF home.MarkdownToPDF.title=Markdown zu PDF
@@ -358,17 +376,17 @@ getPdfInfo.tags=infomation,daten,statistik
home.extractPage.title=Seite(n) extrahieren home.extractPage.title=Seite(n) extrahieren
home.extractPage.desc=Extrahiert ausgewählte Seiten aus einer PDF home.extractPage.desc=Extrahiert ausgewählte Seiten aus einer PDF
extractPage.tags=extrahieren extractPage.tags=extrahieren,seite
home.PdfToSinglePage.title=PDF zu einer Seite zusammenfassen home.PdfToSinglePage.title=PDF zu einer Seite zusammenfassen
home.PdfToSinglePage.desc=Fügt alle PDF-Seiten zu einer einzigen großen Seite zusammen home.PdfToSinglePage.desc=Fügt alle PDF-Seiten zu einer einzigen großen Seite zusammen
PdfToSinglePage.tags=einzelseite PdfToSinglePage.tags=einzelseite,zusammenfassen
home.showJS.title=Javascript anzeigen home.showJS.title=Javascript anzeigen
home.showJS.desc=Alle Javascript Funktionen in einer PDF anzeigen home.showJS.desc=Alle Javascript Funktionen in einer PDF anzeigen
showJS.tags=JS showJS.tags=js,javascript
home.autoRedact.title=Automatisch zensieren/schwärzen home.autoRedact.title=Automatisch zensieren/schwärzen
home.autoRedact.desc=Automatisches Zensieren (Schwärzen) von Text in einer PDF-Datei basierend auf dem eingegebenen Text home.autoRedact.desc=Automatisches Zensieren (Schwärzen) von Text in einer PDF-Datei basierend auf dem eingegebenen Text
@@ -376,7 +394,7 @@ autoRedact.tags=zensieren,schwärzen
home.tableExtraxt.title=Tabelle extrahieren home.tableExtraxt.title=Tabelle extrahieren
home.tableExtraxt.desc=Tabelle aus PDF in CSV extrahieren home.tableExtraxt.desc=Tabelle aus PDF in CSV extrahieren
tableExtraxt.tags=CSV tableExtraxt.tags=CSV,tabelle,extrahieren
home.autoSizeSplitPDF.title=Teilen nach Größe/Anzahl home.autoSizeSplitPDF.title=Teilen nach Größe/Anzahl
@@ -394,16 +412,16 @@ split-by-sections.tags=abschnitte,teilen,bearbeiten
home.AddStampRequest.title=Stempel zu PDF hinzufügen home.AddStampRequest.title=Stempel zu PDF hinzufügen
home.AddStampRequest.desc=Fügen Sie an festgelegten Stellen Text oder Bildstempel hinzu home.AddStampRequest.desc=Fügen Sie an festgelegten Stellen Text oder Bildstempel hinzu
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize AddStampRequest.tags=stempeln,bild hinzufügen,bild zentrieren,wasserzeichen,pdf,einbetten,anpassen
home.PDFToBook.title=PDF to Book home.PDFToBook.title=PDF zum Buch
home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre 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=Book to PDF home.BookToPDF.title=Buch als PDF
home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre 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
########################### ###########################
@@ -416,9 +434,9 @@ login.title=Anmelden
login.header=Anmelden login.header=Anmelden
login.signin=Anmelden login.signin=Anmelden
login.rememberme=Angemeldet bleiben login.rememberme=Angemeldet bleiben
login.invalid=Ungültiger Benutzername oder Passwort. login.invalid=Benutzername oder Passwort ungültig.
login.locked=Ihr Konto wurde gesperrt. login.locked=Ihr Konto wurde gesperrt.
login.signinTitle=Bitte melden Sie sich an login.signinTitle=Bitte melden Sie sich an.
#auto-redact #auto-redact
@@ -429,7 +447,7 @@ autoRedact.textsToRedactLabel=Zu zensierender Text (einer pro Zeile)
autoRedact.textsToRedactPlaceholder=z.B. \nVertraulich \nStreng geheim autoRedact.textsToRedactPlaceholder=z.B. \nVertraulich \nStreng geheim
autoRedact.useRegexLabel=Regex verwenden autoRedact.useRegexLabel=Regex verwenden
autoRedact.wholeWordSearchLabel=Ganzes Wort suchen autoRedact.wholeWordSearchLabel=Ganzes Wort suchen
autoRedact.customPaddingLabel=Benutzerdefinierte Extra-Padding autoRedact.customPaddingLabel=Zensierten Bereich vergrößern
autoRedact.convertPDFToImageLabel=PDF in PDF-Bild konvertieren (zum Entfernen von Text hinter dem Kasten) autoRedact.convertPDFToImageLabel=PDF in PDF-Bild konvertieren (zum Entfernen von Text hinter dem Kasten)
autoRedact.submitButton=Zensieren autoRedact.submitButton=Zensieren
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Zusammenfassen
pageExtracter.title=Seiten extrahieren pageExtracter.title=Seiten extrahieren
pageExtracter.header=Seiten extrahieren pageExtracter.header=Seiten extrahieren
pageExtracter.submit=Extrahieren pageExtracter.submit=Extrahieren
pageExtracter.placeholder=(z.B. 1,2,8 oder 4,7,12-16 oder 2n-1)
#getPdfInfo #getPdfInfo
@@ -482,16 +501,16 @@ HTMLToPDF.header=HTML zu PDF
HTMLToPDF.help=Akzeptiert HTML-Dateien und ZIPs mit html/css/images etc. HTMLToPDF.help=Akzeptiert HTML-Dateien und ZIPs mit html/css/images etc.
HTMLToPDF.submit=Konvertieren HTMLToPDF.submit=Konvertieren
HTMLToPDF.credit=Verwendet WeasyPrint HTMLToPDF.credit=Verwendet WeasyPrint
HTMLToPDF.zoom=Zoomstufe zur Darstellung der Website. HTMLToPDF.zoom=Zoomstufe zur Darstellung der Website
HTMLToPDF.pageWidth=Breite der Seite in Zentimetern. (Leer auf Standard) HTMLToPDF.pageWidth=Breite der Seite in Zentimetern (Leer auf Standard)
HTMLToPDF.pageHeight=Höhe der Seite in Zentimetern. (Leer auf Standard) HTMLToPDF.pageHeight=Höhe der Seite in Zentimetern (Leer auf Standard)
HTMLToPDF.marginTop=Oberer Rand der Seite in Millimetern. (Leer auf Standard) HTMLToPDF.marginTop=Oberer Rand der Seite in Millimetern (Leer auf Standard)
HTMLToPDF.marginBottom=Unterer Rand der Seite in Millimetern. (Leer auf Standard) HTMLToPDF.marginBottom=Unterer Rand der Seite in Millimetern (Leer auf Standard)
HTMLToPDF.marginLeft=Linker Rand der Seite in Millimetern. (Leer auf Standard) HTMLToPDF.marginLeft=Linker Rand der Seite in Millimetern (Leer auf Standard)
HTMLToPDF.marginRight=Linker Rand der Seite in Millimetern. (Leer auf Standard) HTMLToPDF.marginRight=Linker Rand der Seite in Millimetern (Leer auf Standard)
HTMLToPDF.printBackground=Den Hintergrund der Website rendern. HTMLToPDF.printBackground=Den Hintergrund der Website rendern
HTMLToPDF.defaultHeader=Standardkopfzeile aktivieren (Name und Seitenzahl) HTMLToPDF.defaultHeader=Standardkopfzeile aktivieren (Name und Seitenzahl)
HTMLToPDF.cssMediaType=CSS-Medientyp der Seite ändern. HTMLToPDF.cssMediaType=CSS-Medientyp der Seite ändern
HTMLToPDF.none=Keine HTMLToPDF.none=Keine
HTMLToPDF.print=Drucken HTMLToPDF.print=Drucken
HTMLToPDF.screen=Bildschirm HTMLToPDF.screen=Bildschirm
@@ -505,7 +524,7 @@ AddStampRequest.stampText=Stempeltext
AddStampRequest.stampImage=Stampelbild AddStampRequest.stampImage=Stampelbild
AddStampRequest.alphabet=Alphabet AddStampRequest.alphabet=Alphabet
AddStampRequest.fontSize=Schriftart/Bildgröße AddStampRequest.fontSize=Schriftart/Bildgröße
AddStampRequest.rotation=Rotation AddStampRequest.rotation=Drehung
AddStampRequest.opacity=Deckkraft AddStampRequest.opacity=Deckkraft
AddStampRequest.position=Position AddStampRequest.position=Position
AddStampRequest.overrideX=X-Koordinate überschreiben AddStampRequest.overrideX=X-Koordinate überschreiben
@@ -592,8 +611,8 @@ pageLayout.submit=Abschicken
#scalePages #scalePages
scalePages.title=Seitengröße anpassen scalePages.title=Seitengröße anpassen
scalePages.header=Seitengröße anpassen scalePages.header=Seitengröße anpassen
scalePages.pageSize=Format der Seiten des Dokuments. scalePages.pageSize=Format der Seiten des Dokuments
scalePages.scaleFactor=Zoomstufe (Ausschnitt) einer Seite. scalePages.scaleFactor=Zoomstufe (Ausschnitt) einer Seite
scalePages.submit=Abschicken scalePages.submit=Abschicken
@@ -639,17 +658,17 @@ compare.document.2=Dokument 2
compare.submit=Vergleichen compare.submit=Vergleichen
#BookToPDF #BookToPDF
BookToPDF.title=Books and Comics to PDF BookToPDF.title=Bücher und Comics zu PDF
BookToPDF.header=Book to PDF BookToPDF.header=Buch zu PDF
BookToPDF.credit=Uses Calibre BookToPDF.credit=Verwendet Calibre
BookToPDF.submit=Convert BookToPDF.submit=Konvertieren
#PDFToBook #PDFToBook
PDFToBook.title=PDF to Book PDFToBook.title=PDF zu Buch
PDFToBook.header=PDF to Book PDFToBook.header=PDF zu Buch
PDFToBook.selectText.1=Format PDFToBook.selectText.1=Format
PDFToBook.credit=Uses Calibre PDFToBook.credit=Verwendet Calibre
PDFToBook.submit=Convert PDFToBook.submit=Konvertieren
#sign #sign
sign.title=Signieren sign.title=Signieren
@@ -736,7 +755,7 @@ compress.submit=Komprimieren
#Add image #Add image
addImage.title=Bild hinzufügen addImage.title=Bild hinzufügen
addImage.header=Ein Bild einfügen addImage.header=Ein Bild einfügen
addImage.everyPage=Jede Seite? addImage.everyPage=In jede Seite einfügen?
addImage.upload=Bild hinzufügen addImage.upload=Bild hinzufügen
addImage.submit=Bild hinzufügen addImage.submit=Bild hinzufügen
@@ -753,11 +772,23 @@ merge.submit=Zusammenführen
pdfOrganiser.title=Seiten anordnen pdfOrganiser.title=Seiten anordnen
pdfOrganiser.header=PDF Seitenorganisation pdfOrganiser.header=PDF Seitenorganisation
pdfOrganiser.submit=Seiten anordnen pdfOrganiser.submit=Seiten anordnen
pdfOrganiser.mode=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
multiTool.title=PDF-Multitool multiTool.title=PDF-Multitool
multiTool.header=PDF-Multitool multiTool.header=PDF-Multitool
multiTool.uploadPrompts=Bitte PDF hochladen
#view pdf #view pdf
viewPdf.title=PDF anzeigen viewPdf.title=PDF anzeigen
@@ -768,6 +799,7 @@ pageRemover.title=Seiten entfernen
pageRemover.header=PDF Seiten entfernen pageRemover.header=PDF Seiten entfernen
pageRemover.pagesToDelete=Seiten zu entfernen (geben Sie eine Kommagetrennte Liste der Seitenzahlen an): pageRemover.pagesToDelete=Seiten zu entfernen (geben Sie eine Kommagetrennte Liste der Seitenzahlen an):
pageRemover.submit=Seiten löschen pageRemover.submit=Seiten löschen
pageRemover.placeholder=(z.B. 1,2,6 oder 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=Wählen Sie den Winkel (in Vielfachen von 90 Grad):
rotate.submit=Herunterladen rotate.submit=Herunterladen
#merge #split-pdfs
split.title=PDF aufteilen split.title=PDF aufteilen
split.header=PDF aufteilen split.header=PDF aufteilen
split.desc.1=Die Nummern, die Sie auswählen, sind die Seitenzahlen, an denen Sie aufteilen möchten. split.desc.1=Die Nummern, die Sie auswählen, sind die Seitenzahlen, an denen Sie aufteilen möchten.
split.desc.2=So würde die Auswahl von 1,3,7-8 ein 10-seitiges Dokument in 6 separate PDFs aufteilen, mit: split.desc.2=So würde die Auswahl von 1,3,7-9 ein 10-seitiges Dokument in 6 separate PDFs aufteilen, mit:
split.desc.3=Dokument #1: Seite 1 split.desc.3=Dokument #1: Seite 1
split.desc.4=Dokument #2: Seite 2 und 3 split.desc.4=Dokument #2: Seite 2 und 3
split.desc.5=Dokument #3: Seite 4, 5 und 6 split.desc.5=Dokument #3: Seite 4, 5, 6 und 7
split.desc.6=Dokument #4: Seite 7 split.desc.6=Dokument #4: Seite 8
split.desc.7=Dokument #5: Seite 8 split.desc.7=Dokument #5: Seite 9
split.desc.8=Dokument #6: Seite 9 und 10 split.desc.8=Dokument #6: Seite 10
split.splitPages=Geben Sie die Seiten an, an denen aufgeteilt werden soll: split.splitPages=Geben Sie die Seiten an, an denen aufgeteilt werden soll:
split.submit=Aufteilen split.submit=Aufteilen
@@ -855,6 +887,8 @@ watermark.selectText.7=Deckkraft (0% - 100 %):
watermark.selectText.8=Wasserzeichen Typ: watermark.selectText.8=Wasserzeichen Typ:
watermark.selectText.9=Wasserzeichen-Bild: watermark.selectText.9=Wasserzeichen-Bild:
watermark.submit=Wasserzeichen hinzufügen watermark.submit=Wasserzeichen hinzufügen
watermark.type.1=Text
watermark.type.2=Bild
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDF zu PDF/A
pdfToPDFA.header=PDF zu PDF/A pdfToPDFA.header=PDF zu PDF/A
pdfToPDFA.credit=Dieser Dienst verwendet OCRmyPDF für die PDF/A-Konvertierung pdfToPDFA.credit=Dieser Dienst verwendet OCRmyPDF für die PDF/A-Konvertierung
pdfToPDFA.submit=Konvertieren pdfToPDFA.submit=Konvertieren
pdfToPDFA.tip=Dieser Dienst kann nur einzelne Eingangsdateien verarbeiten.
#PDFToWord #PDFToWord
@@ -933,15 +968,15 @@ PDFToText.submit=Konvertieren
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF in HTML PDFToHTML.title=PDF zu HTML
PDFToHTML.header=PDF in 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 PDFToHTML.submit=Konvertieren
#PDFToXML #PDFToXML
PDFToXML.title=PDF in XML PDFToXML.title=PDF zu XML
PDFToXML.header=PDF in XML PDFToXML.header=PDF zu XML
PDFToXML.credit=Dieser Dienst verwendet LibreOffice für die Dateikonvertierung. PDFToXML.credit=Dieser Dienst verwendet LibreOffice für die Dateikonvertierung.
PDFToXML.submit=Konvertieren PDFToXML.submit=Konvertieren
@@ -987,7 +1022,16 @@ split-by-sections.vertical.label=Vertikale Teiler
split-by-sections.horizontal.placeholder=Anzahl horizontaler Teiler eingeben split-by-sections.horizontal.placeholder=Anzahl horizontaler Teiler eingeben
split-by-sections.vertical.placeholder=Anzahl vertikaler Teiler eingeben split-by-sections.vertical.placeholder=Anzahl vertikaler Teiler eingeben
split-by-sections.submit=PDF teilen split-by-sections.submit=PDF teilen
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=In eine PDF zusammenfügen
#printFile
printFile.title=Datei drucken
printFile.header=Datei an Drucker senden
printFile.selectText.1=Wähle die auszudruckende Datei
printFile.selectText.2=Druckernamen eingeben
printFile.submit=Drucken
#licenses #licenses
licenses.nav=Lizenzen licenses.nav=Lizenzen
@@ -998,3 +1042,16 @@ licenses.version=Version
licenses.license=Lizenz 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

File diff suppressed because it is too large Load Diff

View File

@@ -17,6 +17,7 @@ true=True
false=False false=False
unknown=Unknown unknown=Unknown
save=Save save=Save
saveToBrowser=Save to Browser
close=Close close=Close
filesSelected=files selected filesSelected=files selected
noFavourites=No favourites added noFavourites=No favourites added
@@ -53,18 +54,32 @@ notAuthenticatedMessage=User not authenticated.
userNotFoundMessage=User not found. userNotFoundMessage=User not found.
incorrectPasswordMessage=Current password is incorrect. incorrectPasswordMessage=Current password is incorrect.
usernameExistsMessage=New Username already exists. usernameExistsMessage=New Username already exists.
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Cannot delete currently logged in user.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. 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
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Pipeline Menu (Beta)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Upload Custom
pipeline.configureButton=Configure pipeline.configureButton=Configure
pipeline.defaultOption=Custom pipeline.defaultOption=Custom
pipeline.submitButton=Submit pipeline.submitButton=Submit
pipeline.help=Pipeline Help
pipeline.scanHelp=Folder Scanning Help
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,6 +112,7 @@ navbar.settings=Settings
############# #############
settings.title=Settings settings.title=Settings
settings.update=Update available settings.update=Update available
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=App Version: settings.appVersion=App Version:
settings.downloadOption.title=Choose download option (For single file non zip downloads): settings.downloadOption.title=Choose download option (For single file non zip downloads):
settings.downloadOption.1=Open in same window settings.downloadOption.1=Open in same window
@@ -105,8 +121,9 @@ settings.downloadOption.3=Download file
settings.zipThreshold=Zip files when the number of downloaded files exceeds settings.zipThreshold=Zip files when the number of downloaded files exceeds
settings.signOut=Sign Out settings.signOut=Sign Out
settings.accountSettings=Account Settings settings.accountSettings=Account Settings
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -145,6 +162,7 @@ adminUserSettings.header=Admin User Control Settings
adminUserSettings.admin=Admin adminUserSettings.admin=Admin
adminUserSettings.user=User adminUserSettings.user=User
adminUserSettings.addUser=Add New User adminUserSettings.addUser=Add New User
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
adminUserSettings.roles=Roles adminUserSettings.roles=Roles
adminUserSettings.role=Role adminUserSettings.role=Role
adminUserSettings.actions=Actions adminUserSettings.actions=Actions
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Convert To Single Page
pageExtracter.title=Extract Pages pageExtracter.title=Extract Pages
pageExtracter.header=Extract Pages pageExtracter.header=Extract Pages
pageExtracter.submit=Extract pageExtracter.submit=Extract
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -753,11 +772,23 @@ merge.submit=Merge
pdfOrganiser.title=Page Organiser pdfOrganiser.title=Page Organiser
pdfOrganiser.header=PDF Page Organiser pdfOrganiser.header=PDF Page Organiser
pdfOrganiser.submit=Rearrange Pages pdfOrganiser.submit=Rearrange Pages
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)
#multiTool #multiTool
multiTool.title=PDF Multi Tool multiTool.title=PDF Multi Tool
multiTool.header=PDF Multi Tool multiTool.header=PDF Multi Tool
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=View PDF
@@ -768,6 +799,7 @@ pageRemover.title=Page Remover
pageRemover.header=PDF Page remover pageRemover.header=PDF Page remover
pageRemover.pagesToDelete=Pages to delete (Enter a comma-separated list of page numbers) : pageRemover.pagesToDelete=Pages to delete (Enter a comma-separated list of page numbers) :
pageRemover.submit=Delete Pages pageRemover.submit=Delete Pages
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=Select rotation angle (in multiples of 90 degrees):
rotate.submit=Rotate rotate.submit=Rotate
#merge #split-pdfs
split.title=Split PDF split.title=Split PDF
split.header=Split PDF split.header=Split PDF
split.desc.1=The numbers you select are the page number you wish to do a split on split.desc.1=The numbers you select are the page number you wish to do a split on
split.desc.2=As such selecting 1,3,7-8 would split a 10 page document into 6 separate PDFS with: split.desc.2=As such selecting 1,3,7-9 would split a 10 page document into 6 separate PDFS with:
split.desc.3=Document #1: Page 1 split.desc.3=Document #1: Page 1
split.desc.4=Document #2: Page 2 and 3 split.desc.4=Document #2: Page 2 and 3
split.desc.5=Document #3: Page 4, 5 and 6 split.desc.5=Document #3: Page 4, 5, 6 and 7
split.desc.6=Document #4: Page 7 split.desc.6=Document #4: Page 8
split.desc.7=Document #5: Page 8 split.desc.7=Document #5: Page 9
split.desc.8=Document #6: Page 9 and 10 split.desc.8=Document #6: Page 10
split.splitPages=Enter pages to split on: split.splitPages=Enter pages to split on:
split.submit=Split split.submit=Split
@@ -855,6 +887,8 @@ watermark.selectText.7=Opacity (0% - 100%):
watermark.selectText.8=Watermark Type: watermark.selectText.8=Watermark Type:
watermark.selectText.9=Watermark Image: watermark.selectText.9=Watermark Image:
watermark.submit=Add Watermark watermark.submit=Add Watermark
watermark.type.1=Text
watermark.type.2=Image
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDF To PDF/A
pdfToPDFA.header=PDF To PDF/A pdfToPDFA.header=PDF To PDF/A
pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion
pdfToPDFA.submit=Convert pdfToPDFA.submit=Convert
pdfToPDFA.tip=Currently does not work for multiple inputs at once
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=Convert
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF to HTML PDFToHTML.title=PDF to HTML
PDFToHTML.header=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 PDFToHTML.submit=Convert
@@ -989,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses
@@ -998,3 +1042,16 @@ licenses.version=Version
licenses.license=License 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

View File

@@ -17,6 +17,7 @@ true=True
false=False false=False
unknown=Unknown unknown=Unknown
save=Save save=Save
saveToBrowser=Save to Browser
close=Close close=Close
filesSelected=files selected filesSelected=files selected
noFavourites=No favorites added noFavourites=No favorites added
@@ -53,18 +54,32 @@ notAuthenticatedMessage=User not authenticated.
userNotFoundMessage=User not found. userNotFoundMessage=User not found.
incorrectPasswordMessage=Current password is incorrect. incorrectPasswordMessage=Current password is incorrect.
usernameExistsMessage=New Username already exists. usernameExistsMessage=New Username already exists.
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Cannot delete currently logged in user.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. 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
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Pipeline Menu (Beta)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Upload Custom
pipeline.configureButton=Configure pipeline.configureButton=Configure
pipeline.defaultOption=Custom pipeline.defaultOption=Custom
pipeline.submitButton=Submit pipeline.submitButton=Submit
pipeline.help=Pipeline Help
pipeline.scanHelp=Folder Scanning Help
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,6 +112,7 @@ navbar.settings=Settings
############# #############
settings.title=Settings settings.title=Settings
settings.update=Update available settings.update=Update available
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=App Version: settings.appVersion=App Version:
settings.downloadOption.title=Choose download option (For single file non zip downloads): settings.downloadOption.title=Choose download option (For single file non zip downloads):
settings.downloadOption.1=Open in same window settings.downloadOption.1=Open in same window
@@ -105,8 +121,9 @@ settings.downloadOption.3=Download file
settings.zipThreshold=Zip files when the number of downloaded files exceeds settings.zipThreshold=Zip files when the number of downloaded files exceeds
settings.signOut=Sign Out settings.signOut=Sign Out
settings.accountSettings=Account Settings settings.accountSettings=Account Settings
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -145,6 +162,7 @@ adminUserSettings.header=Admin User Control Settings
adminUserSettings.admin=Admin adminUserSettings.admin=Admin
adminUserSettings.user=User adminUserSettings.user=User
adminUserSettings.addUser=Add New User adminUserSettings.addUser=Add New User
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
adminUserSettings.roles=Roles adminUserSettings.roles=Roles
adminUserSettings.role=Role adminUserSettings.role=Role
adminUserSettings.actions=Actions adminUserSettings.actions=Actions
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Convert To Single Page
pageExtracter.title=Extract Pages pageExtracter.title=Extract Pages
pageExtracter.header=Extract Pages pageExtracter.header=Extract Pages
pageExtracter.submit=Extract pageExtracter.submit=Extract
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -753,11 +772,23 @@ merge.submit=Merge
pdfOrganiser.title=Page Organizer pdfOrganiser.title=Page Organizer
pdfOrganiser.header=PDF Page Organizer pdfOrganiser.header=PDF Page Organizer
pdfOrganiser.submit=Rearrange Pages pdfOrganiser.submit=Rearrange Pages
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)
#multiTool #multiTool
multiTool.title=PDF Multi Tool multiTool.title=PDF Multi Tool
multiTool.header=PDF Multi Tool multiTool.header=PDF Multi Tool
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=View PDF
@@ -768,6 +799,7 @@ pageRemover.title=Page Remover
pageRemover.header=PDF Page remover pageRemover.header=PDF Page remover
pageRemover.pagesToDelete=Pages to delete (Enter a comma-separated list of page numbers) : pageRemover.pagesToDelete=Pages to delete (Enter a comma-separated list of page numbers) :
pageRemover.submit=Delete Pages pageRemover.submit=Delete Pages
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=Select rotation angle (in multiples of 90 degrees):
rotate.submit=Rotate rotate.submit=Rotate
#merge #split-pdfs
split.title=Split PDF split.title=Split PDF
split.header=Split PDF split.header=Split PDF
split.desc.1=The numbers you select are the page number you wish to do a split on split.desc.1=The numbers you select are the page number you wish to do a split on
split.desc.2=As such selecting 1,3,7-8 would split a 10 page document into 6 separate PDFS with: split.desc.2=As such selecting 1,3,7-9 would split a 10 page document into 6 separate PDFS with:
split.desc.3=Document #1: Page 1 split.desc.3=Document #1: Page 1
split.desc.4=Document #2: Page 2 and 3 split.desc.4=Document #2: Page 2 and 3
split.desc.5=Document #3: Page 4, 5 and 6 split.desc.5=Document #3: Page 4, 5, 6, 7
split.desc.6=Document #4: Page 7 split.desc.6=Document #4: Page 8
split.desc.7=Document #5: Page 8 split.desc.7=Document #5: Page 9
split.desc.8=Document #6: Page 9 and 10 split.desc.8=Document #6: Page 10
split.splitPages=Enter pages to split on: split.splitPages=Enter pages to split on:
split.submit=Split split.submit=Split
@@ -855,6 +887,8 @@ watermark.selectText.7=Opacity (0% - 100%):
watermark.selectText.8=Watermark Type: watermark.selectText.8=Watermark Type:
watermark.selectText.9=Watermark Image: watermark.selectText.9=Watermark Image:
watermark.submit=Add Watermark watermark.submit=Add Watermark
watermark.type.1=Text
watermark.type.2=Image
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDF To PDF/A
pdfToPDFA.header=PDF To PDF/A pdfToPDFA.header=PDF To PDF/A
pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion
pdfToPDFA.submit=Convert pdfToPDFA.submit=Convert
pdfToPDFA.tip=Currently does not work for multiple inputs at once
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=Convert
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF to HTML PDFToHTML.title=PDF to HTML
PDFToHTML.header=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 PDFToHTML.submit=Convert
@@ -989,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses
@@ -998,3 +1042,16 @@ licenses.version=Version
licenses.license=License 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

View File

@@ -17,10 +17,11 @@ true=Verdadero
false=Falso false=Falso
unknown=Desconocido unknown=Desconocido
save=Guardar save=Guardar
saveToBrowser=Guardar en el Navegador
close=Cerrar close=Cerrar
filesSelected=archivos seleccionados filesSelected=archivos seleccionados
noFavourites=No se agregaron favoritos noFavourites=No se agregaron favoritos
downloadComplete=Download Complete downloadComplete=Descarga finalizada
bored=¿Cansado de esperar? bored=¿Cansado de esperar?
alphabet=Alfabeto alphabet=Alfabeto
downloadPdf=Descargar PDF downloadPdf=Descargar PDF
@@ -53,8 +54,20 @@ notAuthenticatedMessage=Usuario no autentificado.
userNotFoundMessage=Usuario no encontrado. userNotFoundMessage=Usuario no encontrado.
incorrectPasswordMessage=La contraseña actual no es correcta. incorrectPasswordMessage=La contraseña actual no es correcta.
usernameExistsMessage=El nuevo nombre de usuario está en uso. usernameExistsMessage=El nuevo nombre de usuario está en uso.
deleteCurrentUserMessage=Cannot delete currently logged in user. invalidUsernameMessage=Nombre de usuario no válido, El nombre de ususario debe contener únicamente números y caracteres alfabéticos.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. 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
############### ###############
@@ -65,6 +78,8 @@ pipeline.uploadButton=Cargar personalización
pipeline.configureButton=Configurar pipeline.configureButton=Configurar
pipeline.defaultOption=Personalizar pipeline.defaultOption=Personalizar
pipeline.submitButton=Enviar pipeline.submitButton=Enviar
pipeline.help=Ayuda de Canalización
pipeline.scanHelp=Ayuda de escaneado de carpetas
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,6 +112,7 @@ navbar.settings=Configuración
############# #############
settings.title=Configuración settings.title=Configuración
settings.update=Actualización disponible settings.update=Actualización disponible
settings.updateAvailable={0} es la versión instalada. Hay disponible una versión nueva ({1}).
settings.appVersion=Versión de la aplicación: settings.appVersion=Versión de la aplicación:
settings.downloadOption.title=Elegir la opción de descarga (para descargas de un solo archivo sin ZIP): settings.downloadOption.title=Elegir la opción de descarga (para descargas de un solo archivo sin ZIP):
settings.downloadOption.1=Abrir en la misma ventana settings.downloadOption.1=Abrir en la misma ventana
@@ -105,12 +121,13 @@ settings.downloadOption.3=Descargar el archivo
settings.zipThreshold=Archivos ZIP cuando excede el número de archivos descargados settings.zipThreshold=Archivos ZIP cuando excede el número de archivos descargados
settings.signOut=Desconectar settings.signOut=Desconectar
settings.accountSettings=Configuración de la cuenta settings.accountSettings=Configuración de la cuenta
settings.bored.help=Habilita el juego del huevo de pascua
settings.cacheInputs.name=Guardar entradas del formulario
settings.cacheInputs.help=Habilitar guardar entradas previamente utilizadas para futuras acciones
changeCreds.title=Cambiar Credenciales changeCreds.title=Cambiar Credenciales
changeCreds.header=Actualice los detalles de su cuenta changeCreds.header=Actualice los detalles de su cuenta
changeCreds.changePassword=You are using default login credentials. Please enter a new password changeCreds.changePassword=Está usando las credenciales de inicio de sesión por defecto. Por favor, introduzca una contraseña nueva
changeCreds.newUsername=Nuevo usuario changeCreds.newUsername=Nuevo usuario
changeCreds.oldPassword=Contraseña actual changeCreds.oldPassword=Contraseña actual
changeCreds.newPassword=Nueva contraseña changeCreds.newPassword=Nueva contraseña
@@ -145,14 +162,15 @@ adminUserSettings.header=Configuración de control de usuario administrador
adminUserSettings.admin=Administrador adminUserSettings.admin=Administrador
adminUserSettings.user=Usuario adminUserSettings.user=Usuario
adminUserSettings.addUser=Añadir Nuevo Usuario adminUserSettings.addUser=Añadir Nuevo Usuario
adminUserSettings.usernameInfo=El nombrede usuario debe contener únicamente letras y números, no espacios ni caracteres especiales.
adminUserSettings.roles=Roles adminUserSettings.roles=Roles
adminUserSettings.role=Rol adminUserSettings.role=Rol
adminUserSettings.actions=Acciones adminUserSettings.actions=Acciones
adminUserSettings.apiUser=Usuario limitado de API adminUserSettings.apiUser=Usuario limitado de API
adminUserSettings.extraApiUser=Additional Limited API User adminUserSettings.extraApiUser=Otro usuario limitado de API
adminUserSettings.webOnlyUser=Usuario solo web adminUserSettings.webOnlyUser=Usuario solo web
adminUserSettings.demoUser=Demo User (No custom settings) adminUserSettings.demoUser=Usuario Demo (Sin ajustes personalizados)
adminUserSettings.internalApiUser=Internal API User adminUserSettings.internalApiUser=Usuario interno de API
adminUserSettings.forceChange=Forzar usuario a cambiar usuario/contraseña en el acceso adminUserSettings.forceChange=Forzar usuario a cambiar usuario/contraseña en el acceso
adminUserSettings.submit=Guardar Usuario adminUserSettings.submit=Guardar Usuario
@@ -229,7 +247,7 @@ compressPdfs.tags=aplastar,pequeño,diminuto
home.changeMetadata.title=Cambiar metadatos home.changeMetadata.title=Cambiar metadatos
home.changeMetadata.desc=Cambiar/Eliminar/Añadir metadatos al documento PDF home.changeMetadata.desc=Cambiar/Eliminar/Añadir metadatos al documento PDF
changeMetadata.tags==Título,autor,fecha,creación,hora,editorial,productor,estadísticas changeMetadata.tags=título,autor,fecha,creación,hora,editorial,productor,estadísticas
home.fileToPDF.title=Convertir archivo a PDF home.fileToPDF.title=Convertir archivo a PDF
home.fileToPDF.desc=Convertir casi cualquier archivo a PDF (DOCX, PNG, XLS, PPT, TXT y más) home.fileToPDF.desc=Convertir casi cualquier archivo a PDF (DOCX, PNG, XLS, PPT, TXT y más)
@@ -372,7 +390,7 @@ showJS.tags=JS
home.autoRedact.title=Auto Redactar home.autoRedact.title=Auto Redactar
home.autoRedact.desc=Redactar automáticamente (ocultar) texto en un PDF según el texto introducido home.autoRedact.desc=Redactar automáticamente (ocultar) texto en un PDF según el texto introducido
autoRedact.tags=Redact,Hide,black out,black,marker,hidden autoRedact.tags=Redactar,Ocultar,ocultar,negro,subrayador,oculto
home.tableExtraxt.title=PDF a CSV home.tableExtraxt.title=PDF a CSV
home.tableExtraxt.desc=Extraer Tablas de un PDF convirtiéndolas a CSV home.tableExtraxt.desc=Extraer Tablas de un PDF convirtiéndolas a CSV
@@ -392,18 +410,18 @@ home.split-by-sections.title=Dividir PDF por Secciones
home.split-by-sections.desc=Dividir cada página de un PDF en secciones verticales y horizontales más pequeñas home.split-by-sections.desc=Dividir cada página de un PDF en secciones verticales y horizontales más pequeñas
split-by-sections.tags=Dividir sección, Dividir, Personalizar split-by-sections.tags=Dividir sección, Dividir, Personalizar
home.AddStampRequest.title=Add Stamp to PDF home.AddStampRequest.title=Añadir Sello a PDF
home.AddStampRequest.desc=Add text or add image stamps at set locations home.AddStampRequest.desc=Añadir texto o sello de imagen en ubicaciones específicas
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize AddStampRequest.tags=Sello, Añadir imagen, centrar imagen, Marca de agua, PDF, Incrustar, Personalizar
home.PDFToBook.title=PDF to Book home.PDFToBook.title=PDF a Libro
home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre home.PDFToBook.desc=Convierte PDF a formatos de Libro/Cómic usando Calibre
PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle PDFToBook.tags=Libro,Cómic,Calibre,Convertir,Manga,Amazon,Kindle
home.BookToPDF.title=Book to PDF home.BookToPDF.title=Libro a PDF
home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre home.BookToPDF.desc=Convierte formatos de Libro/Cómic a PDF usando Calibre
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle BookToPDF.tags=Libro,Cómic,Calibre,Convertir,manga,Amazon,Kindle
########################### ###########################
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Convertir a página única
pageExtracter.title=Extraer Páginas pageExtracter.title=Extraer Páginas
pageExtracter.header=Extraer Páginas pageExtracter.header=Extraer Páginas
pageExtracter.submit=Extraer pageExtracter.submit=Extraer
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -639,17 +658,17 @@ compare.document.2=Documento 2
compare.submit=Comparar compare.submit=Comparar
#BookToPDF #BookToPDF
BookToPDF.title=Books and Comics to PDF BookToPDF.title=Libros y Cómics a PDF
BookToPDF.header=Book to PDF BookToPDF.header=Libro a PDF
BookToPDF.credit=Uses Calibre BookToPDF.credit=Usa Calibre
BookToPDF.submit=Convert BookToPDF.submit=Convertir
#PDFToBook #PDFToBook
PDFToBook.title=PDF to Book PDFToBook.title=PDF a Libro
PDFToBook.header=PDF to Book PDFToBook.header=PDF a Libro
PDFToBook.selectText.1=Format PDFToBook.selectText.1=Formato
PDFToBook.credit=Uses Calibre PDFToBook.credit=Utiliza Calibre
PDFToBook.submit=Convert PDFToBook.submit=Convertir
#sign #sign
sign.title=Firmar sign.title=Firmar
@@ -753,11 +772,23 @@ merge.submit=Unir
pdfOrganiser.title=Organizador de páginas pdfOrganiser.title=Organizador de páginas
pdfOrganiser.header=Organizador de páginas PDF pdfOrganiser.header=Organizador de páginas PDF
pdfOrganiser.submit=Organizar páginas pdfOrganiser.submit=Organizar páginas
pdfOrganiser.mode=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
multiTool.title=Multi-herramienta PDF multiTool.title=Multi-herramienta PDF
multiTool.header=Multi-herramienta PDF multiTool.header=Multi-herramienta PDF
multiTool.uploadPrompts=Por favor, cargue PDF
#view pdf #view pdf
viewPdf.title=Ver PDF viewPdf.title=Ver PDF
@@ -768,6 +799,7 @@ pageRemover.title=Eliminador de páginas
pageRemover.header=Eliminador de páginas PDF pageRemover.header=Eliminador de páginas PDF
pageRemover.pagesToDelete=Páginas a eliminar (introducir una lista de números de página separados por coma): pageRemover.pagesToDelete=Páginas a eliminar (introducir una lista de números de página separados por coma):
pageRemover.submit=Eliminar Páginas pageRemover.submit=Eliminar Páginas
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=Seleccionar ángulo de rotación (en múltiplos de 90 grados)
rotate.submit=Rotar rotate.submit=Rotar
#merge #split-pdfs
split.title=Dividir PDF split.title=Dividir PDF
split.header=Dividir PDF split.header=Dividir PDF
split.desc.1=Los números que seleccione son el número de página en el que desea hacer una división split.desc.1=Los números que seleccione son el número de página en el que desea hacer una división
split.desc.2=Como tal, seleccionar 1,3,7-8 dividiría un documento de 10 páginas en 6 archivos PDF separados con: split.desc.2=Como tal, seleccionar 1,3,7-9 dividiría un documento de 10 páginas en 6 archivos PDF separados con:
split.desc.3=Documento #1: Página 1 split.desc.3=Documento #1: Página 1
split.desc.4=Documento #2: Páginas 2 y 3 split.desc.4=Documento #2: Páginas 2 y 3
split.desc.5=Documento #3: Páginas 4, 5 y 6 split.desc.5=Documento #3: Páginas 4, 5, 6 y 7
split.desc.6=Documento #4: Página 7 split.desc.6=Documento #4: Página 8
split.desc.7=Documento #5: Página 8 split.desc.7=Documento #5: Página 9
split.desc.8=Documento #6: Páginas 9 y 10 split.desc.8=Documento #6: Páginas 10
split.splitPages=Introducir las páginas para dividir: split.splitPages=Introducir las páginas para dividir:
split.submit=Dividir split.submit=Dividir
@@ -855,6 +887,8 @@ watermark.selectText.7=Opacidad (0% - 100%):
watermark.selectText.8=Tipo de marca de agua: watermark.selectText.8=Tipo de marca de agua:
watermark.selectText.9=Imagen de marca de agua: watermark.selectText.9=Imagen de marca de agua:
watermark.submit=Añadir marca de agua watermark.submit=Añadir marca de agua
watermark.type.1=Texto
watermark.type.2=Imagen
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDF a PDF/A
pdfToPDFA.header=PDF a PDF/A pdfToPDFA.header=PDF a PDF/A
pdfToPDFA.credit=Este servicio usa OCRmyPDF para la conversión a PDF/A pdfToPDFA.credit=Este servicio usa OCRmyPDF para la conversión a PDF/A
pdfToPDFA.submit=Convertir pdfToPDFA.submit=Convertir
pdfToPDFA.tip=Actualmente no funciona para múltiples entrada a la vez
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=Convertir
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF a HTML PDFToHTML.title=PDF a HTML
PDFToHTML.header=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 PDFToHTML.submit=Convertir
@@ -987,7 +1022,16 @@ split-by-sections.vertical.label=Divisiones Verticales
split-by-sections.horizontal.placeholder=Introduzca el número de divisiones horizontales split-by-sections.horizontal.placeholder=Introduzca el número de divisiones horizontales
split-by-sections.vertical.placeholder=Introduzca el número de divisiones verticales split-by-sections.vertical.placeholder=Introduzca el número de divisiones verticales
split-by-sections.submit=Dividir PDF split-by-sections.submit=Dividir PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Unir en Un PDF
#printFile
printFile.title=Imprimir archivo
printFile.header=Imprimir archivo en la impresora
printFile.selectText.1=Seleccionar archivo para imprimir
printFile.selectText.2=Introducir nombre de la impresora
printFile.submit=Imprimir
#licenses #licenses
licenses.nav=Licencias licenses.nav=Licencias
@@ -998,3 +1042,16 @@ licenses.version=Versión
licenses.license=Licencia 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

View File

@@ -17,6 +17,7 @@ true=Egiazkoa
false=Faltsua false=Faltsua
unknown=Ezezaguna unknown=Ezezaguna
save=Gorde save=Gorde
saveToBrowser=Save to Browser
close=Itxi close=Itxi
filesSelected=Hautatutako fitxategiak filesSelected=Hautatutako fitxategiak
noFavourites=Ez dira gogokoak gehitu noFavourites=Ez dira gogokoak gehitu
@@ -53,18 +54,32 @@ notAuthenticatedMessage=User not authenticated.
userNotFoundMessage=User not found. userNotFoundMessage=User not found.
incorrectPasswordMessage=Current password is incorrect. incorrectPasswordMessage=Current password is incorrect.
usernameExistsMessage=New Username already exists. usernameExistsMessage=New Username already exists.
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Cannot delete currently logged in user.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. 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
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Pipeline Menu (Beta)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Upload Custom
pipeline.configureButton=Configure pipeline.configureButton=Configure
pipeline.defaultOption=Custom pipeline.defaultOption=Custom
pipeline.submitButton=Submit pipeline.submitButton=Submit
pipeline.help=Pipeline Help
pipeline.scanHelp=Folder Scanning Help
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,6 +112,7 @@ navbar.settings=Ezarpenak
############# #############
settings.title=Ezarpenak settings.title=Ezarpenak
settings.update=Eguneratze eskuragarria settings.update=Eguneratze eskuragarria
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Aplikazioaren bertsioa: settings.appVersion=Aplikazioaren bertsioa:
settings.downloadOption.title=Hautatu deskargatzeko aukera (fitxategi bakarra deskargatzeko ZIP gabe): settings.downloadOption.title=Hautatu deskargatzeko aukera (fitxategi bakarra deskargatzeko ZIP gabe):
settings.downloadOption.1=Ireki leiho berean settings.downloadOption.1=Ireki leiho berean
@@ -105,8 +121,9 @@ settings.downloadOption.3=Deskargatu fitxategia
settings.zipThreshold=ZIP fitxategiak deskargatutako fitxategi kopurua gainditzen denean settings.zipThreshold=ZIP fitxategiak deskargatutako fitxategi kopurua gainditzen denean
settings.signOut=Saioa itxi settings.signOut=Saioa itxi
settings.accountSettings=Kontuaren ezarpenak settings.accountSettings=Kontuaren ezarpenak
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -145,6 +162,7 @@ adminUserSettings.header=Admin Erabiltzailearen Ezarpenen Kontrolak
adminUserSettings.admin=Admin adminUserSettings.admin=Admin
adminUserSettings.user=Erabiltzaile adminUserSettings.user=Erabiltzaile
adminUserSettings.addUser=Erabiltzaile berria adminUserSettings.addUser=Erabiltzaile berria
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
adminUserSettings.roles=Rolak adminUserSettings.roles=Rolak
adminUserSettings.role=Rol adminUserSettings.role=Rol
adminUserSettings.actions=Ekintzak adminUserSettings.actions=Ekintzak
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Orrialde bakarrera bihurtu
pageExtracter.title=Atera orriak pageExtracter.title=Atera orriak
pageExtracter.header=Atera orriak pageExtracter.header=Atera orriak
pageExtracter.submit=Atera pageExtracter.submit=Atera
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -753,11 +772,23 @@ merge.submit=Elkartu
pdfOrganiser.title=Orrialdeen antolatzailea pdfOrganiser.title=Orrialdeen antolatzailea
pdfOrganiser.header=PDF orrialdeen antolatzailea pdfOrganiser.header=PDF orrialdeen antolatzailea
pdfOrganiser.submit=Antolatu orrialdeak pdfOrganiser.submit=Antolatu orrialdeak
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)
#multiTool #multiTool
multiTool.title=PDF erabilera anitzeko tresna multiTool.title=PDF erabilera anitzeko tresna
multiTool.header=PDF erabilera anitzeko tresna multiTool.header=PDF erabilera anitzeko tresna
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=View PDF
@@ -768,6 +799,7 @@ pageRemover.title=Orrialdeen ezabatzailea
pageRemover.header=PDF orrialdeen ezabatzailea pageRemover.header=PDF orrialdeen ezabatzailea
pageRemover.pagesToDelete=Ezabatu beharreko orrialdeak (sartu komaz bereizitako orrialde-zenbakien zerrenda): pageRemover.pagesToDelete=Ezabatu beharreko orrialdeak (sartu komaz bereizitako orrialde-zenbakien zerrenda):
pageRemover.submit=Ezabatu orrialdeak pageRemover.submit=Ezabatu orrialdeak
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=Hautatu errotazio-angelua (90 graduko multiploetan):
rotate.submit=Biratu rotate.submit=Biratu
#merge #split-pdfs
split.title=Zatitu PDFa split.title=Zatitu PDFa
split.header=Zatitu PDFa split.header=Zatitu PDFa
split.desc.1=Hautatzen dituzun zenbakiak zatiketa egin nahi duzun orrialde-zenbakiak dira split.desc.1=Hautatzen dituzun zenbakiak zatiketa egin nahi duzun orrialde-zenbakiak dira
split.desc.2=Beraz, 1,3,7-8 hautatzean 10 orrialdeko dokumentua zatituko luke 6 PDF fitxategi bereizituetan split.desc.2=Beraz, 1,3,7-9 hautatzean 10 orrialdeko dokumentua zatituko luke 6 PDF fitxategi bereizituetan
split.desc.3=#1 Dokumentua: 1. orrialdea split.desc.3=#1 Dokumentua: 1. orrialdea
split.desc.4=#2 Dokumentua: 2. eta 3. orrialdeak split.desc.4=#2 Dokumentua: 2. eta 3. orrialdeak
split.desc.5=#3 Dokumentua: 4., 5. eta 6. orrialdeak split.desc.5=#3 Dokumentua: 4., 5., 6. eta 7. orrialdeak
split.desc.6=#4 Dokumentua: 7. orrialdea split.desc.6=#4 Dokumentua: 8. orrialdea
split.desc.7=#5 Dokumentua: 8. orrialdea split.desc.7=#5 Dokumentua: 9. orrialdea
split.desc.8=#6 Dokumentua: 9. eta 10. orrialdeak split.desc.8=#6 Dokumentua: 10. orrialdeak
split.splitPages=Sartu orrialdeak zatitzeko: split.splitPages=Sartu orrialdeak zatitzeko:
split.submit=Zatitu split.submit=Zatitu
@@ -855,6 +887,8 @@ watermark.selectText.7=Opakutasuna (0% - 100%):
watermark.selectText.8=Watermark Type: watermark.selectText.8=Watermark Type:
watermark.selectText.9=Watermark Image: watermark.selectText.9=Watermark Image:
watermark.submit=Gehitu ur-marka watermark.submit=Gehitu ur-marka
watermark.type.1=Text
watermark.type.2=Image
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDFa PDF/A bihurtu
pdfToPDFA.header=PDFa PDF/A bihurtu pdfToPDFA.header=PDFa PDF/A bihurtu
pdfToPDFA.credit=Zerbitzu honek OCRmyPDF erabiltzen du PDFak PDF/A bihurtzeko pdfToPDFA.credit=Zerbitzu honek OCRmyPDF erabiltzen du PDFak PDF/A bihurtzeko
pdfToPDFA.submit=Bihurtu pdfToPDFA.submit=Bihurtu
pdfToPDFA.tip=Currently does not work for multiple inputs at once
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=Bihurtu
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDFa HTML bihurtu PDFToHTML.title=PDFa HTML bihurtu
PDFToHTML.header=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 PDFToHTML.submit=Bihurtu
@@ -989,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses
@@ -998,3 +1042,16 @@ licenses.version=Version
licenses.license=License 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

View File

@@ -9,19 +9,20 @@ multiPdfPrompt=Sélectionnez les PDF
multiPdfDropPrompt=Sélectionnez (ou glissez-déposez) tous les PDF dont vous avez besoin multiPdfDropPrompt=Sélectionnez (ou glissez-déposez) tous les PDF dont vous avez besoin
imgPrompt=Choisir une image imgPrompt=Choisir une image
genericSubmit=Envoyer genericSubmit=Envoyer
processTimeWarning=Attention, ce processus peut prendre jusqu\u2019à une minute en fonction de la taille du fichier. processTimeWarning=Attention, ce processus peut prendre jusquà une minute en fonction de la taille du fichier.
pageOrderPrompt=Ordre des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1)\u00a0: pageOrderPrompt=Ordre des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1) :
pageSelectionPrompt=Sélection des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1)\u00a0: pageSelectionPrompt=Sélection des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1) :
goToPage=Aller goToPage=Aller
true=Vrai true=Vrai
false=Faux false=Faux
unknown=Inconnu unknown=Inconnu
save=Enregistrer save=Enregistrer
saveToBrowser=Save to Browser
close=Fermer close=Fermer
filesSelected=fichiers sélectionnés filesSelected=fichiers sélectionnés
noFavourites=Aucun favori ajouté noFavourites=Aucun favori ajouté
downloadComplete=Téléchargement terminé downloadComplete=Téléchargement terminé
bored=Ennuyé d\u2019attendre\u00a0? bored=Ennuyé dattendre ?
alphabet=Alphabet alphabet=Alphabet
downloadPdf=Télécharger le PDF downloadPdf=Télécharger le PDF
text=Texte text=Texte
@@ -32,9 +33,9 @@ sizes.small=Petit
sizes.medium=Moyen sizes.medium=Moyen
sizes.large=Grand sizes.large=Grand
sizes.x-large=Très grand sizes.x-large=Très grand
error.pdfPassword=Le document PDF est protégé par un mot de passe et le mot de passe n\u2019a pas été fourni ou était incorrect error.pdfPassword=Le document PDF est protégé par un mot de passe et le mot de passe na pas été fourni ou était incorrect
delete=Supprimer delete=Supprimer
username=Nom d\u2019utilisateur username=Nom dutilisateur
password=Mot de passe password=Mot de passe
welcome=Bienvenue welcome=Bienvenue
property=Propriété property=Propriété
@@ -43,28 +44,42 @@ white=Blanc
red=Rouge red=Rouge
green=Vert green=Vert
blue=Bleu blue=Bleu
custom=Personnalisé\u2026 custom=Personnalisé
WorkInProgess=En cours de développement, merci de nous remonter les problèmes que vous pourriez constater! WorkInProgess=En cours de développement, merci de nous remonter les problèmes que vous pourriez constater!
poweredBy=Propulsé par poweredBy=Propulsé par
yes=Oui yes=Oui
no=Non no=Non
changedCredsMessage=Les identifiants ont été mis à jour\u00a0! changedCredsMessage=Les identifiants ont été mis à jour !
notAuthenticatedMessage=Utilisateur non authentifié. notAuthenticatedMessage=Utilisateur non authentifié.
userNotFoundMessage=Utilisateur non trouvé. userNotFoundMessage=Utilisateur non trouvé.
incorrectPasswordMessage=Le mot de passe actuel est incorrect. incorrectPasswordMessage=Le mot de passe actuel est incorrect.
usernameExistsMessage=Le nouveau nom d\u2019utilisateur existe déjà. usernameExistsMessage=Le nouveau nom dutilisateur existe déjà.
deleteCurrentUserMessage=Cannot delete currently logged in user. invalidUsernameMessage=Nom dutilisateur invalide, le nom dutilisateur ne peut contenir que des chiffres et des lettres.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. deleteCurrentUserMessage=Impossible de supprimer lutilisateur actuellement connecté.
deleteUsernameExistsMessage=Le nom dutilisateur nexiste pas et ne peut pas être supprimé.
error=Erreur
oops=Oups !
help=Aide
goHomepage=Aller à la page daccueil
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 #
############### ###############
pipeline.header=Menu Pipeline (Alpha) pipeline.header=Menu Pipeline (Alpha)
pipeline.uploadButton=Télécharger une personnalisation pipeline.uploadButton=Charger une personnalisation
pipeline.configureButton=Configurer pipeline.configureButton=Configurer
pipeline.defaultOption=Personnaliser pipeline.defaultOption=Personnaliser
pipeline.submitButton=Soumettre pipeline.submitButton=Soumettre
pipeline.help=Pipeline Help
pipeline.scanHelp=Folder Scanning Help
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,21 +112,23 @@ navbar.settings=Paramètres
############# #############
settings.title=Paramètres settings.title=Paramètres
settings.update=Mise à jour disponible settings.update=Mise à jour disponible
settings.appVersion=Version de l\u2019application\u00a0: settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.downloadOption.title=Choisissez l\u2019option de téléchargement (pour les téléchargements à fichier unique non ZIP)\u00a0: settings.appVersion=Version de lapplication :
settings.downloadOption.title=Choisissez loption de téléchargement (pour les téléchargements à fichier unique non ZIP) :
settings.downloadOption.1=Ouvrir dans la même fenêtre settings.downloadOption.1=Ouvrir dans la même fenêtre
settings.downloadOption.2=Ouvrir dans une nouvelle fenêtre settings.downloadOption.2=Ouvrir dans une nouvelle fenêtre
settings.downloadOption.3=Télécharger le fichier settings.downloadOption.3=Télécharger le fichier
settings.zipThreshold=Compresser les fichiers en ZIP lorsque le nombre de fichiers téléchargés dépasse settings.zipThreshold=Compresser les fichiers en ZIP lorsque le nombre de fichiers téléchargés dépasse
settings.signOut=Déconnexion settings.signOut=Déconnexion
settings.accountSettings=Paramètres du compte settings.accountSettings=Paramètres du compte
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Modifiez vos identifiants changeCreds.title=Modifiez vos identifiants
changeCreds.header=Mettez à jour vos identifiants de connexion changeCreds.header=Mettez à jour vos identifiants de connexion
changeCreds.changePassword=You are using default login credentials. Please enter a new password changeCreds.changePassword=Vous utilisez les identifiants de connexion par défaut. Veuillez saisir un nouveau mot de passe
changeCreds.newUsername=Nouveau nom d\u2019utilisateur changeCreds.newUsername=Nouveau nom dutilisateur
changeCreds.oldPassword=Mot de passe actuel changeCreds.oldPassword=Mot de passe actuel
changeCreds.newPassword=Nouveau mot de passe changeCreds.newPassword=Nouveau mot de passe
changeCreds.confirmNewPassword=Confirmer le nouveau mot de passe changeCreds.confirmNewPassword=Confirmer le nouveau mot de passe
@@ -121,10 +138,10 @@ changeCreds.submit=Soumettre les modifications
account.title=Paramètres du compte account.title=Paramètres du compte
account.accountSettings=Paramètres du compte account.accountSettings=Paramètres du compte
account.adminSettings=Paramètres d\u2019administration \u2013 Voir et ajouter des utilisateurs account.adminSettings=Paramètres dadministration Voir et ajouter des utilisateurs
account.userControlSettings=Contrôle des paramètres des utilisateurs account.userControlSettings=Contrôle des paramètres des utilisateurs
account.changeUsername=Modifier le nom d\u2019utilisateur account.changeUsername=Modifier le nom dutilisateur
account.newUsername=Nouveau nom d\u2019utilisateur account.newUsername=Nouveau nom dutilisateur
account.password=Mot de passe de confirmation account.password=Mot de passe de confirmation
account.oldPassword=Ancien mot de passe account.oldPassword=Ancien mot de passe
account.newPassword=Nouveau mot de passe account.newPassword=Nouveau mot de passe
@@ -136,8 +153,8 @@ account.syncTitle=Synchroniser les paramètres du navigateur avec le compte
account.settingsCompare=Comparaison des paramètres account.settingsCompare=Comparaison des paramètres
account.property=Propriété account.property=Propriété
account.webBrowserSettings=Paramètres du navigateur account.webBrowserSettings=Paramètres du navigateur
account.syncToBrowser=Synchroniser\u00a0: Compte → Navigateur account.syncToBrowser=Synchroniser : Compte → Navigateur
account.syncToAccount=Synchroniser\u00a0: Compte ← Navigateur account.syncToAccount=Synchroniser : Compte ← Navigateur
adminUserSettings.title=Administration des paramètres des utilisateurs adminUserSettings.title=Administration des paramètres des utilisateurs
@@ -145,15 +162,16 @@ adminUserSettings.header=Administration des paramètres des utilisateurs
adminUserSettings.admin=Administateur adminUserSettings.admin=Administateur
adminUserSettings.user=Utilisateur adminUserSettings.user=Utilisateur
adminUserSettings.addUser=Ajouter un utilisateur adminUserSettings.addUser=Ajouter un utilisateur
adminUserSettings.usernameInfo=Le nom dutilisateur ne doit contenir que des lettres et des chiffres, sans espaces ni caractères spéciaux.
adminUserSettings.roles=Rôles adminUserSettings.roles=Rôles
adminUserSettings.role=Rôle adminUserSettings.role=Rôle
adminUserSettings.actions=Actions adminUserSettings.actions=Actions
adminUserSettings.apiUser=Utilisateur API limité adminUserSettings.apiUser=Utilisateur API limité
adminUserSettings.extraApiUser=Additional Limited API User adminUserSettings.extraApiUser=Utilisateur limité supplémentaire de lAPI
adminUserSettings.webOnlyUser=Utilisateur Web uniquement adminUserSettings.webOnlyUser=Utilisateur Web uniquement
adminUserSettings.demoUser=Demo User (Paramètres par défaut) adminUserSettings.demoUser=Demo User (Paramètres par défaut)
adminUserSettings.internalApiUser=Internal API User adminUserSettings.internalApiUser=Internal API User
adminUserSettings.forceChange=Forcer l\u2019utilisateur à changer son nom d\u2019utilisateur/mot de passe lors de la connexion adminUserSettings.forceChange=Forcer lutilisateur à changer son nom dutilisateur/mot de passe lors de la connexion
adminUserSettings.submit=Ajouter adminUserSettings.submit=Ajouter
############# #############
@@ -193,7 +211,7 @@ home.pdfToImage.desc=Convertissez un PDF en image (PNG, JPEG, GIF).
pdfToImage.tags=conversion,img,jpg,image,photo pdfToImage.tags=conversion,img,jpg,image,photo
home.pdfOrganiser.title=Organiser home.pdfOrganiser.title=Organiser
home.pdfOrganiser.desc=Supprimez ou réorganisez les pages dans n\u2019importe quel ordre. home.pdfOrganiser.desc=Supprimez ou réorganisez les pages dans nimporte quel ordre.
pdfOrganiser.tags=organiser,recto-verso,duplex,even,odd,sort,move pdfOrganiser.tags=organiser,recto-verso,duplex,even,odd,sort,move
@@ -203,7 +221,7 @@ addImage.tags=img,jpg,image,photo
home.watermark.title=Ajouter un filigrane home.watermark.title=Ajouter un filigrane
home.watermark.desc=Ajoutez un filigrane personnalisé à votre PDF. home.watermark.desc=Ajoutez un filigrane personnalisé à votre PDF.
watermark.tags=texte,filigrane,label,propriété,droit d\u2019auteur,marque déposée,img,jpg,image,photo,copyright,trademark watermark.tags=texte,filigrane,label,propriété,droit dauteur,marque déposée,img,jpg,image,photo,copyright,trademark
home.permissions.title=Modifier les permissions home.permissions.title=Modifier les permissions
home.permissions.desc=Modifiez les permissions de votre PDF. home.permissions.desc=Modifiez les permissions de votre PDF.
@@ -232,16 +250,16 @@ home.changeMetadata.desc=Modifiez, supprimez ou ajoutez des métadonnées à un
changeMetadata.tags=métadonnées,titre,auteur,date,création,heure,éditeur,statistiques,title,author,date,creation,time,publisher,producer,stats,metadata changeMetadata.tags=métadonnées,titre,auteur,date,création,heure,éditeur,statistiques,title,author,date,creation,time,publisher,producer,stats,metadata
home.fileToPDF.title=Fichier en PDF home.fileToPDF.title=Fichier en PDF
home.fileToPDF.desc=Convertissez presque n\u2019importe quel fichiers en PDF (DOCX, PNG, XLS, PPT, TXT et plus). home.fileToPDF.desc=Convertissez presque nimporte quel fichiers en PDF (DOCX, PNG, XLS, PPT, TXT et plus).
fileToPDF.tags=convertion,transformation,format,document,image,slide,texte,conversion,office,docs,word,excel,powerpoint fileToPDF.tags=convertion,transformation,format,document,image,slide,texte,conversion,office,docs,word,excel,powerpoint
home.ocr.title=OCR / Nettoyage des numérisations home.ocr.title=OCR / Nettoyage des numérisations
home.ocr.desc=Utilisez l\u2019OCR pour analyser et détecter le texte des images d\u2019un PDF et le rajouter en temps que tel. home.ocr.desc=Utilisez lOCR pour analyser et détecter le texte des images dun PDF et le rajouter en temps que tel.
ocr.tags=ocr,reconnaissance,texte,image,numérisation,scan,read,identify,detection,editable ocr.tags=ocr,reconnaissance,texte,image,numérisation,scan,read,identify,detection,editable
home.extractImages.title=Extraire les images home.extractImages.title=Extraire les images
home.extractImages.desc=Extrayez toutes les images d\u2019un PDF et enregistrez-les dans un ZIP. home.extractImages.desc=Extrayez toutes les images dun PDF et enregistrez-les dans un ZIP.
extractImages.tags=image,photo,save,archive,zip,capture,grab extractImages.tags=image,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=PDF en PDF/A home.pdfToPDFA.title=PDF en PDF/A
@@ -270,7 +288,7 @@ home.PDFToXML.desc=Convertissez un PDF au format XML.
PDFToXML.tags=xml,extraction de données,contenu structuré,interopérabilité,data-extraction,structured-content,interop,transformation,convert PDFToXML.tags=xml,extraction de données,contenu structuré,interopérabilité,data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=Diviser les photos numérisées home.ScannerImageSplit.title=Diviser les photos numérisées
home.ScannerImageSplit.desc=Divisez plusieurs photos à partir d\u2019une photo ou d\u2019un PDF. home.ScannerImageSplit.desc=Divisez plusieurs photos à partir dune photo ou dun PDF.
ScannerImageSplit.tags=diviser,détecter automatiquement,numériser,separate,auto-detect,scans,multi-photo,organize ScannerImageSplit.tags=diviser,détecter automatiquement,numériser,separate,auto-detect,scans,multi-photo,organize
home.sign.title=Signer home.sign.title=Signer
@@ -278,7 +296,7 @@ home.sign.desc=Ajoutez une signature au PDF avec un dessin, du texte ou une imag
sign.tags=signer,authorize,initials,drawn-signature,text-sign,image-signature sign.tags=signer,authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=Rendre inerte home.flatten.title=Rendre inerte
home.flatten.desc=Supprimez tous les éléments et formulaires interactifs d\u2019un PDF. home.flatten.desc=Supprimez tous les éléments et formulaires interactifs dun PDF.
flatten.tags=inerte,static,deactivate,non-interactive,streamline flatten.tags=inerte,static,deactivate,non-interactive,streamline
home.repair.title=Réparer home.repair.title=Réparer
@@ -286,11 +304,11 @@ home.repair.desc=Essayez de réparer un PDF corrompu ou cassé.
repair.tags=réparer,restaurer,corriger,récupérer,fix,restore,correction,recover repair.tags=réparer,restaurer,corriger,récupérer,fix,restore,correction,recover
home.removeBlanks.title=Supprimer les pages vierges home.removeBlanks.title=Supprimer les pages vierges
home.removeBlanks.desc=Détectez et supprimez les pages vierges d\u2019un PDF. home.removeBlanks.desc=Détectez et supprimez les pages vierges dun PDF.
removeBlanks.tags=pages vierges,supprimer,nettoyer,cleanup,streamline,non-content,organize removeBlanks.tags=pages vierges,supprimer,nettoyer,cleanup,streamline,non-content,organize
home.removeAnnotations.title=Supprimer les annotations home.removeAnnotations.title=Supprimer les annotations
home.removeAnnotations.desc=Supprimer tous les commentaires/annotations d\u2019un PDF. home.removeAnnotations.desc=Supprimer tous les commentaires/annotations dun PDF.
removeAnnotations.tags=commentaires,supprimer,annotations,highlight,notes,markup,remove removeAnnotations.tags=commentaires,supprimer,annotations,highlight,notes,markup,remove
home.compare.title=Comparer home.compare.title=Comparer
@@ -302,11 +320,11 @@ home.certSign.desc=Signez un PDF avec un certificat ou une clé (PEM/P12).
certSign.tags=signer,chiffrer,certificat,authenticate,PEM,P12,official,encrypt certSign.tags=signer,chiffrer,certificat,authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Fusionner des pages home.pageLayout.title=Fusionner des pages
home.pageLayout.desc=Fusionnez plusieurs pages d\u2019un PDF en une seule. home.pageLayout.desc=Fusionnez plusieurs pages dun PDF en une seule.
pageLayout.tags=fusionner,merge,composite,single-view,organize pageLayout.tags=fusionner,merge,composite,single-view,organize
home.scalePages.title=Ajuster l\u2019échelle ou la taille home.scalePages.title=Ajuster léchelle ou la taille
home.scalePages.desc=Modifiez la taille ou l\u2019échelle d\u2019une page et/ou de son contenu. home.scalePages.desc=Modifiez la taille ou léchelle dune page et/ou de son contenu.
scalePages.tags=ajuster,redimensionner,resize,modify,dimension,adapt scalePages.tags=ajuster,redimensionner,resize,modify,dimension,adapt
home.pipeline.title=Pipeline (avancé) home.pipeline.title=Pipeline (avancé)
@@ -322,11 +340,11 @@ home.auto-rename.desc=Renommez automatiquement un fichier PDF en fonction de son
auto-rename.tags=renommer,détection automatique,réétiqueter,auto-detect,header-based,organize,relabel auto-rename.tags=renommer,détection automatique,réétiqueter,auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Ajuster les couleurs home.adjust-contrast.title=Ajuster les couleurs
home.adjust-contrast.desc=Ajustez le contraste, la saturation et la luminosité d\u2019un PDF. home.adjust-contrast.desc=Ajustez le contraste, la saturation et la luminosité dun PDF.
adjust-contrast.tags=ajuster,couleurs,amélioration,color-correction,tune,modify,enhance adjust-contrast.tags=ajuster,couleurs,amélioration,color-correction,tune,modify,enhance
home.crop.title=Redimensionner home.crop.title=Redimensionner
home.crop.desc=Redimmensionnez un PDF pour réduire sa taille (en conservant le texte\u00a0!). home.crop.desc=Redimmensionnez un PDF pour réduire sa taille (en conservant le texte !).
crop.tags=redimensionner,trim,shrink,edit,shape crop.tags=redimensionner,trim,shrink,edit,shape
home.autoSplitPDF.title=Séparer automatiquement les pages home.autoSplitPDF.title=Séparer automatiquement les pages
@@ -338,16 +356,16 @@ home.sanitizePdf.desc=Supprimez les scripts et autres éléments des PDF.
sanitizePdf.tags=assainir,sécurisé,clean,secure,safe,remove-threats sanitizePdf.tags=assainir,sécurisé,clean,secure,safe,remove-threats
home.URLToPDF.title=URL en PDF home.URLToPDF.title=URL en PDF
home.URLToPDF.desc=Convertissez n\u2019importe quelle URL http(s) en PDF. home.URLToPDF.desc=Convertissez nimporte quelle URL http(s) en PDF.
URLToPDF.tags=pdf,contenu Web,save-page,web-to-doc,archive URLToPDF.tags=pdf,contenu Web,save-page,web-to-doc,archive
home.HTMLToPDF.title=HTML en PDF home.HTMLToPDF.title=HTML en PDF
home.HTMLToPDF.desc=Convertissez n\u2019importe quel fichier HTML ou ZIP en PDF. home.HTMLToPDF.desc=Convertissez nimporte quel fichier HTML ou ZIP en PDF.
HTMLToPDF.tags=html,markup,contenu Web,transformation,convert HTMLToPDF.tags=html,markup,contenu Web,transformation,convert
home.MarkdownToPDF.title=Markdown en PDF home.MarkdownToPDF.title=Markdown en PDF
home.MarkdownToPDF.desc=Convertissez n\u2019importe quel fichier Markdown en PDF. home.MarkdownToPDF.desc=Convertissez nimporte quel fichier Markdown en PDF.
MarkdownToPDF.tags=markdown,markup,contenu Web,transformation,convert MarkdownToPDF.tags=markdown,markup,contenu Web,transformation,convert
@@ -371,11 +389,11 @@ home.showJS.desc=Recherche et affiche tout JavaScript injecté dans un PDF.
showJS.tags=JS showJS.tags=JS
home.autoRedact.title=Caviarder automatiquement home.autoRedact.title=Caviarder automatiquement
home.autoRedact.desc=Caviardez automatiquement les informations sensibles d\u2019un PDF. home.autoRedact.desc=Caviardez automatiquement les informations sensibles dun PDF.
autoRedact.tags=caviarder,redact,auto autoRedact.tags=caviarder,redact,auto
home.tableExtraxt.title=PDF en CSV home.tableExtraxt.title=PDF en CSV
home.tableExtraxt.desc=Extrait les tableaux d\u2019un PDF et les transforme en CSV. home.tableExtraxt.desc=Extrait les tableaux dun PDF et les transforme en CSV.
tableExtraxt.tags=CSV,Table Extraction,extract,convert tableExtraxt.tags=CSV,Table Extraction,extract,convert
@@ -385,15 +403,15 @@ autoSizeSplitPDF.tags=pdf,split,document,organization
home.overlay-pdfs.title=Incrustation de PDF home.overlay-pdfs.title=Incrustation de PDF
home.overlay-pdfs.desc=Incrustation d\u2019un PDF sur un autre PDF. home.overlay-pdfs.desc=Incrustation dun PDF sur un autre PDF.
overlay-pdfs.tags=Overlay,incrustation overlay-pdfs.tags=Overlay,incrustation
home.split-by-sections.title=Séparer un PDF en sections home.split-by-sections.title=Séparer un PDF en sections
home.split-by-sections.desc=Diviser chaque page d\u2019un PDF en sections horizontales/verticales plus petites. home.split-by-sections.desc=Diviser chaque page dun PDF en sections horizontales/verticales plus petites.
split-by-sections.tags=Sections,Diviser,Section Split, Divide, Customize split-by-sections.tags=Sections,Diviser,Section Split, Divide, Customize
home.AddStampRequest.title=Ajouter un tampon sur un PDF home.AddStampRequest.title=Ajouter un tampon sur un PDF
home.AddStampRequest.desc=Ajouter un texte ou l\u2019image d\u2019un tampon à un emplacement défini. home.AddStampRequest.desc=Ajouter un texte ou limage dun tampon à un emplacement défini.
AddStampRequest.tags=Tampon,Ajouter,Stamp,Add image,center image,Watermark,PDF,Embed,Customize AddStampRequest.tags=Tampon,Ajouter,Stamp,Add image,center image,Watermark,PDF,Embed,Customize
@@ -416,7 +434,7 @@ login.title=Connexion
login.header=Connexion login.header=Connexion
login.signin=Connexion login.signin=Connexion
login.rememberme=Se souvenir de moi login.rememberme=Se souvenir de moi
login.invalid=Nom d\u2019utilisateur ou mot de passe invalide. login.invalid=Nom dutilisateur ou mot de passe invalide.
login.locked=Votre compte a été verrouillé. login.locked=Votre compte a été verrouillé.
login.signinTitle=Veuillez vous connecter login.signinTitle=Veuillez vous connecter
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Convertir en une seule page
pageExtracter.title=Extraire des pages pageExtracter.title=Extraire des pages
pageExtracter.header=Extraire des pages pageExtracter.header=Extraire des pages
pageExtracter.submit=Extraire pageExtracter.submit=Extraire
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -482,15 +501,15 @@ HTMLToPDF.header=HTML en PDF
HTMLToPDF.help=Accepte les fichiers HTML et les ZIP contenant du HTML, du CSS, des images, etc. (requis). HTMLToPDF.help=Accepte les fichiers HTML et les ZIP contenant du HTML, du CSS, des images, etc. (requis).
HTMLToPDF.submit=Convertir HTMLToPDF.submit=Convertir
HTMLToPDF.credit=Utilise WeasyPrint. HTMLToPDF.credit=Utilise WeasyPrint.
HTMLToPDF.zoom=Niveau de zoom pour l\u2019affichage du site web. HTMLToPDF.zoom=Niveau de zoom pour laffichage du site web.
HTMLToPDF.pageWidth=Largeur de la page en centimètres. (Vide par défaut) HTMLToPDF.pageWidth=Largeur de la page en centimètres. (Vide par défaut)
HTMLToPDF.pageHeight=Hauteur de la page en centimètres. (Vide par défaut) HTMLToPDF.pageHeight=Hauteur de la page en centimètres. (Vide par défaut)
HTMLToPDF.marginTop=Marge supérieure de la page en millimètres. (Vide par défaut) HTMLToPDF.marginTop=Marge supérieure de la page en millimètres. (Vide par défaut)
HTMLToPDF.marginBottom=Marge inférieure de la page en millimètres. (Vide par défaut) HTMLToPDF.marginBottom=Marge inférieure de la page en millimètres. (Vide par défaut)
HTMLToPDF.marginLeft=Marge gauche de la page en millimètres. (Vide par défaut) HTMLToPDF.marginLeft=Marge gauche de la page en millimètres. (Vide par défaut)
HTMLToPDF.marginRight=Marge droite de la page en millimètres. (Vide par défaut) HTMLToPDF.marginRight=Marge droite de la page en millimètres. (Vide par défaut)
HTMLToPDF.printBackground=Restituer l\u2019image de fond des sites web. HTMLToPDF.printBackground=Restituer limage de fond des sites web.
HTMLToPDF.defaultHeader=Activer l\u2019entête par défaut (Nom et numéro de page) HTMLToPDF.defaultHeader=Activer lentête par défaut (Nom et numéro de page)
HTMLToPDF.cssMediaType=Modifier le type de média CSS de la page. HTMLToPDF.cssMediaType=Modifier le type de média CSS de la page.
HTMLToPDF.none=Aucun HTMLToPDF.none=Aucun
HTMLToPDF.print=Imprimer HTMLToPDF.print=Imprimer
@@ -568,9 +587,9 @@ autoSplitPDF.header=Séparer automatiquement les pages
autoSplitPDF.description=Imprimez, insérez, numérisez, téléchargez et laissez-nous séparer automatiquement vos documents. Aucun travail de tri manuel nécessaire. autoSplitPDF.description=Imprimez, insérez, numérisez, téléchargez et laissez-nous séparer automatiquement vos documents. Aucun travail de tri manuel nécessaire.
autoSplitPDF.selectText.1=Imprimez des feuilles de séparation ci-dessous (le mode noir et blanc convient). autoSplitPDF.selectText.1=Imprimez des feuilles de séparation ci-dessous (le mode noir et blanc convient).
autoSplitPDF.selectText.2=Numérisez tous vos documents en une seule fois en insérant les feuilles intercalaires entre eux. autoSplitPDF.selectText.2=Numérisez tous vos documents en une seule fois en insérant les feuilles intercalaires entre eux.
autoSplitPDF.selectText.3=Téléchargez le fichier PDF numérisé et laissez Stirling PDF s\u2019occuper du reste. autoSplitPDF.selectText.3=Téléchargez le fichier PDF numérisé et laissez Stirling PDF soccuper du reste.
autoSplitPDF.selectText.4=Les feuilles de séparation sont automatiquement détectées et supprimées, garantissant un document final soigné. autoSplitPDF.selectText.4=Les feuilles de séparation sont automatiquement détectées et supprimées, garantissant un document final soigné.
autoSplitPDF.formPrompt=PDF contenant des feuilles de séparation de Stirling PDF\u00a0: autoSplitPDF.formPrompt=PDF contenant des feuilles de séparation de Stirling PDF :
autoSplitPDF.duplexMode=Mode recto-verso autoSplitPDF.duplexMode=Mode recto-verso
autoSplitPDF.dividerDownload1=Auto Splitter Divider (minimal).pdf autoSplitPDF.dividerDownload1=Auto Splitter Divider (minimal).pdf
autoSplitPDF.dividerDownload2=Auto Splitter Divider (with instructions).pdf autoSplitPDF.dividerDownload2=Auto Splitter Divider (with instructions).pdf
@@ -590,10 +609,10 @@ pageLayout.submit=Fusionner
#scalePages #scalePages
scalePages.title=Ajuster la taille ou l\u2019échelle scalePages.title=Ajuster la taille ou léchelle
scalePages.header=Ajuster la taille ou l\u2019échelle scalePages.header=Ajuster la taille ou léchelle
scalePages.pageSize=Taille d\u2019une page du document scalePages.pageSize=Taille dune page du document
scalePages.scaleFactor=Niveau de zoom (recadrage) d\u2019une page scalePages.scaleFactor=Niveau de zoom (recadrage) dune page
scalePages.submit=Ajuster scalePages.submit=Ajuster
@@ -601,10 +620,10 @@ scalePages.submit=Ajuster
certSign.title=Signer avec un certificat certSign.title=Signer avec un certificat
certSign.header=Signer avec un certificat (Travail en cours) certSign.header=Signer avec un certificat (Travail en cours)
certSign.selectPDF=PDF à signer certSign.selectPDF=PDF à signer
certSign.jksNote=Note: Si votre type de certificat n\u2019est pas listé ci\u002Ddessous, merci de le convertir en fichier Java Keystore (.jks) en utilisant l\u2019outil en ligne de commande keytool. Puis choisissez l\u2019option Fichier .jks ci\u002Ddessous. certSign.jksNote=Note: Si votre type de certificat nest pas listé ci-dessous, merci de le convertir en fichier Java Keystore (.jks) en utilisant loutil en ligne de commande keytool. Puis choisissez loption Fichier .jks ci-dessous.
certSign.selectKey=Fichier de clé privée (format PKCS#8, peut être .pem ou .der) certSign.selectKey=Fichier de clé privée (format PKCS#8, peut être .pem ou .der)
certSign.selectCert=Fichier de certificat (format X.509, peut être .pem ou .der) certSign.selectCert=Fichier de certificat (format X.509, peut être .pem ou .der)
certSign.selectP12=Fichier keystore de clés PKCS#12 (.p12 ou .pfx) (facultatif, s\u2019il n\u2019est fourni, il doit contenir votre clé privée et votre certificat) certSign.selectP12=Fichier keystore de clés PKCS#12 (.p12 ou .pfx) (facultatif, sil nest fourni, il doit contenir votre clé privée et votre certificat)
certSign.selectJKS=Sélectionner votre fichier Java Keystore File (.jks or .keystore): certSign.selectJKS=Sélectionner votre fichier Java Keystore File (.jks or .keystore):
certSign.certType=Type de certificat certSign.certType=Type de certificat
certSign.password=Mot de passe keystore ou clé privée le cas échéant certSign.password=Mot de passe keystore ou clé privée le cas échéant
@@ -619,7 +638,7 @@ certSign.submit=Signer
removeBlanks.title=Supprimer les pages vierges removeBlanks.title=Supprimer les pages vierges
removeBlanks.header=Supprimer les pages vierges removeBlanks.header=Supprimer les pages vierges
removeBlanks.threshold=Seuil de blancheur des pixels removeBlanks.threshold=Seuil de blancheur des pixels
removeBlanks.thresholdDesc=Seuil pour déterminer à quel point un pixel blanc doit être blanc pour être classé comme «\u00a0blanc\u00a0» (0 = noir, 255 = blanc pur). removeBlanks.thresholdDesc=Seuil pour déterminer à quel point un pixel blanc doit être blanc pour être classé comme « blanc » (0 = noir, 255 = blanc pur).
removeBlanks.whitePercent=Pourcentage de blanc removeBlanks.whitePercent=Pourcentage de blanc
removeBlanks.whitePercentDesc=Pourcentage de la page qui doit contenir des pixels « blancs » à supprimer. removeBlanks.whitePercentDesc=Pourcentage de la page qui doit contenir des pixels « blancs » à supprimer.
removeBlanks.submit=Supprimer les pages vierges removeBlanks.submit=Supprimer les pages vierges
@@ -675,15 +694,15 @@ flatten.submit=Rendre inerte
#ScannerImageSplit #ScannerImageSplit
ScannerImageSplit.selectText.1=Seuil de rotation ScannerImageSplit.selectText.1=Seuil de rotation
ScannerImageSplit.selectText.2=Définit l\u2019angle absolu minimum requis pour la rotation de l\u2019image (par défaut\u00a0: 10). ScannerImageSplit.selectText.2=Définit langle absolu minimum requis pour la rotation de limage (par défaut : 10).
ScannerImageSplit.selectText.3=Tolérance ScannerImageSplit.selectText.3=Tolérance
ScannerImageSplit.selectText.4=Détermine la plage de variation de couleur autour de la couleur d\u2019arrière-plan estimée (par défaut\u00a0: 20). ScannerImageSplit.selectText.4=Détermine la plage de variation de couleur autour de la couleur darrière-plan estimée (par défaut : 20).
ScannerImageSplit.selectText.5=Surface minimale ScannerImageSplit.selectText.5=Surface minimale
ScannerImageSplit.selectText.6=Définit la surface minimale pour une photo (par défaut\u00a0: 8\u202f000). ScannerImageSplit.selectText.6=Définit la surface minimale pour une photo (par défaut : 8000).
ScannerImageSplit.selectText.7=Surface de contour minimale ScannerImageSplit.selectText.7=Surface de contour minimale
ScannerImageSplit.selectText.8=Définit la surface de contour minimale pour une photo (par défaut\u00a0: 500). ScannerImageSplit.selectText.8=Définit la surface de contour minimale pour une photo (par défaut : 500).
ScannerImageSplit.selectText.9=Taille de la bordure ScannerImageSplit.selectText.9=Taille de la bordure
ScannerImageSplit.selectText.10=Définit la taille de la bordure ajoutée et supprimée pour éviter les bordures blanches dans la sortie (par défaut\u00a0: 1). ScannerImageSplit.selectText.10=Définit la taille de la bordure ajoutée et supprimée pour éviter les bordures blanches dans la sortie (par défaut : 1).
#OCR #OCR
@@ -692,24 +711,24 @@ ocr.header=OCR (Reconnaissance optique de caractères) / Nettoyage des numérisa
ocr.selectText.1=Langues à détecter dans le PDF (celles listées sont celles actuellement détectées) ocr.selectText.1=Langues à détecter dans le PDF (celles listées sont celles actuellement détectées)
ocr.selectText.2=Produire un fichier texte contenant le texte détecté à côté du PDF ocr.selectText.2=Produire un fichier texte contenant le texte détecté à côté du PDF
ocr.selectText.3=Corriger les pages qui ont été numérisées à un angle oblique en les remettant en place ocr.selectText.3=Corriger les pages qui ont été numérisées à un angle oblique en les remettant en place
ocr.selectText.4=Nettoyer la page afin qu\u2019il soit moins probable que l\u2019OCR trouve du texte dans le bruit de fond, sans modifier la sortie ocr.selectText.4=Nettoyer la page afin quil soit moins probable que lOCR trouve du texte dans le bruit de fond, sans modifier la sortie
ocr.selectText.5=Nettoyer la page afin qu\u2019il soit moins probable que l\u2019OCR trouve du texte dans le bruit de fond, en modifiant la sortie ocr.selectText.5=Nettoyer la page afin quil soit moins probable que lOCR trouve du texte dans le bruit de fond, en modifiant la sortie
ocr.selectText.6=Ignorer les pages contenant du texte interactif, n\u2019analyser que les pages qui sont des images ocr.selectText.6=Ignorer les pages contenant du texte interactif, nanalyser que les pages qui sont des images
ocr.selectText.7=Forcer l\u2019OCR, analyser chaque page et supprimer tous les éléments de texte d\u2019origine ocr.selectText.7=Forcer lOCR, analyser chaque page et supprimer tous les éléments de texte dorigine
ocr.selectText.8=Normal (génère une erreur si le PDF contient du texte) ocr.selectText.8=Normal (génère une erreur si le PDF contient du texte)
ocr.selectText.9=Paramètres additionnels ocr.selectText.9=Paramètres additionnels
ocr.selectText.10=Mode OCR ocr.selectText.10=Mode OCR
ocr.selectText.11=Supprimer les images après l\u2019OCR (Supprime TOUTES les images, utile uniquement si elles font partie de l\u2019étape de conversion) ocr.selectText.11=Supprimer les images après lOCR (Supprime TOUTES les images, utile uniquement si elles font partie de létape de conversion)
ocr.selectText.12=Type de rendu (avancé) ocr.selectText.12=Type de rendu (avancé)
ocr.help=Veuillez lire cette documentation pour savoir comment utiliser l\u2019OCR pour d\u2019autres langues ou une utilisation hors Docker\u00a0: ocr.help=Veuillez lire cette documentation pour savoir comment utiliser lOCR pour dautres langues ou une utilisation hors Docker :
ocr.credit=Ce service utilise OCRmyPDF et Tesseract pour l\u2019OCR. ocr.credit=Ce service utilise OCRmyPDF et Tesseract pour lOCR.
ocr.submit=Traiter ocr.submit=Traiter
#extractImages #extractImages
extractImages.title=Extraire les images extractImages.title=Extraire les images
extractImages.header=Extraire les images extractImages.header=Extraire les images
extractImages.selectText=Format d\u2019image dans lequel convertir les images extraites extractImages.selectText=Format dimage dans lequel convertir les images extraites
extractImages.submit=Extraire extractImages.submit=Extraire
@@ -723,20 +742,20 @@ fileToPDF.submit=Convertir
#compress #compress
compress.title=Compresser un PDF compress.title=Compresser un PDF
compress.header=Compresser un PDF (lorsque c\u2019est possible!) compress.header=Compresser un PDF (lorsque cest possible!)
compress.credit=Ce service utilise Ghostscript pour la compression et l\u2019optimisation des PDF. compress.credit=Ce service utilise Ghostscript pour la compression et loptimisation des PDF.
compress.selectText.1=Mode manuel \u2013 de 1 à 4 compress.selectText.1=Mode manuel de 1 à 4
compress.selectText.2=Niveau d\u2019optimisation compress.selectText.2=Niveau doptimisation
compress.selectText.3=4 (terrible pour les images textuelles) compress.selectText.3=4 (terrible pour les images textuelles)
compress.selectText.4=Mode automatique \u2013 ajuste automatiquement la qualité pour obtenir le PDF à la taille exacte compress.selectText.4=Mode automatique ajuste automatiquement la qualité pour obtenir le PDF à la taille exacte
compress.selectText.5=Taille PDF attendue (par exemple, 25\u202fMB, 10,8\u202fMB, 25\u202fKB) compress.selectText.5=Taille PDF attendue (par exemple, 25MB, 10,8MB, 25KB)
compress.submit=Compresser compress.submit=Compresser
#Add image #Add image
addImage.title=Ajouter une image addImage.title=Ajouter une image
addImage.header=Ajouter une image addImage.header=Ajouter une image
addImage.everyPage=Toutes les pages\u00a0? addImage.everyPage=Toutes les pages ?
addImage.upload=Télécharger une image addImage.upload=Télécharger une image
addImage.submit=Ajouter une image addImage.submit=Ajouter une image
@@ -753,11 +772,23 @@ merge.submit=Fusionner
pdfOrganiser.title=Organiser pdfOrganiser.title=Organiser
pdfOrganiser.header=Organiser les pages pdfOrganiser.header=Organiser les pages
pdfOrganiser.submit=Organiser pdfOrganiser.submit=Organiser
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)
#multiTool #multiTool
multiTool.title=Outil multifonction PDF multiTool.title=Outil multifonction PDF
multiTool.header=Outil multifonction PDF multiTool.header=Outil multifonction PDF
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=Visualiser un PDF viewPdf.title=Visualiser un PDF
@@ -766,28 +797,29 @@ viewPdf.header=Visualiser un PDF
#pageRemover #pageRemover
pageRemover.title=Supprimer des pages pageRemover.title=Supprimer des pages
pageRemover.header=Supprimer des pages pageRemover.header=Supprimer des pages
pageRemover.pagesToDelete=Pages à supprimer (entrez une liste de numéros de pages séparés par des virgules)\u00a0: pageRemover.pagesToDelete=Pages à supprimer (entrez une liste de numéros de pages séparés par des virgules) :
pageRemover.submit=Supprimer les pages pageRemover.submit=Supprimer les pages
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
rotate.title=Pivoter rotate.title=Pivoter
rotate.header=Pivoter rotate.header=Pivoter
rotate.selectAngle=Angle de rotation (par multiples de 90\u202fdegrés) rotate.selectAngle=Angle de rotation (par multiples de 90degrés)
rotate.submit=Pivoter rotate.submit=Pivoter
#merge #split-pdfs
split.title=Diviser split.title=Diviser
split.header=Diviser split.header=Diviser
split.desc.1=Les numéros que vous sélectionnez sont le numéro de page sur lequel vous souhaitez faire une division split.desc.1=Les numéros que vous sélectionnez sont le numéro de page sur lequel vous souhaitez faire une division
split.desc.2=Ainsi, la sélection de 1,3,7-8 diviserait un document de 10 pages en 6 PDF distincts avec\u00a0: split.desc.2=Ainsi, la sélection de 1,3,7-9 diviserait un document de 10 pages en 6 PDF distincts avec :
split.desc.3=Document #1: Page 1 split.desc.3=Document #1: Page 1
split.desc.4=Document #2: Page 2 et 3 split.desc.4=Document #2: Page 2 et 3
split.desc.5=Document #3: Page 4, 5 et 6 split.desc.5=Document #3: Page 4, 5, 6 et 7
split.desc.6=Document #4: Page 7 split.desc.6=Document #4: Page 8
split.desc.7=Document #5: Page 8 split.desc.7=Document #5: Page 9
split.desc.8=Document #6: Page 9 et 10 split.desc.8=Document #6: Page 10
split.splitPages=Pages sur lesquelles diviser split.splitPages=Pages sur lesquelles diviser
split.submit=Diviser split.submit=Diviser
@@ -796,9 +828,9 @@ split.submit=Diviser
imageToPDF.title=Image en PDF imageToPDF.title=Image en PDF
imageToPDF.header=Image en PDF imageToPDF.header=Image en PDF
imageToPDF.submit=Convertir imageToPDF.submit=Convertir
imageToPDF.selectLabel=Options d\u2019ajustement de l\u2019image imageToPDF.selectLabel=Options dajustement de limage
imageToPDF.fillPage=Remplir la page imageToPDF.fillPage=Remplir la page
imageToPDF.fitDocumentToImage=Ajuster la page à l\u2019image imageToPDF.fitDocumentToImage=Ajuster la page à limage
imageToPDF.maintainAspectRatio=Maintenir les proportions imageToPDF.maintainAspectRatio=Maintenir les proportions
imageToPDF.selectText.2=Rotation automatique du PDF imageToPDF.selectText.2=Rotation automatique du PDF
imageToPDF.selectText.3=Logique multi-fichiers (uniquement activée si vous travaillez avec plusieurs images) imageToPDF.selectText.3=Logique multi-fichiers (uniquement activée si vous travaillez avec plusieurs images)
@@ -809,14 +841,14 @@ imageToPDF.selectText.5=Convertir en PDF séparés
#pdfToImage #pdfToImage
pdfToImage.title=Image en PDF pdfToImage.title=Image en PDF
pdfToImage.header=Image en PDF pdfToImage.header=Image en PDF
pdfToImage.selectText=Format d\u2019image pdfToImage.selectText=Format dimage
pdfToImage.singleOrMultiple=Type de résultat pdfToImage.singleOrMultiple=Type de résultat
pdfToImage.single=Une seule grande image pdfToImage.single=Une seule grande image
pdfToImage.multi=Plusieurs images pdfToImage.multi=Plusieurs images
pdfToImage.colorType=Type d\u2019impression pdfToImage.colorType=Type dimpression
pdfToImage.color=Couleur pdfToImage.color=Couleur
pdfToImage.grey=Niveaux de gris pdfToImage.grey=Niveaux de gris
pdfToImage.blackwhite=Noir et blanc (peut engendrer une perte de données\u00a0!) pdfToImage.blackwhite=Noir et blanc (peut engendrer une perte de données !)
pdfToImage.submit=Convertir pdfToImage.submit=Convertir
@@ -824,21 +856,21 @@ pdfToImage.submit=Convertir
addPassword.title=Ajouter un mot de passe addPassword.title=Ajouter un mot de passe
addPassword.header=Ajouter un mot de passe addPassword.header=Ajouter un mot de passe
addPassword.selectText.1=PDF à chiffrer addPassword.selectText.1=PDF à chiffrer
addPassword.selectText.2=Mot de passe de l\u2019utilisateur addPassword.selectText.2=Mot de passe de lutilisateur
addPassword.selectText.3=Longueur de la clé de chiffrement addPassword.selectText.3=Longueur de la clé de chiffrement
addPassword.selectText.4=Les valeurs plus élevées sont plus fortes, mais les valeurs plus faibles ont une meilleure compatibilité. addPassword.selectText.4=Les valeurs plus élevées sont plus fortes, mais les valeurs plus faibles ont une meilleure compatibilité.
addPassword.selectText.5=Autorisations à définir (utilisation recommandée avec le mot de passe du propriétaire) addPassword.selectText.5=Autorisations à définir (utilisation recommandée avec le mot de passe du propriétaire)
addPassword.selectText.6=Empêcher l\u2019assemblage du document addPassword.selectText.6=Empêcher lassemblage du document
addPassword.selectText.7=Empêcher l\u2019extraction de contenu addPassword.selectText.7=Empêcher lextraction de contenu
addPassword.selectText.8=Empêcher l\u2019extraction pour l\u2019accessibilité addPassword.selectText.8=Empêcher lextraction pour laccessibilité
addPassword.selectText.9=Empêcher de remplir les formulaires addPassword.selectText.9=Empêcher de remplir les formulaires
addPassword.selectText.10=Empêcher la modification addPassword.selectText.10=Empêcher la modification
addPassword.selectText.11=Empêcher la modification des annotations addPassword.selectText.11=Empêcher la modification des annotations
addPassword.selectText.12=Empêcher l\u2019impression addPassword.selectText.12=Empêcher limpression
addPassword.selectText.13=Empêcher l\u2019impression des différents formats addPassword.selectText.13=Empêcher limpression des différents formats
addPassword.selectText.14=Mot de passe du propriétaire addPassword.selectText.14=Mot de passe du propriétaire
addPassword.selectText.15=Restreint ce qui peut être fait avec le document une fois qu\u2019il est ouvert (non pris en charge par tous les lecteurs). addPassword.selectText.15=Restreint ce qui peut être fait avec le document une fois quil est ouvert (non pris en charge par tous les lecteurs).
addPassword.selectText.16=Restreint l\u2019ouverture du document lui-même. addPassword.selectText.16=Restreint louverture du document lui-même.
addPassword.submit=Chiffrer addPassword.submit=Chiffrer
@@ -855,6 +887,8 @@ watermark.selectText.7=Opacité (de 0% à 100%)
watermark.selectText.8=Type de filigrane watermark.selectText.8=Type de filigrane
watermark.selectText.9=Image du filigrane watermark.selectText.9=Image du filigrane
watermark.submit=Ajouter un filigrane watermark.submit=Ajouter un filigrane
watermark.type.1=Text
watermark.type.2=Image
#Change permissions #Change permissions
@@ -863,14 +897,14 @@ permissions.header=Modifier les permissions
permissions.warning=Attention, pour que ces permissions soient immuables il est recommandé de les paramétrer avec un mot de passe via la page Ajouter un mot de passe. permissions.warning=Attention, pour que ces permissions soient immuables il est recommandé de les paramétrer avec un mot de passe via la page Ajouter un mot de passe.
permissions.selectText.1=Sélectionnez le PDF permissions.selectText.1=Sélectionnez le PDF
permissions.selectText.2=Permissions à définir permissions.selectText.2=Permissions à définir
permissions.selectText.3=Empêcher l\u2019assemblage du document permissions.selectText.3=Empêcher lassemblage du document
permissions.selectText.4=Empêcher l\u2019extraction de contenu permissions.selectText.4=Empêcher lextraction de contenu
permissions.selectText.5=Empêcher l\u2019extraction pour l\u2019accessibilité permissions.selectText.5=Empêcher lextraction pour laccessibilité
permissions.selectText.6=Empêcher de remplir les formulaires permissions.selectText.6=Empêcher de remplir les formulaires
permissions.selectText.7=Empêcher la modification permissions.selectText.7=Empêcher la modification
permissions.selectText.8=Empêcher la modification des annotations permissions.selectText.8=Empêcher la modification des annotations
permissions.selectText.9=Empêcher l\u2019impression permissions.selectText.9=Empêcher limpression
permissions.selectText.10=Empêcher l\u2019impression des différents formats permissions.selectText.10=Empêcher limpression des différents formats
permissions.submit=Modifier permissions.submit=Modifier
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDF en PDF/A
pdfToPDFA.header=PDF en PDF/A pdfToPDFA.header=PDF en PDF/A
pdfToPDFA.credit=Ce service utilise OCRmyPDF pour la conversion en PDF/A. pdfToPDFA.credit=Ce service utilise OCRmyPDF pour la conversion en PDF/A.
pdfToPDFA.submit=Convertir pdfToPDFA.submit=Convertir
pdfToPDFA.tip=Currently does not work for multiple inputs at once
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=Convertir
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF en HTML PDFToHTML.title=PDF en HTML
PDFToHTML.header=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 PDFToHTML.submit=Convertir
@@ -967,13 +1002,13 @@ split-by-size-or-count.submit=Séparer
overlay-pdfs.header=Incrustation de PDF overlay-pdfs.header=Incrustation de PDF
overlay-pdfs.baseFile.label=Sélectionner le fichier PDF de base overlay-pdfs.baseFile.label=Sélectionner le fichier PDF de base
overlay-pdfs.overlayFiles.label=Sélectionner les fichiers PDF à superposer overlay-pdfs.overlayFiles.label=Sélectionner les fichiers PDF à superposer
overlay-pdfs.mode.label=Sélectionner le mode d\u2019incrustation overlay-pdfs.mode.label=Sélectionner le mode dincrustation
overlay-pdfs.mode.sequential=Superposition séquentielle overlay-pdfs.mode.sequential=Superposition séquentielle
overlay-pdfs.mode.interleaved=Superposition entrelacée overlay-pdfs.mode.interleaved=Superposition entrelacée
overlay-pdfs.mode.fixedRepeat=Superposition à répétition fixe overlay-pdfs.mode.fixedRepeat=Superposition à répétition fixe
overlay-pdfs.counts.label=Nombre de superpositions (pour le mode de répétition fixe) overlay-pdfs.counts.label=Nombre de superpositions (pour le mode de répétition fixe)
overlay-pdfs.counts.placeholder=Compteurs (séparés par des virgules, exemple : 2,3,1) overlay-pdfs.counts.placeholder=Compteurs (séparés par des virgules, exemple : 2,3,1)
overlay-pdfs.position.label=Définir la position de l\u2019incrustation overlay-pdfs.position.label=Définir la position de lincrustation
overlay-pdfs.position.foreground=Premier plan overlay-pdfs.position.foreground=Premier plan
overlay-pdfs.position.background=Arrière-plan overlay-pdfs.position.background=Arrière-plan
overlay-pdfs.submit=Soumettre overlay-pdfs.submit=Soumettre
@@ -987,7 +1022,16 @@ split-by-sections.vertical.label=Divisions verticales
split-by-sections.horizontal.placeholder=Saisir le nombre de divisions horizontales split-by-sections.horizontal.placeholder=Saisir le nombre de divisions horizontales
split-by-sections.vertical.placeholder=Entrer le nombre de divisions verticales split-by-sections.vertical.placeholder=Entrer le nombre de divisions verticales
split-by-sections.submit=Diviser le PDF split-by-sections.submit=Diviser le PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Fusionner en un seul PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licences licenses.nav=Licences
@@ -998,3 +1042,16 @@ licenses.version=Version
licenses.license=Licence licenses.license=Licence
# error
error.sorry=Désolé pour ce problème !
error.needHelp=Besoin daide / Vous avez trouvé un problème ?
error.contactTip=Si vous avez encore des problèmes, nhésitez pas à nous contacter pour obtenir de laide. Vous pouvez soumettre un ticket sur notre page GitHub ou nous contacter via Discord :
error.404.head=404 - Page non trouvée | oups on sest foiré !
error.404.1=Nous ne parvenons pas à trouver la page que vous recherchez.
error.404.2=Quelque chose na 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 dassistance

View File

@@ -17,6 +17,7 @@ true=सही
false=गलत false=गलत
unknown=अज्ञात unknown=अज्ञात
save=सहेजें save=सहेजें
saveToBrowser=Save to Browser
close=बंद करें close=बंद करें
filesSelected=फ़ाइलें चयनित हैं filesSelected=फ़ाइलें चयनित हैं
noFavourites=कोई पसंदीदा जोड़ा नहीं गया है noFavourites=कोई पसंदीदा जोड़ा नहीं गया है
@@ -53,18 +54,32 @@ notAuthenticatedMessage=उपयोगकर्ता प्रमाणित
userNotFoundMessage=उपयोगकर्ता नहीं मिला। userNotFoundMessage=उपयोगकर्ता नहीं मिला।
incorrectPasswordMessage=वर्तमान पासवर्ड गलत है। incorrectPasswordMessage=वर्तमान पासवर्ड गलत है।
usernameExistsMessage=नया उपयोगकर्ता नाम पहले से मौजूद है। usernameExistsMessage=नया उपयोगकर्ता नाम पहले से मौजूद है।
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Cannot delete currently logged in user.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. 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
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Pipeline Menu (Beta)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Upload Custom
pipeline.configureButton=Configure pipeline.configureButton=Configure
pipeline.defaultOption=Custom pipeline.defaultOption=Custom
pipeline.submitButton=Submit pipeline.submitButton=Submit
pipeline.help=Pipeline Help
pipeline.scanHelp=Folder Scanning Help
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,6 +112,7 @@ navbar.settings=सेटिंग्स
############# #############
settings.title=सेटिंग्स settings.title=सेटिंग्स
settings.update=अपडेट उपलब्ध है settings.update=अपडेट उपलब्ध है
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=ऐप संस्करण: settings.appVersion=ऐप संस्करण:
settings.downloadOption.title=डाउनलोड विकल्प चुनें (एकल फ़ाइल गैर-ज़िप डाउनलोड के लिए): settings.downloadOption.title=डाउनलोड विकल्प चुनें (एकल फ़ाइल गैर-ज़िप डाउनलोड के लिए):
settings.downloadOption.1=एक ही विंडो में खोलें settings.downloadOption.1=एक ही विंडो में खोलें
@@ -105,8 +121,9 @@ settings.downloadOption.3=फ़ाइल डाउनलोड करें
settings.zipThreshold=जब डाउनलोड की गई फ़ाइलों की संख्या सीमा से अधिक हो settings.zipThreshold=जब डाउनलोड की गई फ़ाइलों की संख्या सीमा से अधिक हो
settings.signOut=साइन आउट settings.signOut=साइन आउट
settings.accountSettings=खाता सेटिंग्स settings.accountSettings=खाता सेटिंग्स
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=क्रेडेंशियल बदलें changeCreds.title=क्रेडेंशियल बदलें
changeCreds.header=अपना खाता विवरण अपडेट करें changeCreds.header=अपना खाता विवरण अपडेट करें
@@ -145,6 +162,7 @@ adminUserSettings.header=व्यवस्थापक उपयोगकर्
adminUserSettings.admin=व्यवस्थापक adminUserSettings.admin=व्यवस्थापक
adminUserSettings.user=उपयोगकर्ता adminUserSettings.user=उपयोगकर्ता
adminUserSettings.addUser=नया उपयोगकर्ता जोड़ें adminUserSettings.addUser=नया उपयोगकर्ता जोड़ें
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
adminUserSettings.roles=रोल्स adminUserSettings.roles=रोल्स
adminUserSettings.role=रोल adminUserSettings.role=रोल
adminUserSettings.actions=क्रियाएँ adminUserSettings.actions=क्रियाएँ
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=एकल पृष्ठ में परिवर्त
pageExtracter.title=पृष्ठों को निकालें pageExtracter.title=पृष्ठों को निकालें
pageExtracter.header=पृष्ठों को निकालें pageExtracter.header=पृष्ठों को निकालें
pageExtracter.submit=निकालें pageExtracter.submit=निकालें
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -753,11 +772,23 @@ merge.submit=मर्ज करें
pdfOrganiser.title=पेज व्यवस्थापक pdfOrganiser.title=पेज व्यवस्थापक
pdfOrganiser.header=PDF पेज व्यवस्थापक pdfOrganiser.header=PDF पेज व्यवस्थापक
pdfOrganiser.submit=पृष्ठों को पुनः व्यवस्थित करें 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)
#multiTool #multiTool
multiTool.title=पीडीएफ मल्टी टूल multiTool.title=पीडीएफ मल्टी टूल
multiTool.header=पीडीएफ मल्टी टूल multiTool.header=पीडीएफ मल्टी टूल
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=पीडीएफ देखें viewPdf.title=पीडीएफ देखें
@@ -768,6 +799,7 @@ pageRemover.title=पेज हटाने वाला
pageRemover.header=पीडीएफ पेज हटाने वाला pageRemover.header=पीडीएफ पेज हटाने वाला
pageRemover.pagesToDelete=हटाने के पेज (पृष्ठ संख्याओं की व्यवस्था के लिए एक कॉमा से अलग संख्याओं की सूची दर्ज करें): pageRemover.pagesToDelete=हटाने के पेज (पृष्ठ संख्याओं की व्यवस्था के लिए एक कॉमा से अलग संख्याओं की सूची दर्ज करें):
pageRemover.submit=पेज हटाएं pageRemover.submit=पेज हटाएं
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=चुनें घुमाने का कोण (90 ड
rotate.submit=घुमाएं rotate.submit=घुमाएं
#merge #split-pdfs
split.title=पीडीएफ को विभाजित करें split.title=पीडीएफ को विभाजित करें
split.header=पीडीएफ को विभाजित करें split.header=पीडीएफ को विभाजित करें
split.desc.1=जिन नंबरों को आप चुनते हैं, वे पृष्ठ संख्या होती हैं जिन पर आप विभाजन करना चाहते हैं। split.desc.1=जिन नंबरों को आप चुनते हैं, वे पृष्ठ संख्या होती हैं जिन पर आप विभाजन करना चाहते हैं।
split.desc.2=इसलिए, 1,3,7-8 का चयन करना एक 10 पृष्ठों के दस्तावेज़ को 6 अलग-अलग पीडीएफ में विभाजित करेगा जैसे: split.desc.2=इसलिए, 1,3,7-9 का चयन करना एक 10 पृष्ठों के दस्तावेज़ को 6 अलग-अलग पीडीएफ में विभाजित करेगा जैसे:
split.desc.3=दस्तावेज़ #1: पृष्ठ 1 split.desc.3=दस्तावेज़ #1: पृष्ठ 1
split.desc.4=दस्तावेज़ #2: पृष्ठ 2 और 3 split.desc.4=दस्तावेज़ #2: पृष्ठ 2 और 3
split.desc.5=दस्तावेज़ #3: पृष्ठ 4, 5 और 6 split.desc.5=दस्तावेज़ #3: पृष्ठ 4, 5, 6 और 7
split.desc.6=दस्तावेज़ #4: पृष्ठ 7 split.desc.6=दस्तावेज़ #4: पृष्ठ 7
split.desc.7=दस्तावेज़ #5: पृष्ठ 8 split.desc.7=दस्तावेज़ #5: पृष्ठ 8
split.desc.8=दस्तावेज़ #6: पृष्ठ 9 और 10 split.desc.8=दस्तावेज़ #6: पृष्ठ 10
split.splitPages=विभाजन करने के लिए पृष्ठ दर्ज करें: split.splitPages=विभाजन करने के लिए पृष्ठ दर्ज करें:
split.submit=विभाजित करें split.submit=विभाजित करें
@@ -855,6 +887,8 @@ watermark.selectText.7=अपारदर्शिता (0% - 100%):
watermark.selectText.8=वॉटरमार्क प्रकार: watermark.selectText.8=वॉटरमार्क प्रकार:
watermark.selectText.9=वॉटरमार्क छवि: watermark.selectText.9=वॉटरमार्क छवि:
watermark.submit=वॉटरमार्क जोड़ें watermark.submit=वॉटरमार्क जोड़ें
watermark.type.1=Text
watermark.type.2=Image
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDF से PDF/A में
pdfToPDFA.header=PDF से PDF/A में pdfToPDFA.header=PDF से PDF/A में
pdfToPDFA.credit=इस सेवा में PDF/A परिवर्तन के लिए OCRmyPDF का उपयोग किया जाता है। pdfToPDFA.credit=इस सेवा में PDF/A परिवर्तन के लिए OCRmyPDF का उपयोग किया जाता है।
pdfToPDFA.submit=परिवर्तित करें pdfToPDFA.submit=परिवर्तित करें
pdfToPDFA.tip=Currently does not work for multiple inputs at once
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=परिवर्तित करें
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF से HTML PDFToHTML.title=PDF से HTML
PDFToHTML.header=PDF से HTML PDFToHTML.header=PDF से HTML
PDFToHTML.credit=यह सेवा फ़ाइल परिवर्तन के लिए LibreOffice का उपयोग करती है। PDFToHTML.credit=यह सेवा फ़ाइल परिवर्तन के लिए pdftohtml का उपयोग करती है।
PDFToHTML.submit=परिवर्तित करें PDFToHTML.submit=परिवर्तित करें
@@ -989,6 +1024,15 @@ split-by-sections.vertical.placeholder=लंबवत विभाजन की
split-by-sections.submit=PDF को विभाजित करें split-by-sections.submit=PDF को विभाजित करें
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses
@@ -998,3 +1042,16 @@ licenses.version=Version
licenses.license=License 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

View File

@@ -17,6 +17,7 @@ true=Igaz
false=Hamis false=Hamis
unknown=Ismeretlen unknown=Ismeretlen
save=Mentés save=Mentés
saveToBrowser=Save to Browser
close=Bezárás close=Bezárás
filesSelected=kiválasztott fájlok filesSelected=kiválasztott fájlok
noFavourites=Nincs hozzáadva kedvenc noFavourites=Nincs hozzáadva kedvenc
@@ -53,18 +54,32 @@ notAuthenticatedMessage=Felhasználó nincs hitelesítve.
userNotFoundMessage=A felhasználó nem található. userNotFoundMessage=A felhasználó nem található.
incorrectPasswordMessage=A jelenlegi jelszó helytelen. incorrectPasswordMessage=A jelenlegi jelszó helytelen.
usernameExistsMessage=Az új felhasználónév már létezik. 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. deleteCurrentUserMessage=Cannot delete currently logged in user.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. 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
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Pipeline Menu (Beta)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Upload Custom
pipeline.configureButton=Configure pipeline.configureButton=Configure
pipeline.defaultOption=Custom pipeline.defaultOption=Custom
pipeline.submitButton=Submit pipeline.submitButton=Submit
pipeline.help=Pipeline Help
pipeline.scanHelp=Folder Scanning Help
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,6 +112,7 @@ navbar.settings=Beállítások
############# #############
settings.title=Beállítások settings.title=Beállítások
settings.update=Frisítés elérhető settings.update=Frisítés elérhető
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=App Verzió: settings.appVersion=App Verzió:
settings.downloadOption.title=Válassza ki a letöltési lehetőséget (Egyetlen fájl esetén a nem tömörített letöltésekhez): settings.downloadOption.title=Válassza ki a letöltési lehetőséget (Egyetlen fájl esetén a nem tömörített letöltésekhez):
settings.downloadOption.1=Nyissa meg ugyanabban az ablakban settings.downloadOption.1=Nyissa meg ugyanabban az ablakban
@@ -105,8 +121,9 @@ settings.downloadOption.3=Töltse le a fájlt
settings.zipThreshold=Fájlok tömörítése, ha a letöltött fájlok száma meghaladja settings.zipThreshold=Fájlok tömörítése, ha a letöltött fájlok száma meghaladja
settings.signOut=Kijelentkezés settings.signOut=Kijelentkezés
settings.accountSettings=Fiókbeállítások settings.accountSettings=Fiókbeállítások
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Hitelesítés megváltoztatása changeCreds.title=Hitelesítés megváltoztatása
changeCreds.header=Frissítse fiókadatait changeCreds.header=Frissítse fiókadatait
@@ -145,6 +162,7 @@ adminUserSettings.header=Adminisztrátori Felhasználói Vezérlési Beállítá
adminUserSettings.admin=Adminisztrátor adminUserSettings.admin=Adminisztrátor
adminUserSettings.user=Felhasználó adminUserSettings.user=Felhasználó
adminUserSettings.addUser=Új felhasználó hozzáadása adminUserSettings.addUser=Új felhasználó hozzáadása
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
adminUserSettings.roles=Szerepek adminUserSettings.roles=Szerepek
adminUserSettings.role=Szerep adminUserSettings.role=Szerep
adminUserSettings.actions=Műveletek adminUserSettings.actions=Műveletek
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Átalakítás egyetlen oldallá
pageExtracter.title=Oldalak kinyerése pageExtracter.title=Oldalak kinyerése
pageExtracter.header=Oldalak kinyerése pageExtracter.header=Oldalak kinyerése
pageExtracter.submit=Kinyerés pageExtracter.submit=Kinyerés
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -753,11 +772,23 @@ merge.submit=Összevonás
pdfOrganiser.title=Oldalszervező pdfOrganiser.title=Oldalszervező
pdfOrganiser.header=PDF Oldalszervező pdfOrganiser.header=PDF Oldalszervező
pdfOrganiser.submit=Oldalak átrendezése pdfOrganiser.submit=Oldalak átrendezése
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)
#multiTool #multiTool
multiTool.title=PDF többfunkciós eszköz multiTool.title=PDF többfunkciós eszköz
multiTool.header=PDF többfunkciós eszköz multiTool.header=PDF többfunkciós eszköz
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=PDF megtekintése viewPdf.title=PDF megtekintése
@@ -768,6 +799,7 @@ pageRemover.title=Oldaltörlő
pageRemover.header=PDF oldaltörlő pageRemover.header=PDF oldaltörlő
pageRemover.pagesToDelete=Törlendő oldalak (adja meg az oldalszámok vesszővel elválasztott listáját): pageRemover.pagesToDelete=Törlendő oldalak (adja meg az oldalszámok vesszővel elválasztott listáját):
pageRemover.submit=Oldalak törlése pageRemover.submit=Oldalak törlése
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=Válassza ki a forgatási szöget (90 fok egész számú töb
rotate.submit=Forgatás rotate.submit=Forgatás
#merge #split-pdfs
split.title=PDF szétválasztás split.title=PDF szétválasztás
split.header=PDF szétválasztás split.header=PDF szétválasztás
split.desc.1=A kiválasztott számok a szétválasztani kívánt oldalszámok split.desc.1=A kiválasztott számok a szétválasztani kívánt oldalszámok
split.desc.2=Például az 1,3,7-8 kiválasztása egy 10 oldalas dokumentumot 6 különálló PDF-fé szétválaszt split.desc.2=Például az 1,3,7-9 kiválasztása egy 10 oldalas dokumentumot 6 különálló PDF-fé szétválaszt
split.desc.3=Dokumentum #1: Oldal 1 split.desc.3=Dokumentum #1: Oldal 1
split.desc.4=Dokumentum #2: Oldal 2 és 3 split.desc.4=Dokumentum #2: Oldal 2 és 3
split.desc.5=Dokumentum #3: Oldal 4, 5 és 6 split.desc.5=Dokumentum #3: Oldal 4, 5, 6 és 7
split.desc.6=Dokumentum #4: Oldal 7 split.desc.6=Dokumentum #4: Oldal 8
split.desc.7=Dokumentum #5: Oldal 8 split.desc.7=Dokumentum #5: Oldal 9
split.desc.8=Dokumentum #6: Oldal 9 és 10 split.desc.8=Dokumentum #6: Oldal 10
split.splitPages=Adja meg az oldalakat, amelyekre szét akarja választani: split.splitPages=Adja meg az oldalakat, amelyekre szét akarja választani:
split.submit=Szétválasztás split.submit=Szétválasztás
@@ -855,6 +887,8 @@ watermark.selectText.7=Átlátszóság (0% - 100%):
watermark.selectText.8=Vízjel típusa: watermark.selectText.8=Vízjel típusa:
watermark.selectText.9=Vízjel képe: watermark.selectText.9=Vízjel képe:
watermark.submit=Vízjel hozzáadása watermark.submit=Vízjel hozzáadása
watermark.type.1=Text
watermark.type.2=Image
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDF >> PDF/A
pdfToPDFA.header=PDF >> PDF/A pdfToPDFA.header=PDF >> PDF/A
pdfToPDFA.credit=Ez a szolgáltatás az OCRmyPDF-t használja a PDF/A konverzióhoz pdfToPDFA.credit=Ez a szolgáltatás az OCRmyPDF-t használja a PDF/A konverzióhoz
pdfToPDFA.submit=Konvertálás pdfToPDFA.submit=Konvertálás
pdfToPDFA.tip=Currently does not work for multiple inputs at once
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=Konvertálás
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF >> HTML PDFToHTML.title=PDF >> HTML
PDFToHTML.header=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 PDFToHTML.submit=Konvertálás
@@ -989,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.submit=Felosztás
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses
@@ -998,3 +1042,16 @@ licenses.version=Version
licenses.license=License 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

View File

@@ -17,6 +17,7 @@ true=Benar
false=Salah false=Salah
unknown=Tidak diketahui unknown=Tidak diketahui
save=Simpan save=Simpan
saveToBrowser=Save to Browser
close=Tutup close=Tutup
filesSelected=berkas dipilih filesSelected=berkas dipilih
noFavourites=Tidak ada favorit yang ditambahkan noFavourites=Tidak ada favorit yang ditambahkan
@@ -53,18 +54,32 @@ notAuthenticatedMessage=Pengguna tidak ter-autentikasi.
userNotFoundMessage=Pengguna tidak ditemukan. userNotFoundMessage=Pengguna tidak ditemukan.
incorrectPasswordMessage=Kata sandi saat ini salah. incorrectPasswordMessage=Kata sandi saat ini salah.
usernameExistsMessage=Nama pengguna baru sudah ada. usernameExistsMessage=Nama pengguna baru sudah ada.
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Cannot delete currently logged in user.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. 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
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Pipeline Menu (Beta)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Upload Custom
pipeline.configureButton=Configure pipeline.configureButton=Configure
pipeline.defaultOption=Custom pipeline.defaultOption=Custom
pipeline.submitButton=Submit pipeline.submitButton=Submit
pipeline.help=Pipeline Help
pipeline.scanHelp=Folder Scanning Help
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,6 +112,7 @@ navbar.settings=Pengaturan
############# #############
settings.title=Pengaturan settings.title=Pengaturan
settings.update=Pembaruan tersedia settings.update=Pembaruan tersedia
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Versi Aplikasi: settings.appVersion=Versi Aplikasi:
settings.downloadOption.title=Pilih opsi unduhan (Untuk unduhan berkas tunggal non zip): settings.downloadOption.title=Pilih opsi unduhan (Untuk unduhan berkas tunggal non zip):
settings.downloadOption.1=Buka di jendela yang sama settings.downloadOption.1=Buka di jendela yang sama
@@ -105,8 +121,9 @@ settings.downloadOption.3=Unduh berkas
settings.zipThreshold=Berkas zip ketika jumlah berkas yang diunduh melebihi settings.zipThreshold=Berkas zip ketika jumlah berkas yang diunduh melebihi
settings.signOut=Keluar settings.signOut=Keluar
settings.accountSettings=Pengaturan Akun settings.accountSettings=Pengaturan Akun
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Ubah Kredensial changeCreds.title=Ubah Kredensial
changeCreds.header=Perbarui Detail Akun Anda changeCreds.header=Perbarui Detail Akun Anda
@@ -145,6 +162,7 @@ adminUserSettings.header=Pengaturan Kontrol Admin
adminUserSettings.admin=Admin adminUserSettings.admin=Admin
adminUserSettings.user=Pengguna adminUserSettings.user=Pengguna
adminUserSettings.addUser=Tambahkan Pengguna Baru adminUserSettings.addUser=Tambahkan Pengguna Baru
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
adminUserSettings.roles=Peran adminUserSettings.roles=Peran
adminUserSettings.role=Peran adminUserSettings.role=Peran
adminUserSettings.actions=Tindakan adminUserSettings.actions=Tindakan
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Konversi ke Halaman Tunggal
pageExtracter.title=Ekstrak Halaman pageExtracter.title=Ekstrak Halaman
pageExtracter.header=Ekstrak Halaman pageExtracter.header=Ekstrak Halaman
pageExtracter.submit=Ekstrak pageExtracter.submit=Ekstrak
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -753,11 +772,23 @@ merge.submit=Gabungkan
pdfOrganiser.title=Pengaturan Halaman pdfOrganiser.title=Pengaturan Halaman
pdfOrganiser.header=Pengaturan Halaman PDF pdfOrganiser.header=Pengaturan Halaman PDF
pdfOrganiser.submit=Susun ulang halaman pdfOrganiser.submit=Susun ulang halaman
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)
#multiTool #multiTool
multiTool.title=Alat Multi PDF multiTool.title=Alat Multi PDF
multiTool.header=Alat Multi PDF multiTool.header=Alat Multi PDF
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=Lihat PDF viewPdf.title=Lihat PDF
@@ -768,6 +799,7 @@ pageRemover.title=Penghapus Halaman
pageRemover.header=Penghapus Halaman PDF pageRemover.header=Penghapus Halaman PDF
pageRemover.pagesToDelete=Halaman yang akan dihapus (Masukkan daftar nomor halaman yang dipisahkan dengan koma) : pageRemover.pagesToDelete=Halaman yang akan dihapus (Masukkan daftar nomor halaman yang dipisahkan dengan koma) :
pageRemover.submit=Hapus Halaman pageRemover.submit=Hapus Halaman
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=Pilih sudut rotasi (dalam kelipatan 90 derajat):
rotate.submit=Rotasi rotate.submit=Rotasi
#merge #split-pdfs
split.title=Membagi PDF split.title=Membagi PDF
split.header=Membagi PDF split.header=Membagi PDF
split.desc.1=Angka yang Anda pilih adalah nomor halaman yang ingin Anda pisahkan split.desc.1=Angka yang Anda pilih adalah nomor halaman yang ingin Anda pisahkan
split.desc.2=Dengan demikian, memilih 1,3,7-8 akan membagi dokumen 10 halaman menjadi 6 PDF terpisah: split.desc.2=Dengan demikian, memilih 1,3,7-9 akan membagi dokumen 10 halaman menjadi 6 PDF terpisah:
split.desc.3=Dokumen #1: Halaman 1 split.desc.3=Dokumen #1: Halaman 1
split.desc.4=Dokumen #2: Halaman 2 dan 3 split.desc.4=Dokumen #2: Halaman 2 dan 3
split.desc.5=Dokumen #3: Halaman 4, 5 dan 6 split.desc.5=Dokumen #3: Halaman 4, 5, 6 dan 7
split.desc.6=Dokumen #4: Halaman 7 split.desc.6=Dokumen #4: Halaman 8
split.desc.7=Dokumen #5: Halaman 8 split.desc.7=Dokumen #5: Halaman 9
split.desc.8=Dokumen #6: Halaman 9 dan 10 split.desc.8=Dokumen #6: Halaman 10
split.splitPages=Masukkan halaman yang akan dipisah: split.splitPages=Masukkan halaman yang akan dipisah:
split.submit=Pisahkan split.submit=Pisahkan
@@ -855,6 +887,8 @@ watermark.selectText.7=Opacity (0% - 100%):
watermark.selectText.8=Tipe Watermark: watermark.selectText.8=Tipe Watermark:
watermark.selectText.9=Gambar Watermark: watermark.selectText.9=Gambar Watermark:
watermark.submit=Tambahkan Watermark watermark.submit=Tambahkan Watermark
watermark.type.1=Text
watermark.type.2=Image
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDF Ke PDF/A
pdfToPDFA.header=PDF ke PDF/A pdfToPDFA.header=PDF ke PDF/A
pdfToPDFA.credit=Layanan ini menggunakan OCRmyPDF untuk konversi PDF/A. pdfToPDFA.credit=Layanan ini menggunakan OCRmyPDF untuk konversi PDF/A.
pdfToPDFA.submit=Konversi pdfToPDFA.submit=Konversi
pdfToPDFA.tip=Currently does not work for multiple inputs at once
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=Konversi
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF Ke HTML PDFToHTML.title=PDF Ke HTML
PDFToHTML.header=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 PDFToHTML.submit=Konversi
@@ -989,6 +1024,15 @@ split-by-sections.vertical.placeholder=Input angka untuk pembagian vertikal
split-by-sections.submit=Pisahkan PDF split-by-sections.submit=Pisahkan PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses
@@ -998,3 +1042,16 @@ licenses.version=Version
licenses.license=License 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

View File

@@ -17,10 +17,11 @@ true=Vero
false=Falso false=Falso
unknown=Sconosciuto unknown=Sconosciuto
save=Salva save=Salva
saveToBrowser=Salva nel browser
close=Chiudi close=Chiudi
filesSelected=file selezionati filesSelected=file selezionati
noFavourites=Nessun preferito noFavourites=Nessun preferito
downloadComplete=Download Complete downloadComplete=Download completo
bored=Stanco di aspettare? bored=Stanco di aspettare?
alphabet=Alfabeto alphabet=Alfabeto
downloadPdf=Scarica PDF downloadPdf=Scarica PDF
@@ -53,18 +54,32 @@ notAuthenticatedMessage=Utente non autenticato.
userNotFoundMessage=Utente non trovato. userNotFoundMessage=Utente non trovato.
incorrectPasswordMessage=La password attuale non è corretta. incorrectPasswordMessage=La password attuale non è corretta.
usernameExistsMessage=Il nuovo nome utente esiste già. 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. deleteCurrentUserMessage=Impossibile eliminare l'utente attualmente connesso.
deleteUsernameExistsMessage=Il nome utente non esiste e non può essere eliminato. 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
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Menù pipeline (Beta)
pipeline.uploadButton=Caricamento personalizzato pipeline.uploadButton=Caricamento personalizzato
pipeline.configureButton=Configura pipeline.configureButton=Configura
pipeline.defaultOption=Personalizzato pipeline.defaultOption=Personalizzato
pipeline.submitButton=Invia pipeline.submitButton=Invia
pipeline.help=Aiuto sulla pipeline
pipeline.scanHelp=Aiuto per la scansione delle cartelle
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,6 +112,7 @@ navbar.settings=Impostazioni
############# #############
settings.title=Impostazioni settings.title=Impostazioni
settings.update=Aggiornamento disponibile settings.update=Aggiornamento disponibile
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Versione App: settings.appVersion=Versione App:
settings.downloadOption.title=Scegli opzione di download (Per file singoli non compressi): settings.downloadOption.title=Scegli opzione di download (Per file singoli non compressi):
settings.downloadOption.1=Apri in questa finestra settings.downloadOption.1=Apri in questa finestra
@@ -105,8 +121,9 @@ settings.downloadOption.3=Scarica file
settings.zipThreshold=Comprimi file in .zip quando il numero di download supera settings.zipThreshold=Comprimi file in .zip quando il numero di download supera
settings.signOut=Logout settings.signOut=Logout
settings.accountSettings=Impostazioni Account settings.accountSettings=Impostazioni Account
settings.bored.help=Abilita easter egg game
settings.cacheInputs.name=Salva gli input del modulo
settings.cacheInputs.help=Abilitare per memorizzare gli input utilizzati in precedenza per esecuzioni future
changeCreds.title=Cambia credenziali changeCreds.title=Cambia credenziali
changeCreds.header=Aggiorna i dettagli del tuo account changeCreds.header=Aggiorna i dettagli del tuo account
@@ -114,7 +131,7 @@ changeCreds.changePassword=Stai utilizzando le credenziali di accesso predefinit
changeCreds.newUsername=Nuovo nome utente changeCreds.newUsername=Nuovo nome utente
changeCreds.oldPassword=Password attuale changeCreds.oldPassword=Password attuale
changeCreds.newPassword=Nuova Password changeCreds.newPassword=Nuova Password
changeCreds.confirmNewPassword=Conferma Nuova Password changeCreds.confirmNewPassword=Conferma nuova Password
changeCreds.submit=Invia modifiche changeCreds.submit=Invia modifiche
@@ -145,14 +162,15 @@ adminUserSettings.header=Impostazioni di controllo utente amministratore
adminUserSettings.admin=Amministratore adminUserSettings.admin=Amministratore
adminUserSettings.user=Utente adminUserSettings.user=Utente
adminUserSettings.addUser=Aggiungi un nuovo Utente adminUserSettings.addUser=Aggiungi un nuovo Utente
adminUserSettings.usernameInfo=Il nome utente deve contenere solo lettere e numeri, senza spazi o caratteri speciali.
adminUserSettings.roles=Ruoli adminUserSettings.roles=Ruoli
adminUserSettings.role=Ruolo adminUserSettings.role=Ruolo
adminUserSettings.actions=Azioni adminUserSettings.actions=Azioni
adminUserSettings.apiUser=Utente API limitato adminUserSettings.apiUser=Utente API limitato
adminUserSettings.extraApiUser=Additional Limited API User adminUserSettings.extraApiUser=API utente limitato aggiuntivo
adminUserSettings.webOnlyUser=Utente solo Web adminUserSettings.webOnlyUser=Utente solo Web
adminUserSettings.demoUser=Utente demo (nessuna impostazione personalizzata) adminUserSettings.demoUser=Utente demo (nessuna impostazione personalizzata)
adminUserSettings.internalApiUser=Internal API User adminUserSettings.internalApiUser=API utente interna
adminUserSettings.forceChange=Forza l'utente a cambiare nome username/password all'accesso adminUserSettings.forceChange=Forza l'utente a cambiare nome username/password all'accesso
adminUserSettings.submit=Salva utente adminUserSettings.submit=Salva utente
@@ -173,7 +191,7 @@ multiTool.tags=Strumento multiplo,operazione multipla,interfaccia utente,trascin
home.merge.title=Unisci home.merge.title=Unisci
home.merge.desc=Unisci facilmente più PDF in uno. home.merge.desc=Unisci facilmente più PDF in uno.
merge.tags=unione, operazioni sulla pagina, back end, lato server merge.tags=unione,operazioni sulla pagina,back-end,lato server
home.split.title=Dividi home.split.title=Dividi
home.split.desc=Dividi un singolo PDF in più documenti. home.split.desc=Dividi un singolo PDF in più documenti.
@@ -242,7 +260,7 @@ ocr.tags=riconoscimento,testo,immagine,scansione,lettura,identificazione,rilevam
home.extractImages.title=Estrai immagini home.extractImages.title=Estrai immagini
home.extractImages.desc=Estrai tutte le immagini da un PDF e salvale come zip. 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.title=Converti in PDF/A
home.pdfToPDFA.desc=Converti un PDF nel formato PDF/A per archiviazione a lungo termine. home.pdfToPDFA.desc=Converti un PDF nel formato PDF/A per archiviazione a lungo termine.
@@ -390,11 +408,11 @@ overlay-pdfs.tags=Svrapponi
home.split-by-sections.title=Dividi PDF per sezioni 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 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.title=Aggiungi timbro al PDF
home.AddStampRequest.desc=Aggiungi testo o aggiungi timbri immagine nelle posizioni prestabilite 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 home.PDFToBook.title=PDF in libro
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Converti in pagina singola
pageExtracter.title=Estrai pagine pageExtracter.title=Estrai pagine
pageExtracter.header=Estrai pagine pageExtracter.header=Estrai pagine
pageExtracter.submit=Estrai pageExtracter.submit=Estrai
pageExtracter.placeholder=(es. 1,2,8 o 4,7,12-16 o 2n-1)
#getPdfInfo #getPdfInfo
@@ -753,11 +772,23 @@ merge.submit=Unisci
pdfOrganiser.title=Organizza pagine pdfOrganiser.title=Organizza pagine
pdfOrganiser.header=Organizza le pagine di un PDF pdfOrganiser.header=Organizza le pagine di un PDF
pdfOrganiser.submit=Riordina pagine pdfOrganiser.submit=Riordina pagine
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
multiTool.title=Multifunzione PDF multiTool.title=Multifunzione PDF
multiTool.header=Multifunzione PDF multiTool.header=Multifunzione PDF
multiTool.uploadPrompts=Caricare il PDF
#view pdf #view pdf
viewPdf.title=Visualizza PDF viewPdf.title=Visualizza PDF
@@ -768,6 +799,7 @@ pageRemover.title=Rimuovi pagine
pageRemover.header=Rimuovi pagine da un PDF pageRemover.header=Rimuovi pagine da un PDF
pageRemover.pagesToDelete=Pagine da eliminare (inserisci una lista di numeri separati da virgola): pageRemover.pagesToDelete=Pagine da eliminare (inserisci una lista di numeri separati da virgola):
pageRemover.submit=Rimuovi pagine pageRemover.submit=Rimuovi pagine
pageRemover.placeholder=(es. 1,2,6 o 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=Scegli angolo di rotazione (in multipli di 90 gradi):
rotate.submit=Ruota rotate.submit=Ruota
#merge #split-pdfs
split.title=Dividi PDF split.title=Dividi PDF
split.header=Dividi PDF split.header=Dividi PDF
split.desc.1=I numeri che scegli sono le pagine a cui desideri dividere il documento split.desc.1=I numeri che scegli sono le pagine a cui desideri dividere il documento
split.desc.2=Per esempio inserendo 1,3,7-8 separeresti un documento di 10 pagine in 6 diversi PDF con: split.desc.2=Per esempio inserendo 1,3,7-9 separeresti un documento di 10 pagine in 6 diversi PDF con:
split.desc.3=Documento #1: Pagina 1 split.desc.3=Documento #1: Pagina 1
split.desc.4=Documento #2: Pagine 2 e 3 split.desc.4=Documento #2: Pagine 2 e 3
split.desc.5=Documento #3: Pagine 4, 5 e 6 split.desc.5=Documento #3: Pagine 4, 5, 6 e 7
split.desc.6=Documento #4: Pagina 7 split.desc.6=Documento #4: Pagina 8
split.desc.7=Documento #5: Pagina 8 split.desc.7=Documento #5: Pagina 9
split.desc.8=Documento #6: Pagine 9 e 10 split.desc.8=Documento #6: Pagine 10
split.splitPages=Inserisci pagine a cui dividere: split.splitPages=Inserisci pagine a cui dividere:
split.submit=Dividi split.submit=Dividi
@@ -855,6 +887,8 @@ watermark.selectText.7=Opacità (0% - 100%):
watermark.selectText.8=Tipo di filigrana: watermark.selectText.8=Tipo di filigrana:
watermark.selectText.9=Immagine filigrana: watermark.selectText.9=Immagine filigrana:
watermark.submit=Aggiungi Filigrana watermark.submit=Aggiungi Filigrana
watermark.type.1=Testo
watermark.type.2=Immagine
#Change permissions #Change permissions
@@ -898,7 +932,7 @@ changeMetadata.subject=Oggetto:
changeMetadata.trapped=Recuperato: changeMetadata.trapped=Recuperato:
changeMetadata.selectText.4=Altre proprietà: changeMetadata.selectText.4=Altre proprietà:
changeMetadata.selectText.5=Aggiungi proprietà personalizzata: changeMetadata.selectText.5=Aggiungi proprietà personalizzata:
changeMetadata.submit=Cambia Proprietà changeMetadata.submit=Cambia proprietà
#pdfToPDFA #pdfToPDFA
@@ -906,6 +940,7 @@ pdfToPDFA.title=Da PDF a PDF/A
pdfToPDFA.header=Da PDF a PDF/A pdfToPDFA.header=Da PDF a PDF/A
pdfToPDFA.credit=Questo servizio utilizza OCRmyPDF per la conversione in PDF/A. pdfToPDFA.credit=Questo servizio utilizza OCRmyPDF per la conversione in PDF/A.
pdfToPDFA.submit=Converti pdfToPDFA.submit=Converti
pdfToPDFA.tip=Attualmente non funziona per più input contemporaneamente
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=Converti
#PDFToHTML #PDFToHTML
PDFToHTML.title=Da PDF a HTML PDFToHTML.title=Da PDF a HTML
PDFToHTML.header=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 PDFToHTML.submit=Converti
@@ -989,6 +1024,15 @@ split-by-sections.vertical.placeholder=Inserire il numero di divisioni verticali
split-by-sections.submit=Dividi PDF split-by-sections.submit=Dividi PDF
split-by-sections.merge=Unisci in un unico PDF split-by-sections.merge=Unisci in un unico PDF
#printFile
printFile.title=Stampa file
printFile.header=Stampa file su stampante
printFile.selectText.1=Seleziona file da stampare
printFile.selectText.2=Inserire il nome della stampante
printFile.submit=Stampare
#licenses #licenses
licenses.nav=Licenze licenses.nav=Licenze
licenses.title=Licenze di terze parti licenses.title=Licenze di terze parti
@@ -998,3 +1042,16 @@ licenses.version=Versione
licenses.license=Licenza 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

View File

@@ -11,18 +11,19 @@ imgPrompt=画像を選択
genericSubmit=送信 genericSubmit=送信
processTimeWarning=警告:この処理はファイルサイズによって1分程度かかることがあります processTimeWarning=警告:この処理はファイルサイズによって1分程度かかることがあります
pageOrderPrompt=ページ順序 (ページ番号をカンマ区切り又は2n+1のような関数で入力): pageOrderPrompt=ページ順序 (ページ番号をカンマ区切り又は2n+1のような関数で入力):
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : pageSelectionPrompt=カスタムページ選択(ページ番号1、5、6または2n + 1などの関数のコンマ区切りリストを入力します):
goToPage=移動 goToPage=移動
true=True true=
false=False false=
unknown=不明 unknown=不明
save=保存 save=保存
saveToBrowser=ブラウザへ保存
close=閉じる close=閉じる
filesSelected=選択されたファイル filesSelected=選択されたファイル
noFavourites=お気に入りはありません noFavourites=お気に入りはありません
downloadComplete=Download Complete downloadComplete=ダウンロード完了
bored=待ち時間が退屈 bored=待ち時間が退屈
alphabet=\u30A2\u30EB\u30D5\u30A1\u30D9\u30C3\u30C8 alphabet=アルファベット
downloadPdf=PDFをダウンロード downloadPdf=PDFをダウンロード
text=テキスト text=テキスト
font=フォント font=フォント
@@ -44,27 +45,41 @@ red=赤
green= green=
blue= blue=
custom=カスタム... custom=カスタム...
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems! WorkInProgess=作業中です。動作しないまたはバグがある可能性があります。問題があれば報告してください!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=はい
no=No no=いいえ
changedCredsMessage=資格情報が変更されました! changedCredsMessage=資格情報が変更されました!
notAuthenticatedMessage=ユーザーが認証されていません。 notAuthenticatedMessage=ユーザーが認証されていません。
userNotFoundMessage=ユーザーが見つかりません。 userNotFoundMessage=ユーザーが見つかりません。
incorrectPasswordMessage=現在のパスワードが正しくありません。 incorrectPasswordMessage=現在のパスワードが正しくありません。
usernameExistsMessage=新しいユーザー名はすでに存在します。 usernameExistsMessage=新しいユーザー名はすでに存在します。
deleteCurrentUserMessage=Cannot delete currently logged in user. invalidUsernameMessage=ユーザー名が無効です。ユーザー名にはアルファベットと数字のみを使用してください。
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. deleteCurrentUserMessage=現在ログインしているユーザーは削除できません。
deleteUsernameExistsMessage=そのユーザー名は存在しないため削除できません。
error=エラー
oops=おっと!
help=ヘルプ
goHomepage=ホームページへ移動
joinDiscord=Discordサーバーに参加する
seeDockerHub=Docker Hubを見る
visitGithub=Githubリポジトリを訪問する
donate=寄付する
color=
sponsor=スポンサー
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=パイプラインメニュー (Alpha) pipeline.header=パイプラインメニュー (Alpha)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=カスタムのアップロード
pipeline.configureButton=設定 pipeline.configureButton=設定
pipeline.defaultOption=カスタム pipeline.defaultOption=カスタム
pipeline.submitButton=送信 pipeline.submitButton=送信
pipeline.help=パイプラインのヘルプ
pipeline.scanHelp=フォルダ スキャンのヘルプ
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -73,7 +88,7 @@ pipelineOptions.header=パイプライン設定
pipelineOptions.pipelineNameLabel=パイプライン名 pipelineOptions.pipelineNameLabel=パイプライン名
pipelineOptions.saveSettings=動作設定の保存 pipelineOptions.saveSettings=動作設定の保存
pipelineOptions.pipelineNamePrompt=ここにパイプライン名を入力 pipelineOptions.pipelineNamePrompt=ここにパイプライン名を入力
pipelineOptions.selectOperation=Select Operation pipelineOptions.selectOperation=動作の選択
pipelineOptions.addOperationButton=動作の追加 pipelineOptions.addOperationButton=動作の追加
pipelineOptions.pipelineHeader=パイプライン: pipelineOptions.pipelineHeader=パイプライン:
pipelineOptions.saveButton=ダウンロード pipelineOptions.saveButton=ダウンロード
@@ -97,6 +112,7 @@ navbar.settings=設定
############# #############
settings.title=設定 settings.title=設定
settings.update=利用可能なアップデート settings.update=利用可能なアップデート
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Appバージョン: settings.appVersion=Appバージョン:
settings.downloadOption.title=ダウンロードオプション (zip以外の単一ファイル): settings.downloadOption.title=ダウンロードオプション (zip以外の単一ファイル):
settings.downloadOption.1=同じウィンドウで開く settings.downloadOption.1=同じウィンドウで開く
@@ -105,12 +121,13 @@ settings.downloadOption.3=ファイルをダウンロード
settings.zipThreshold=このファイル数を超えたときにファイルを圧縮する settings.zipThreshold=このファイル数を超えたときにファイルを圧縮する
settings.signOut=サインアウト settings.signOut=サインアウト
settings.accountSettings=アカウント設定 settings.accountSettings=アカウント設定
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=資格情報の変更 changeCreds.title=資格情報の変更
changeCreds.header=アカウントの詳細を更新する changeCreds.header=アカウントの詳細を更新する
changeCreds.changePassword=You are using default login credentials. Please enter a new password changeCreds.changePassword=デフォルトのログイン認証情報を使用しています。新しいパスワードを入力してください
changeCreds.newUsername=新しいユーザー名 changeCreds.newUsername=新しいユーザー名
changeCreds.oldPassword=現在のパスワード changeCreds.oldPassword=現在のパスワード
changeCreds.newPassword=新しいパスワード changeCreds.newPassword=新しいパスワード
@@ -145,14 +162,15 @@ adminUserSettings.header=管理者ユーザー制御設定
adminUserSettings.admin=管理者 adminUserSettings.admin=管理者
adminUserSettings.user=ユーザー adminUserSettings.user=ユーザー
adminUserSettings.addUser=新しいユーザを追加 adminUserSettings.addUser=新しいユーザを追加
adminUserSettings.usernameInfo=ユーザー名には文字と数字のみが使用でき、スペースや特殊文字は使用できません。
adminUserSettings.roles=役割 adminUserSettings.roles=役割
adminUserSettings.role=役割 adminUserSettings.role=役割
adminUserSettings.actions=アクション adminUserSettings.actions=アクション
adminUserSettings.apiUser=限定されたAPIユーザー adminUserSettings.apiUser=限定されたAPIユーザー
adminUserSettings.extraApiUser=Additional Limited API User adminUserSettings.extraApiUser=追加の制限付きAPIユーザー
adminUserSettings.webOnlyUser=ウェブ専用ユーザー adminUserSettings.webOnlyUser=ウェブ専用ユーザー
adminUserSettings.demoUser=Demo User (No custom settings) adminUserSettings.demoUser=デモユーザー (カスタム設定なし)
adminUserSettings.internalApiUser=Internal API User adminUserSettings.internalApiUser=内部APIユーザー
adminUserSettings.forceChange=ログイン時にユーザー名/パスワードを強制的に変更する adminUserSettings.forceChange=ログイン時にユーザー名/パスワードを強制的に変更する
adminUserSettings.submit=ユーザーの保存 adminUserSettings.submit=ユーザーの保存
@@ -163,7 +181,7 @@ home.desc=PDFのあらゆるニーズに対応するローカルホスティン
home.searchBar=機能検索... home.searchBar=機能検索...
home.viewPdf.title=View PDF home.viewPdf.title=PDFを表示
home.viewPdf.desc=表示、注釈、テキストや画像の追加 home.viewPdf.desc=表示、注釈、テキストや画像の追加
viewPdf.tags=view,read,annotate,text,image viewPdf.tags=view,read,annotate,text,image
@@ -392,17 +410,17 @@ home.split-by-sections.title=PDFをセクションで分割
home.split-by-sections.desc=PDFの各ページを縦横に分割します。 home.split-by-sections.desc=PDFの各ページを縦横に分割します。
split-by-sections.tags=Section Split, Divide, Customize split-by-sections.tags=Section Split, Divide, Customize
home.AddStampRequest.title=Add Stamp to PDF home.AddStampRequest.title=PDFにスタンプを追加
home.AddStampRequest.desc=Add text or add image stamps at set locations home.AddStampRequest.desc=設定した位置にテキストや画像のスタンプを追加できます
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
home.PDFToBook.title=PDF to Book home.PDFToBook.title=PDFを書籍に変換
home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre home.PDFToBook.desc=calibreを使用してPDFを書籍/コミック形式に変換します
PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
home.BookToPDF.title=Book to PDF home.BookToPDF.title=PDFを書籍に変換
home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre home.BookToPDF.desc=calibreを使用してPDFを書籍/コミック形式に変換します
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=単一ページに変換
pageExtracter.title=ページの抽出 pageExtracter.title=ページの抽出
pageExtracter.header=ページの抽出 pageExtracter.header=ページの抽出
pageExtracter.submit=抽出 pageExtracter.submit=抽出
pageExtracter.placeholder=(例:1,2,8、4,7,12-16、2n-1)
#getPdfInfo #getPdfInfo
@@ -482,37 +501,37 @@ HTMLToPDF.header=HTMLをPDFに変換
HTMLToPDF.help=HTMLファイルと必要なhtml/css/画像などを含むZIPを受け入れます HTMLToPDF.help=HTMLファイルと必要なhtml/css/画像などを含むZIPを受け入れます
HTMLToPDF.submit=変換 HTMLToPDF.submit=変換
HTMLToPDF.credit=WeasyPrintを使用 HTMLToPDF.credit=WeasyPrintを使用
HTMLToPDF.zoom=Zoom level for displaying the website. HTMLToPDF.zoom=Webサイトを表示するためのズームレベル。
HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) HTMLToPDF.pageWidth=ページ幅 (cm)。 (デフォルトでは空白)
HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) HTMLToPDF.pageHeight=ページ高さ (cm)。 (デフォルトでは空白)
HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) HTMLToPDF.marginTop=ページ上の余白 (mm)。 (デフォルトでは空白)
HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) HTMLToPDF.marginBottom=ページ下の余白 (mm)。 (デフォルトでは空白)
HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) HTMLToPDF.marginLeft=ページ左の余白 (mm)。 (デフォルトでは空白)
HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) HTMLToPDF.marginRight=ページ右の余白 (mm)。 (デフォルトでは空白)
HTMLToPDF.printBackground=Render the background of websites. HTMLToPDF.printBackground=Webサイトの背景をレンダリングします。
HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) HTMLToPDF.defaultHeader=デフォルトのヘッダー (名前とページ番号) を有効にする
HTMLToPDF.cssMediaType=Change the CSS media type of the page. HTMLToPDF.cssMediaType=ページのCSSメディアタイプを変更します。
HTMLToPDF.none=None HTMLToPDF.none=なし
HTMLToPDF.print=Print HTMLToPDF.print=印刷
HTMLToPDF.screen=Screen HTMLToPDF.screen=画面
#AddStampRequest #AddStampRequest
AddStampRequest.header=Stamp PDF AddStampRequest.header=PDFにスタンプを押す
AddStampRequest.title=Stamp PDF AddStampRequest.title=PDFにスタンプを押す
AddStampRequest.stampType=Stamp Type AddStampRequest.stampType=スタンプの種類
AddStampRequest.stampText=Stamp Text AddStampRequest.stampText=スタンプする文章
AddStampRequest.stampImage=Stamp Image AddStampRequest.stampImage=スタンプする画像
AddStampRequest.alphabet=Alphabet AddStampRequest.alphabet=文字
AddStampRequest.fontSize=Font/Image Size AddStampRequest.fontSize=フォント/画像 サイズ
AddStampRequest.rotation=Rotation AddStampRequest.rotation=回転
AddStampRequest.opacity=Opacity AddStampRequest.opacity=不透明度
AddStampRequest.position=Position AddStampRequest.position=位置
AddStampRequest.overrideX=Override X Coordinate AddStampRequest.overrideX=X座標のオーバーライド
AddStampRequest.overrideY=Override Y Coordinate AddStampRequest.overrideY=Y座標のオーバーライド
AddStampRequest.customMargin=Custom Margin AddStampRequest.customMargin=余白のカスタム
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=文字色のカスタム
AddStampRequest.submit=Submit AddStampRequest.submit=送信
#sanitizePDF #sanitizePDF
@@ -537,7 +556,7 @@ addPageNumbers.selectText.5=番号をつけるページ
addPageNumbers.selectText.6=カスタムテキスト addPageNumbers.selectText.6=カスタムテキスト
addPageNumbers.customTextDesc=カスタムテキスト addPageNumbers.customTextDesc=カスタムテキスト
addPageNumbers.numberPagesDesc=番号をつけるページ、デフォルトは'all'、 1-5 や 2,5,9 など addPageNumbers.numberPagesDesc=番号をつけるページ、デフォルトは'all'、 1-5 や 2,5,9 など
addPageNumbers.customNumberDesc=デフォルトは{n}、'{n} {total} ページ'、'テキスト-{n}'、'{filename}-{n}など addPageNumbers.customNumberDesc=デフォルトは{n}、'{n} {total} ページ'、'テキスト-{n}'、'{filename}-{n}など'
addPageNumbers.submit=ページ番号の追加 addPageNumbers.submit=ページ番号の追加
@@ -585,7 +604,7 @@ pipeline.title=パイプライン
pageLayout.title=マルチページレイアウト pageLayout.title=マルチページレイアウト
pageLayout.header=マルチページレイアウト pageLayout.header=マルチページレイアウト
pageLayout.pagesPerSheet=1枚あたりのページ数: pageLayout.pagesPerSheet=1枚あたりのページ数:
pageLayout.addBorder=Add Borders pageLayout.addBorder=境界線を追加
pageLayout.submit=送信 pageLayout.submit=送信
@@ -601,11 +620,11 @@ scalePages.submit=送信
certSign.title=証明書による署名 certSign.title=証明書による署名
certSign.header=証明書を使用してPDFに署名します。 (制作中) certSign.header=証明書を使用してPDFに署名します。 (制作中)
certSign.selectPDF=署名するPDFファイルを選択: certSign.selectPDF=署名するPDFファイルを選択:
certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. certSign.jksNote=注: 証明書のタイプが以下にリストされていない場合は、keytoolコマンドラインツールを使用して証明書をJavaキーストア(.jks)ファイルに変換してください。次に以下の.jksファイル オプションを選択します。
certSign.selectKey=秘密キーファイルを選択 (PKCS#8形式、.pemまたは.der) : certSign.selectKey=秘密キーファイルを選択 (PKCS#8形式、.pemまたは.der) :
certSign.selectCert=証明書ファイルを選択 (X.509形式、.pemまたは.der) : certSign.selectCert=証明書ファイルを選択 (X.509形式、.pemまたは.der) :
certSign.selectP12=PKCS#12キーストアファイルを選択 (.p12または.pfx) (オプション。指定する場合は秘密キーと証明書が含まれている必要があります。): certSign.selectP12=PKCS#12キーストアファイルを選択 (.p12または.pfx) (オプション。指定する場合は秘密キーと証明書が含まれている必要があります。):
certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): certSign.selectJKS=Javaキーストアファイルを選択 (.jks or .keystore):
certSign.certType=証明書の種類 certSign.certType=証明書の種類
certSign.password=キーストアまたは秘密キーのパスワードを入力 (ある場合) : certSign.password=キーストアまたは秘密キーのパスワードを入力 (ある場合) :
certSign.showSig=署名を表示 certSign.showSig=署名を表示
@@ -628,7 +647,7 @@ removeBlanks.submit=空白ページの削除
#removeAnnotations #removeAnnotations
removeAnnotations.title=注釈の削除 removeAnnotations.title=注釈の削除
removeAnnotations.header=注釈の削除 removeAnnotations.header=注釈の削除
removeAnnotations.submit=Remove removeAnnotations.submit=削除
#compare #compare
@@ -639,17 +658,17 @@ compare.document.2=ドキュメント 2
compare.submit=比較 compare.submit=比較
#BookToPDF #BookToPDF
BookToPDF.title=Books and Comics to PDF BookToPDF.title=書籍やコミックをPDFに変換
BookToPDF.header=Book to PDF BookToPDF.header=書籍をPDFに変換
BookToPDF.credit=Uses Calibre BookToPDF.credit=calibreを使用
BookToPDF.submit=Convert BookToPDF.submit=変換
#PDFToBook #PDFToBook
PDFToBook.title=PDF to Book PDFToBook.title=書籍をPDFに変換
PDFToBook.header=PDF to Book PDFToBook.header=書籍をPDFに変換
PDFToBook.selectText.1=Format PDFToBook.selectText.1=フォーマット
PDFToBook.credit=Uses Calibre PDFToBook.credit=calibreを使用
PDFToBook.submit=Convert PDFToBook.submit=変換
#sign #sign
sign.title=署名 sign.title=署名
@@ -753,21 +772,34 @@ merge.submit=結合
pdfOrganiser.title=整理 pdfOrganiser.title=整理
pdfOrganiser.header=PDFページの整理 pdfOrganiser.header=PDFページの整理
pdfOrganiser.submit=ページの整理 pdfOrganiser.submit=ページの整理
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
multiTool.title=PDFマルチツール multiTool.title=PDFマルチツール
multiTool.header=PDFマルチツール multiTool.header=PDFマルチツール
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=PDFを表示
viewPdf.header=View PDF viewPdf.header=PDFを表示
#pageRemover #pageRemover
pageRemover.title=ページ削除 pageRemover.title=ページ削除
pageRemover.header=PDFページ削除 pageRemover.header=PDFページ削除
pageRemover.pagesToDelete=削除するページ (ページ番号のカンマ区切りリストを入力してください): pageRemover.pagesToDelete=削除するページ (ページ番号のカンマ区切りリストを入力してください):
pageRemover.submit=ページ削除 pageRemover.submit=ページ削除
pageRemover.placeholder=(例:1,2,6または1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=回転角度を選択 (90度の倍数):
rotate.submit=回転 rotate.submit=回転
#merge #split-pdfs
split.title=PDFの分割 split.title=PDFの分割
split.header=PDFの分割 split.header=PDFの分割
split.desc.1=選択する番号は分割するページ番号です。 split.desc.1=選択する番号は分割するページ番号です。
split.desc.2=したがって、1,3,7-8を選択すると、10ページのドキュメントが以下のように6つのPDFに分割されることになります。 split.desc.2=したがって、1,3,7-9を選択すると、10ページのドキュメントが以下のように6つのPDFに分割されることになります。
split.desc.3=ドキュメント #1: ページ 1 split.desc.3=ドキュメント #1: ページ 1
split.desc.4=ドキュメント #2: ページ 2, 3 split.desc.4=ドキュメント #2: ページ 2, 3
split.desc.5=ドキュメント #3: ページ 4, 5, 6 split.desc.5=ドキュメント #3: ページ 4, 5, 6, 7
split.desc.6=ドキュメント #4: ページ 7 split.desc.6=ドキュメント #4: ページ 8
split.desc.7=ドキュメント #5: ページ 8 split.desc.7=ドキュメント #5: ページ 9
split.desc.8=ドキュメント #6: ページ 9, 10 split.desc.8=ドキュメント #6: ページ 10
split.splitPages=分割するページ番号を入力: split.splitPages=分割するページ番号を入力:
split.submit=分割 split.submit=分割
@@ -852,9 +884,11 @@ watermark.selectText.4=回転 (0-360):
watermark.selectText.5=幅スペース (各透かし間の水平方向のスペース): watermark.selectText.5=幅スペース (各透かし間の水平方向のスペース):
watermark.selectText.6=高さスペース (各透かし間の垂直方向のスペース): watermark.selectText.6=高さスペース (各透かし間の垂直方向のスペース):
watermark.selectText.7=不透明度 (0% - 100%): watermark.selectText.7=不透明度 (0% - 100%):
watermark.selectText.8=Watermark Type: watermark.selectText.8=透かしの種類:
watermark.selectText.9=Watermark Image: watermark.selectText.9=透かしの画像:
watermark.submit=透かしを追加 watermark.submit=透かしを追加
watermark.type.1=テキスト
watermark.type.2=画像
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDFをPDF/Aに変換
pdfToPDFA.header=PDFをPDF/Aに変換 pdfToPDFA.header=PDFをPDF/Aに変換
pdfToPDFA.credit=本サービスはPDF/Aの変換にOCRmyPDFを使用しています。 pdfToPDFA.credit=本サービスはPDF/Aの変換にOCRmyPDFを使用しています。
pdfToPDFA.submit=変換 pdfToPDFA.submit=変換
pdfToPDFA.tip=現在、一度に複数の入力に対して機能しません
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=変換
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDFをHTMLに変換 PDFToHTML.title=PDFをHTMLに変換
PDFToHTML.header=PDFをHTMLに変換 PDFToHTML.header=PDFをHTMLに変換
PDFToHTML.credit=本サービスはファイル変換にLibreOfficeを使用しています。 PDFToHTML.credit=本サービスはファイル変換にpdftohtmlを使用しています。
PDFToHTML.submit=変換 PDFToHTML.submit=変換
@@ -989,6 +1024,15 @@ split-by-sections.vertical.placeholder=垂直方向の分割数を選択
split-by-sections.submit=分割 split-by-sections.submit=分割
split-by-sections.merge=1 つの PDF に結合するかどうか split-by-sections.merge=1 つの PDF に結合するかどうか
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=ライセンス licenses.nav=ライセンス
licenses.title=サードパーティライセンス licenses.title=サードパーティライセンス
@@ -998,3 +1042,16 @@ licenses.version=バージョン
licenses.license=ライセンス 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 - サポート投稿を提出

View File

@@ -11,73 +11,88 @@ imgPrompt=이미지 선택
genericSubmit=확인 genericSubmit=확인
processTimeWarning=경고: 파일 크기에 따라 1분 정도 소요될 수 있습니다 processTimeWarning=경고: 파일 크기에 따라 1분 정도 소요될 수 있습니다
pageOrderPrompt=페이지 순서(쉼표로 구분된 페이지 번호 목록 입력): 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=이동 goToPage=이동
true= true=
false=거짓 false=거짓
unknown=알 수 없음 unknown=알 수 없음
save=저장 save=저장
saveToBrowser=브라우저에 저장
close=닫기 close=닫기
filesSelected=개 파일 선택됨 filesSelected=개 파일 선택됨
noFavourites=즐겨찾기 없음 noFavourites=즐겨찾기 없음
downloadComplete=Download Complete downloadComplete=다운로드 완료
bored=기다리는 게 지루하신가요? bored=기다리는 게 지루하신가요?
alphabet=\uC54C\uD30C\uBCB3 alphabet=알파벳
downloadPdf=PDF 다운로드 downloadPdf=PDF 다운로드
text=텍스트 text=텍스트
font=폰트 font=폰트
selectFillter=-- 선택 -- selectFillter=-- 선택 --
pageNum=페이지 번호 pageNum=페이지 번호
sizes.small=Small sizes.small=작은 크기
sizes.medium=Medium sizes.medium=중간 사이즈
sizes.large=Large sizes.large=큰 사이즈
sizes.x-large=X-Large sizes.x-large=초대형 사이즈
error.pdfPassword=이 PDF는 비밀번호로 보호되어 있으며, 비밀번호를 입력하지 않았거나, 입력된 비밀번호가 올바르지 않습니다. error.pdfPassword=이 PDF는 비밀번호로 보호되어 있으며, 비밀번호를 입력하지 않았거나, 입력된 비밀번호가 올바르지 않습니다.
delete=삭제 delete=삭제
username=사용자명 username=사용자명
password=비밀번호 password=비밀번호
welcome=환영합니다. welcome=환영합니다.
property=Property property=재산
black=Black black=검정
white=White white=하얀
red=Red red=빨강
green=Green green=녹색
blue=Blue blue=파랑
custom=Custom... custom=관습...
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems! WorkInProgess=작업 진행 중, 작동하지 않거나 버그가 있을 수 있음, 문제가 있으면 보고하십시오!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=
no=No no=아니요
changedCredsMessage=계정 정보 변경 성공! changedCredsMessage=계정 정보 변경 성공!
notAuthenticatedMessage=User not authenticated. notAuthenticatedMessage=사용자가 인증되지 않았습니다.
userNotFoundMessage=사용자를 찾을 수 없습니다. userNotFoundMessage=사용자를 찾을 수 없습니다.
incorrectPasswordMessage=현재 비밀번호가 틀립니다. incorrectPasswordMessage=현재 비밀번호가 틀립니다.
usernameExistsMessage=새 사용자명이 이미 존재합니다. usernameExistsMessage=새 사용자명이 이미 존재합니다.
deleteCurrentUserMessage=Cannot delete currently logged in user. invalidUsernameMessage=사용자 이름이 잘못되었습니다. 사용자 이름에는 알파벳 문자와 숫자만 포함되어야 합니다.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. deleteCurrentUserMessage=현재 로그인한 사용자를 삭제할 수 없습니다.
deleteUsernameExistsMessage=사용자 이름이 존재하지 않으며 삭제할 수 없습니다.
error=오류
oops=어머나!
help=도움말
goHomepage=홈페이지로 이동
joinDiscord=Discord 서버에 참여하기
seeDockerHub=Docker Hub에서 확인하기
visitGithub=GitHub 저장소 방문하기
donate=기부하기
color=색상
sponsor=스폰서
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=파이프라인 메뉴 (Beta)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=사용자 지정 업로드
pipeline.configureButton=Configure pipeline.configureButton=구성
pipeline.defaultOption=Custom pipeline.defaultOption=관습
pipeline.submitButton=Submit pipeline.submitButton=전송
pipeline.help=파이프라인 도움말
pipeline.scanHelp=폴더 스캔 도움말
###################### ######################
# Pipeline Options # # Pipeline Options #
###################### ######################
pipelineOptions.header=Pipeline Configuration pipelineOptions.header=파이프라인 구성
pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.pipelineNameLabel=파이프라인 이름
pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.saveSettings=작업 설정 저장
pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.pipelineNamePrompt=여기에 파이프라인 이름을 입력합니다.
pipelineOptions.selectOperation=Select Operation pipelineOptions.selectOperation=작업 선택
pipelineOptions.addOperationButton=Add operation pipelineOptions.addOperationButton=작업 추가
pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.pipelineHeader=파이프라인:
pipelineOptions.saveButton=Download pipelineOptions.saveButton=다운로드
pipelineOptions.validateButton=Validate pipelineOptions.validateButton=확인
@@ -97,6 +112,7 @@ navbar.settings=설정
############# #############
settings.title=설정 settings.title=설정
settings.update=업데이트 가능 settings.update=업데이트 가능
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=앱 버전: settings.appVersion=앱 버전:
settings.downloadOption.title=다운로드 옵션 선택 (zip 파일이 아닌 단일 파일 다운로드 시): settings.downloadOption.title=다운로드 옵션 선택 (zip 파일이 아닌 단일 파일 다운로드 시):
settings.downloadOption.1=현재 창에서 열기 settings.downloadOption.1=현재 창에서 열기
@@ -105,12 +121,13 @@ settings.downloadOption.3=다운로드
settings.zipThreshold=다운로드한 파일 수가 초과된 경우 파일 압축하기 settings.zipThreshold=다운로드한 파일 수가 초과된 경우 파일 압축하기
settings.signOut=로그아웃 settings.signOut=로그아웃
settings.accountSettings=계정 설정 settings.accountSettings=계정 설정
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=계정 정보 변경 changeCreds.title=계정 정보 변경
changeCreds.header=계정 정보 업데이트 changeCreds.header=계정 정보 업데이트
changeCreds.changePassword=You are using default login credentials. Please enter a new password changeCreds.changePassword=기본 로그인 자격 증명을 사용하고 있습니다. 새 비밀번호를 입력해 주세요.
changeCreds.newUsername=새 사용자명 changeCreds.newUsername=새 사용자명
changeCreds.oldPassword=현재 비밀번호 changeCreds.oldPassword=현재 비밀번호
changeCreds.newPassword=새 비밀번호 changeCreds.newPassword=새 비밀번호
@@ -122,20 +139,20 @@ changeCreds.submit=변경
account.title=계정 설정 account.title=계정 설정
account.accountSettings=계정 설정 account.accountSettings=계정 설정
account.adminSettings=관리자 설정 - 사용자 추가 및 확인 account.adminSettings=관리자 설정 - 사용자 추가 및 확인
account.userControlSettings=User Control Settings account.userControlSettings=사용자 컨트롤 설정
account.changeUsername=사용자명 변경 account.changeUsername=사용자명 변경
account.newUsername=새 사용자 이름 account.newUsername=새 사용자 이름
account.password=Confirmation Password account.password=확인 비밀번호
account.oldPassword=이전 비밀번호 account.oldPassword=이전 비밀번호
account.newPassword=새 비밀번호 account.newPassword=새 비밀번호
account.changePassword=비밀번호 변경 account.changePassword=비밀번호 변경
account.confirmNewPassword=새 비밀번호 확인 account.confirmNewPassword=새 비밀번호 확인
account.signOut=로그아웃 account.signOut=로그아웃
account.yourApiKey=API 키 account.yourApiKey=API 키
account.syncTitle=Sync browser settings with Account account.syncTitle=브라우저 설정을 계정과 동기화
account.settingsCompare=Settings Comparison: account.settingsCompare=설정 비교:
account.property=Property account.property=재산
account.webBrowserSettings=Web Browser Setting account.webBrowserSettings=웹 브라우저 설정
account.syncToBrowser=계정 -> 브라우저로 동기화 account.syncToBrowser=계정 -> 브라우저로 동기화
account.syncToAccount=브라우저 -> 계정으로 동기화 account.syncToAccount=브라우저 -> 계정으로 동기화
@@ -145,14 +162,15 @@ adminUserSettings.header=사용자 관리
adminUserSettings.admin=관리자 adminUserSettings.admin=관리자
adminUserSettings.user=사용자 adminUserSettings.user=사용자
adminUserSettings.addUser=새 사용자 추가 adminUserSettings.addUser=새 사용자 추가
adminUserSettings.usernameInfo=사용자 이름은 문자와 숫자만 포함해야 하며 공백이나 특수 문자는 포함할 수 없습니다.
adminUserSettings.roles=역할 adminUserSettings.roles=역할
adminUserSettings.role=역할 adminUserSettings.role=역할
adminUserSettings.actions=동작 adminUserSettings.actions=동작
adminUserSettings.apiUser=제한된 API 사용 adminUserSettings.apiUser=제한된 API 사용
adminUserSettings.extraApiUser=Additional Limited API User adminUserSettings.extraApiUser=제한된 API 사용자 추가
adminUserSettings.webOnlyUser=웹 사용만 허용 adminUserSettings.webOnlyUser=웹 사용만 허용
adminUserSettings.demoUser=Demo User (No custom settings) adminUserSettings.demoUser=데모 사용자(사용자 지정 설정 없음)
adminUserSettings.internalApiUser=Internal API User adminUserSettings.internalApiUser=내부 API 사용자
adminUserSettings.forceChange=다음 로그인 때 사용자명과 비밀번호를 변경하도록 강제 adminUserSettings.forceChange=다음 로그인 때 사용자명과 비밀번호를 변경하도록 강제
adminUserSettings.submit=사용자 저장 adminUserSettings.submit=사용자 저장
@@ -184,11 +202,11 @@ home.rotate.desc=PDF 페이지를 회전합니다.
rotate.tags=server side rotate.tags=server side
home.imageToPdf.title=Image to PDF home.imageToPdf.title=이미지를 PDF
home.imageToPdf.desc=이미지(PNG, JPEG, GIF)를 PDF 문서로 변환합니다. home.imageToPdf.desc=이미지(PNG, JPEG, GIF)를 PDF 문서로 변환합니다.
imageToPdf.tags=conversion,img,jpg,picture,photo imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=PDF to Image home.pdfToImage.title=PDF를 이미지로
home.pdfToImage.desc=PDF 문서을 이미지(PNG, JPEG, GIF)로 변환합니다. home.pdfToImage.desc=PDF 문서을 이미지(PNG, JPEG, GIF)로 변환합니다.
pdfToImage.tags=conversion,img,jpg,picture,photo pdfToImage.tags=conversion,img,jpg,picture,photo
@@ -244,15 +262,15 @@ home.extractImages.title=이미지 추출
home.extractImages.desc=PDF에서 모든 이미지를 추출하여 zip으로 저장합니다. home.extractImages.desc=PDF에서 모든 이미지를 추출하여 zip으로 저장합니다.
extractImages.tags=picture,photo,save,archive,zip,capture,grab 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 문서로 변환합니다. home.pdfToPDFA.desc=장기 보관을 위해 PDF 문서를 PDF/A 문서로 변환합니다.
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation 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) home.PDFToWord.desc=PDF 문서를 Word 형식으로 변환합니다. (DOC, DOCX, ODT)
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile 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) home.PDFToPresentation.desc=PDF 문서를 프리젠테이션 형식으로 변환합니다. (PPT, PPTX, ODP)
PDFToPresentation.tags=slides,show,office,microsoft PDFToPresentation.tags=slides,show,office,microsoft
@@ -260,12 +278,12 @@ home.PDFToText.title=PDF to 텍스트/RTF
home.PDFToText.desc=PDF 문서를 텍스트 또는 RTF 형식으로 변환합니다. home.PDFToText.desc=PDF 문서를 텍스트 또는 RTF 형식으로 변환합니다.
PDFToText.tags=richformat,richtextformat,rich text format PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDF to HTML home.PDFToHTML.title=PDF HTML
home.PDFToHTML.desc=PDF 문서를 HTML 형식으로 변환합니다. home.PDFToHTML.desc=PDF 문서를 HTML 형식으로 변환합니다.
PDFToHTML.tags=web content,browser friendly PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=PDF to XML home.PDFToXML.title=PDF XML로 변환
home.PDFToXML.desc=PDF 문서를 XML 형식으로 변환합니다. home.PDFToXML.desc=PDF 문서를 XML 형식으로 변환합니다.
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
@@ -289,8 +307,8 @@ home.removeBlanks.title=빈 페이지 제거
home.removeBlanks.desc=PDF 문서에서 빈 페이지를 감지하고 제거합니다. home.removeBlanks.desc=PDF 문서에서 빈 페이지를 감지하고 제거합니다.
removeBlanks.tags=cleanup,streamline,non-content,organize removeBlanks.tags=cleanup,streamline,non-content,organize
home.removeAnnotations.title=Remove Annotations home.removeAnnotations.title=주석 제거
home.removeAnnotations.desc=Removes all comments/annotations from a PDF home.removeAnnotations.desc=PDF에서 모든 주석/주석을 제거합니다.
removeAnnotations.tags=comments,highlight,notes,markup,remove removeAnnotations.tags=comments,highlight,notes,markup,remove
home.compare.title=비교 home.compare.title=비교
@@ -337,16 +355,16 @@ home.sanitizePdf.title=정제
home.sanitizePdf.desc=PDF 문서에서 스크립트와 같은 요소들을 제거합니다. home.sanitizePdf.desc=PDF 문서에서 스크립트와 같은 요소들을 제거합니다.
sanitizePdf.tags=clean,secure,safe,remove-threats 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 문서로 변환합니다. home.URLToPDF.desc=http(s) 웹사이트를 PDF 문서로 변환합니다.
URLToPDF.tags=web-capture,save-page,web-to-doc,archive 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로 변환합니다. home.HTMLToPDF.desc=HTML 파일, 또는 ZIP 파일을 PDF로 변환합니다.
HTMLToPDF.tags=markup,web-content,transformation,convert HTMLToPDF.tags=markup,web-content,transformation,convert
home.MarkdownToPDF.title=Markdown to PDF home.MarkdownToPDF.title=Markdown에서 PDF
home.MarkdownToPDF.desc=마크다운 파일을 PDF 문서로 변환합니다. home.MarkdownToPDF.desc=마크다운 파일을 PDF 문서로 변환합니다.
MarkdownToPDF.tags=markup,web-content,transformation,convert MarkdownToPDF.tags=markup,web-content,transformation,convert
@@ -374,35 +392,35 @@ home.autoRedact.title=자동 검열
home.autoRedact.desc=PDF 문서에서 입력된 텍스트들을 자동으로 검열(모자이크)합니다. home.autoRedact.desc=PDF 문서에서 입력된 텍스트들을 자동으로 검열(모자이크)합니다.
autoRedact.tags=Redact,Hide,black out,black,marker,hidden autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF에서 CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=PDF에서 표를 추출하여 CSV로 변환
tableExtraxt.tags=CSV,Table Extraction,extract,convert tableExtraxt.tags=CSV,Table Extraction,extract,convert
home.autoSizeSplitPDF.title=Auto Split by Size/Count home.autoSizeSplitPDF.title=크기/개수로 자동 분할
home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count home.autoSizeSplitPDF.desc=단일 PDF를 크기, 페이지 수 또는 문서 수에 따라 여러 문서로 분할
autoSizeSplitPDF.tags=pdf,split,document,organization autoSizeSplitPDF.tags=pdf,split,document,organization
home.overlay-pdfs.title=Overlay PDFs home.overlay-pdfs.title=PDF 오버레이
home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF home.overlay-pdfs.desc=PDF를 다른 PDF 위에 오버레이
overlay-pdfs.tags=Overlay overlay-pdfs.tags=Overlay
home.split-by-sections.title=Split PDF by Sections home.split-by-sections.title=섹션별로 PDF 분할
home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections home.split-by-sections.desc=PDF의 각 페이지를 더 작은 가로와 세로 구역으로 나눕니다
split-by-sections.tags=Section Split, Divide, Customize split-by-sections.tags=Section Split, Divide, Customize
home.AddStampRequest.title=Add Stamp to PDF home.AddStampRequest.title=PDF에 스탬프 추가
home.AddStampRequest.desc=Add text or add image stamps at set locations home.AddStampRequest.desc=설정된 위치에 텍스트 추가 또는 이미지 스탬프 추가
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
home.PDFToBook.title=PDF to Book home.PDFToBook.title=PDF를 책으로
home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre home.PDFToBook.desc=구경을 사용하여 PDF를 책/만화 형식으로 변환
PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
home.BookToPDF.title=Book to PDF home.BookToPDF.title=책을 PDF
home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre home.BookToPDF.desc=구경을 사용하여 책/만화 형식을 PDF로 변환
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=단일 페이지로 통합
pageExtracter.title=페이지 추출 pageExtracter.title=페이지 추출
pageExtracter.header=페이지 추출 pageExtracter.header=페이지 추출
pageExtracter.submit=추출 pageExtracter.submit=추출
pageExtracter.placeholder=(예: 1,2,8 또는 4,7,12-16 또는 2n-1)
#getPdfInfo #getPdfInfo
@@ -461,7 +480,7 @@ getPdfInfo.downloadJson=JSON으로 다운로드
#markdown-to-pdf #markdown-to-pdf
MarkdownToPDF.title=Markdown To PDF MarkdownToPDF.title=Markdown에서 PDF
MarkdownToPDF.header=Markdown 문서를 PDF 문서로 변환 MarkdownToPDF.header=Markdown 문서를 PDF 문서로 변환
MarkdownToPDF.submit=변환 MarkdownToPDF.submit=변환
MarkdownToPDF.help=변환중 MarkdownToPDF.help=변환중
@@ -470,49 +489,49 @@ MarkdownToPDF.credit=이 기능은 WeasyPrint를 사용합니다.
#url-to-pdf #url-to-pdf
URLToPDF.title=URL To PDF URLToPDF.title=URL PDF
URLToPDF.header=URL을 PDF 문서로 변환 URLToPDF.header=URL을 PDF 문서로 변환
URLToPDF.submit=변환 URLToPDF.submit=변환
URLToPDF.credit=이 기능은 WeasyPrint를 사용합니다. URLToPDF.credit=이 기능은 WeasyPrint를 사용합니다.
#html-to-pdf #html-to-pdf
HTMLToPDF.title=HTML To PDF HTMLToPDF.title=HTML PDF
HTMLToPDF.header=HTML 파일을 PDF 문서로 변환 HTMLToPDF.header=HTML 파일을 PDF 문서로 변환
HTMLToPDF.help=HTML 파일, 또는 html/css/이미지 등을 포함한 ZIP 파일을 받습니다. HTMLToPDF.help=HTML 파일, 또는 html/css/이미지 등을 포함한 ZIP 파일을 받습니다.
HTMLToPDF.submit=변환 HTMLToPDF.submit=변환
HTMLToPDF.credit=이 기능은 WeasyPrint를 사용합니다. HTMLToPDF.credit=이 기능은 WeasyPrint를 사용합니다.
HTMLToPDF.zoom=Zoom level for displaying the website. HTMLToPDF.zoom=웹 사이트를 표시하기 위한 확대/축소 수준입니다.
HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) HTMLToPDF.pageWidth=센티미터 단위의 페이지 너비입니다. (기본값은 비어 있음)
HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) HTMLToPDF.pageHeight=페이지 높이(센티미터)입니다. (기본값은 비어 있음)
HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) HTMLToPDF.marginTop=페이지의 위쪽 여백(밀리미터)입니다. (기본값은 비어 있음)
HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) HTMLToPDF.marginBottom=페이지의 아래쪽 여백(밀리미터)입니다. (기본값은 비어 있음)
HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) HTMLToPDF.marginLeft=페이지의 왼쪽 여백(밀리미터)입니다. (기본값은 비어 있음)
HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) HTMLToPDF.marginRight=페이지의 오른쪽 여백(밀리미터)입니다. (기본값은 비어 있음)
HTMLToPDF.printBackground=Render the background of websites. HTMLToPDF.printBackground=웹 사이트의 배경을 렌더링합니다.
HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) HTMLToPDF.defaultHeader=기본 헤더 활성화(이름 및 페이지 번호)
HTMLToPDF.cssMediaType=Change the CSS media type of the page. HTMLToPDF.cssMediaType=페이지의 CSS 미디어 유형을 변경합니다.
HTMLToPDF.none=None HTMLToPDF.none=없음
HTMLToPDF.print=Print HTMLToPDF.print=인쇄하다
HTMLToPDF.screen=Screen HTMLToPDF.screen=화면
#AddStampRequest #AddStampRequest
AddStampRequest.header=Stamp PDF AddStampRequest.header=스탬프 PDF
AddStampRequest.title=Stamp PDF AddStampRequest.title=스탬프 PDF
AddStampRequest.stampType=Stamp Type AddStampRequest.stampType=스탬프 유형
AddStampRequest.stampText=Stamp Text AddStampRequest.stampText=스탬프 텍스트
AddStampRequest.stampImage=Stamp Image AddStampRequest.stampImage=스탬프 이미지
AddStampRequest.alphabet=Alphabet AddStampRequest.alphabet=알파벳
AddStampRequest.fontSize=Font/Image Size AddStampRequest.fontSize=글꼴/이미지 크기
AddStampRequest.rotation=Rotation AddStampRequest.rotation=회전
AddStampRequest.opacity=Opacity AddStampRequest.opacity=불투명도
AddStampRequest.position=Position AddStampRequest.position=위치
AddStampRequest.overrideX=Override X Coordinate AddStampRequest.overrideX=X 좌표 재정의
AddStampRequest.overrideY=Override Y Coordinate AddStampRequest.overrideY=Y 좌표 재정의
AddStampRequest.customMargin=Custom Margin AddStampRequest.customMargin=맞춤 마진
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=사용자 정의 텍스트 색상
AddStampRequest.submit=Submit AddStampRequest.submit=전송
#sanitizePDF #sanitizePDF
@@ -601,11 +620,11 @@ scalePages.submit=제출
certSign.title=인증서로 서명 certSign.title=인증서로 서명
certSign.header=인증서로 PDF 문서에 서명 (개발 중) certSign.header=인증서로 PDF 문서에 서명 (개발 중)
certSign.selectPDF=서명할 PDF 문서를 선택합니다: certSign.selectPDF=서명할 PDF 문서를 선택합니다:
certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. certSign.jksNote=참고: 인증서 유형이 아래에 나열되지 않은 경우 keytool 명령줄 도구를 사용하여 Java 키 저장소(.jks) 파일로 변환하십시오. 그런 다음 아래의 .jks 파일 옵션을 선택합니다.
certSign.selectKey=개인 키 파일을 선택합니다 (PKCS#8 형식, .pem 또는 .der): certSign.selectKey=개인 키 파일을 선택합니다 (PKCS#8 형식, .pem 또는 .der):
certSign.selectCert=인증서 파일을 선택합니다 (X.509 형식, .pem 또는 .der): certSign.selectCert=인증서 파일을 선택합니다 (X.509 형식, .pem 또는 .der):
certSign.selectP12=PKCS#12 키 저장소 파일을 선택합니다 (.p12 or .pfx) (선택 사항, 선택할 경우, 개인 키와 인증서를 포함하고 있어야 합니다): 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.certType=인증서 유형
certSign.password=키 저장소 또는 개인 키 비밀번호를 입력합니다 (있는 경우): certSign.password=키 저장소 또는 개인 키 비밀번호를 입력합니다 (있는 경우):
certSign.showSig=서명 보기 certSign.showSig=서명 보기
@@ -626,9 +645,9 @@ removeBlanks.submit=빈 페이지 제거
#removeAnnotations #removeAnnotations
removeAnnotations.title=Remove Annotations removeAnnotations.title=주석 제거
removeAnnotations.header=Remove Annotations removeAnnotations.header=주석 제거
removeAnnotations.submit=Remove removeAnnotations.submit=제거하다
#compare #compare
@@ -639,17 +658,17 @@ compare.document.2=문서 2
compare.submit=비교 compare.submit=비교
#BookToPDF #BookToPDF
BookToPDF.title=Books and Comics to PDF BookToPDF.title=책과 만화를 PDF
BookToPDF.header=Book to PDF BookToPDF.header=책을 PDF
BookToPDF.credit=Uses Calibre BookToPDF.credit=이 서비스는 파일 변환을 위해 Calibre 사용합니다.
BookToPDF.submit=Convert BookToPDF.submit=변환
#PDFToBook #PDFToBook
PDFToBook.title=PDF to Book PDFToBook.title=PDF를 책으로
PDFToBook.header=PDF to Book PDFToBook.header=PDF를 책으로
PDFToBook.selectText.1=Format PDFToBook.selectText.1=
PDFToBook.credit=Uses Calibre PDFToBook.credit=이 서비스는 파일 변환을 위해 Calibre 사용합니다.
PDFToBook.submit=Convert PDFToBook.submit=변환
#sign #sign
sign.title=서명 sign.title=서명
@@ -744,8 +763,8 @@ addImage.submit=이미지 추가
#merge #merge
merge.title=병합 merge.title=병합
merge.header=여러 개의 PDF 병합 (2개 이상) merge.header=여러 개의 PDF 병합 (2개 이상)
merge.sortByName=Sort by name merge.sortByName=이름순 정렬
merge.sortByDate=Sort by date merge.sortByDate=날짜순 정렬
merge.submit=병합 merge.submit=병합
@@ -753,11 +772,23 @@ merge.submit=병합
pdfOrganiser.title=페이지 정렬 pdfOrganiser.title=페이지 정렬
pdfOrganiser.header=PDF 페이지 정렬 pdfOrganiser.header=PDF 페이지 정렬
pdfOrganiser.submit=페이지 재정렬 pdfOrganiser.submit=페이지 재정렬
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
multiTool.title=PDF 멀티툴 multiTool.title=PDF 멀티툴
multiTool.header=PDF 멀티툴 multiTool.header=PDF 멀티툴
multiTool.uploadPrompts=PDF를 업로드하십시오
#view pdf #view pdf
viewPdf.title=PDF 뷰어 viewPdf.title=PDF 뷰어
@@ -768,6 +799,7 @@ pageRemover.title=페이지 제거
pageRemover.header=PDF 페이지 제거 pageRemover.header=PDF 페이지 제거
pageRemover.pagesToDelete=제거할 페이지 (쉼표로 구분된 페이지 번호 입력): pageRemover.pagesToDelete=제거할 페이지 (쉼표로 구분된 페이지 번호 입력):
pageRemover.submit=페이지 제거 pageRemover.submit=페이지 제거
pageRemover.placeholder=(예: 1,2,6 또는 1-10,15-30)
#rotate #rotate
@@ -777,23 +809,23 @@ rotate.selectAngle=회전 각도 선택 (90도의 배수로):
rotate.submit=회전 rotate.submit=회전
#merge #split-pdfs
split.title=PDF 분할 split.title=PDF 분할
split.header=PDF 분할 split.header=PDF 분할
split.desc.1=입력한 번호는 분할할 페이지의 번호입니다. split.desc.1=입력한 번호는 분할할 페이지의 번호입니다.
split.desc.2=예를 들어, 1,3,7-8을 입력하면 10페이지 문서를 아래와 같이 6개의 별도의 PDF 문서로 분할하게 됩니다. split.desc.2=예를 들어, 1,3,7-9을 입력하면 10페이지 문서를 아래와 같이 6개의 별도의 PDF 문서로 분할하게 됩니다.
split.desc.3=문서 #1: 페이지 1 split.desc.3=문서 #1: 페이지 1
split.desc.4=문서 #2: 페이지 2, 3 split.desc.4=문서 #2: 페이지 2, 3
split.desc.5=문서 #3: 페이지 4, 5, 6 split.desc.5=문서 #3: 페이지 4, 5, 6, 7
split.desc.6=문서 #4: 페이지 7 split.desc.6=문서 #4: 페이지 8
split.desc.7=문서 #5: 페이지 8 split.desc.7=문서 #5: 페이지 9
split.desc.8=문서 #6: 페이지 9, 10 split.desc.8=문서 #6: 페이지 10
split.splitPages=분할할 페이지 입력: split.splitPages=분할할 페이지 입력:
split.submit=분할 split.submit=분할
#merge #merge
imageToPDF.title=Image to PDF imageToPDF.title=이미지를 PDF
imageToPDF.header=이미지를 PDF로 변환 imageToPDF.header=이미지를 PDF로 변환
imageToPDF.submit=변환 imageToPDF.submit=변환
imageToPDF.selectLabel=이미지 맞춤 방법 imageToPDF.selectLabel=이미지 맞춤 방법
@@ -807,7 +839,7 @@ imageToPDF.selectText.5=별도의 PDF로 변환
#pdfToImage #pdfToImage
pdfToImage.title=PDF to Image pdfToImage.title=PDF를 이미지로
pdfToImage.header=PDF 문서를 이미지로 변환 pdfToImage.header=PDF 문서를 이미지로 변환
pdfToImage.selectText=이미지 형식 pdfToImage.selectText=이미지 형식
pdfToImage.singleOrMultiple=이미지 결과 유형 pdfToImage.singleOrMultiple=이미지 결과 유형
@@ -855,6 +887,8 @@ watermark.selectText.7=투명도 (0% - 100%):
watermark.selectText.8=워터마크 유형: watermark.selectText.8=워터마크 유형:
watermark.selectText.9=워터마크 이미지: watermark.selectText.9=워터마크 이미지:
watermark.submit=워터마크 추가 watermark.submit=워터마크 추가
watermark.type.1=텍스트
watermark.type.2=이미지
#Change permissions #Change permissions
@@ -902,14 +936,15 @@ changeMetadata.submit=변경
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF To PDF/A pdfToPDFA.title=PDF PDF/A
pdfToPDFA.header=PDF 문서를 PDF/A로 변환 pdfToPDFA.header=PDF 문서를 PDF/A로 변환
pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 OCRmyPDF 문서를 사용합니다. pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 OCRmyPDF 문서를 사용합니다.
pdfToPDFA.submit=변환 pdfToPDFA.submit=변환
pdfToPDFA.tip=현재 한 번에 여러 입력에 대해 작동하지 않습니다.
#PDFToWord #PDFToWord
PDFToWord.title=PDF to Word PDFToWord.title=PDF Word
PDFToWord.header=PDF 문서를 Word 문서로 변환 PDFToWord.header=PDF 문서를 Word 문서로 변환
PDFToWord.selectText.1=출력 파일 형식 PDFToWord.selectText.1=출력 파일 형식
PDFToWord.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. PDFToWord.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다.
@@ -917,7 +952,7 @@ PDFToWord.submit=변환
#PDFToPresentation #PDFToPresentation
PDFToPresentation.title=PDF to Presentation PDFToPresentation.title=PDF를 프리젠테이션으로
PDFToPresentation.header=PDF 문서를 프레젠테이션으로 변환 PDFToPresentation.header=PDF 문서를 프레젠테이션으로 변환
PDFToPresentation.selectText.1=출력 파일 형식 PDFToPresentation.selectText.1=출력 파일 형식
PDFToPresentation.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. PDFToPresentation.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다.
@@ -925,7 +960,7 @@ PDFToPresentation.submit=변환
#PDFToText #PDFToText
PDFToText.title=PDF to RTF PDFToText.title=PDF에서 RTF
PDFToText.header=PDF 문서를 RTF(서식 있는 텍스트 문서)로 변환 PDFToText.header=PDF 문서를 RTF(서식 있는 텍스트 문서)로 변환
PDFToText.selectText.1=출력 파일 형식 PDFToText.selectText.1=출력 파일 형식
PDFToText.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. PDFToText.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다.
@@ -933,68 +968,90 @@ PDFToText.submit=변환
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF to HTML PDFToHTML.title=PDF HTML
PDFToHTML.header=PDF 문서를 HTML로 변환 PDFToHTML.header=PDF 문서를 HTML로 변환
PDFToHTML.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. PDFToHTML.credit=이 서비스는 파일 변환을 위해 pdftohtml를 사용합니다.
PDFToHTML.submit=변환 PDFToHTML.submit=변환
#PDFToXML #PDFToXML
PDFToXML.title=PDF to XML PDFToXML.title=PDF XML로 변환
PDFToXML.header=PDF 문서를 XML로 변환 PDFToXML.header=PDF 문서를 XML로 변환
PDFToXML.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. PDFToXML.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다.
PDFToXML.submit=변환 PDFToXML.submit=변환
#PDFToCSV #PDFToCSV
PDFToCSV.title=PDF? CSV? PDFToCSV.title=PDF에서 CSV
PDFToCSV.header=PDF? CSV? PDFToCSV.header=PDF에서 CSV
PDFToCSV.prompt=Choose page to extract table PDFToCSV.prompt=테이블을 추출할 페이지 선택
PDFToCSV.submit=?? PDFToCSV.submit=추출물
#split-by-size-or-count #split-by-size-or-count
split-by-size-or-count.title=Split PDF by Size or Count split-by-size-or-count.title=크기 또는 개수로 PDF 분할
split-by-size-or-count.header=Split PDF by Size or Count split-by-size-or-count.header=크기 또는 개수로 PDF 분할
split-by-size-or-count.type.label=Select Split Type split-by-size-or-count.type.label=분할 유형 선택
split-by-size-or-count.type.size=By Size split-by-size-or-count.type.size=크기별
split-by-size-or-count.type.pageCount=By Page Count split-by-size-or-count.type.pageCount=페이지 수별
split-by-size-or-count.type.docCount=By Document Count split-by-size-or-count.type.docCount=문서 수 기준
split-by-size-or-count.value.label=Enter Value split-by-size-or-count.value.label=값 입력
split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5) split-by-size-or-count.value.placeholder=크기(예: 2MB 또는 3KB) 또는 개수(예: 5)를 입력합니다.
split-by-size-or-count.submit=Submit split-by-size-or-count.submit=전송
#overlay-pdfs #overlay-pdfs
overlay-pdfs.header=Overlay PDF Files overlay-pdfs.header=PDF 파일 오버레이
overlay-pdfs.baseFile.label=Select Base PDF File overlay-pdfs.baseFile.label=기본 PDF 파일 선택
overlay-pdfs.overlayFiles.label=Select Overlay PDF Files overlay-pdfs.overlayFiles.label=오버레이 PDF 파일 선택
overlay-pdfs.mode.label=Select Overlay Mode overlay-pdfs.mode.label=오버레이 모드 선택
overlay-pdfs.mode.sequential=Sequential Overlay overlay-pdfs.mode.sequential=순차 오버레이
overlay-pdfs.mode.interleaved=Interleaved Overlay overlay-pdfs.mode.interleaved=인터리브 오버레이
overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay overlay-pdfs.mode.fixedRepeat=고정 반복 오버레이
overlay-pdfs.counts.label=Overlay Counts (for Fixed Repeat Mode) overlay-pdfs.counts.label=오버레이 카운트(고정 반복 모드의 경우)
overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1) overlay-pdfs.counts.placeholder=쉼표로 구분된 개수를 입력합니다(예: 2,3,1).
overlay-pdfs.position.label=Select Overlay Position overlay-pdfs.position.label=오버레이 위치 선택
overlay-pdfs.position.foreground=Foreground overlay-pdfs.position.foreground=전경
overlay-pdfs.position.background=Background overlay-pdfs.position.background=배경
overlay-pdfs.submit=Submit overlay-pdfs.submit=전송
#split-by-sections #split-by-sections
split-by-sections.title=Split PDF by Sections split-by-sections.title=섹션별로 PDF 분할
split-by-sections.header=Split PDF into Sections split-by-sections.header=PDF를 섹션으로 분할
split-by-sections.horizontal.label=Horizontal Divisions split-by-sections.horizontal.label=수평 분할
split-by-sections.vertical.label=Vertical Divisions split-by-sections.vertical.label=수직 분할
split-by-sections.horizontal.placeholder=Enter number of horizontal divisions split-by-sections.horizontal.placeholder=수평 분할 수를 입력합니다
split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.vertical.placeholder=수직 분할 수를 입력합니다
split-by-sections.submit=Split PDF split-by-sections.submit=PDF 분할
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=하나의 PDF로 병합
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=라이센스
licenses.title=3rd Party Licenses licenses.title=제3자 라이선스
licenses.header=3rd Party Licenses licenses.header=제3자 라이선스
licenses.module=Module licenses.module=모듈
licenses.version=Version licenses.version=버전
licenses.license=License 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 - 문의 게시

View File

@@ -17,6 +17,7 @@ true=Waar
false=Onwaar false=Onwaar
unknown=Onbekend unknown=Onbekend
save=Opslaan save=Opslaan
saveToBrowser=Save to Browser
close=Sluiten close=Sluiten
filesSelected=Bestanden geselecteerd filesSelected=Bestanden geselecteerd
noFavourites=Geen favorieten toegevoegd noFavourites=Geen favorieten toegevoegd
@@ -53,8 +54,20 @@ notAuthenticatedMessage=Gebruiker niet ingelogd.
userNotFoundMessage=Gebruiker niet gevonden. userNotFoundMessage=Gebruiker niet gevonden.
incorrectPasswordMessage=Huidige wachtwoord is onjuist. incorrectPasswordMessage=Huidige wachtwoord is onjuist.
usernameExistsMessage=Nieuwe gebruikersnaam bestaat al. usernameExistsMessage=Nieuwe gebruikersnaam bestaat al.
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Cannot delete currently logged in user.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. 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
############### ###############
@@ -65,6 +78,8 @@ pipeline.uploadButton=Aangepast uploaden
pipeline.configureButton=Configureren pipeline.configureButton=Configureren
pipeline.defaultOption=Aangepast pipeline.defaultOption=Aangepast
pipeline.submitButton=Opslaan pipeline.submitButton=Opslaan
pipeline.help=Pipeline Help
pipeline.scanHelp=Folder Scanning Help
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,6 +112,7 @@ navbar.settings=Instellingen
############# #############
settings.title=Instellingen settings.title=Instellingen
settings.update=Update beschikbaar settings.update=Update beschikbaar
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=App versie: settings.appVersion=App versie:
settings.downloadOption.title=Kies download optie (Voor enkelvoudige bestanddownloads zonder zip): settings.downloadOption.title=Kies download optie (Voor enkelvoudige bestanddownloads zonder zip):
settings.downloadOption.1=Open in hetzelfde venster settings.downloadOption.1=Open in hetzelfde venster
@@ -105,8 +121,9 @@ settings.downloadOption.3=Download bestand
settings.zipThreshold=Bestanden zippen wanneer het aantal gedownloade bestanden meer is dan settings.zipThreshold=Bestanden zippen wanneer het aantal gedownloade bestanden meer is dan
settings.signOut=Uitloggen settings.signOut=Uitloggen
settings.accountSettings=Account instellingen settings.accountSettings=Account instellingen
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Inloggegevens wijzigen changeCreds.title=Inloggegevens wijzigen
changeCreds.header=Werk je accountgegevens bij changeCreds.header=Werk je accountgegevens bij
@@ -145,6 +162,7 @@ adminUserSettings.header=Beheer gebruikers
adminUserSettings.admin=Beheerder adminUserSettings.admin=Beheerder
adminUserSettings.user=Gebruiker adminUserSettings.user=Gebruiker
adminUserSettings.addUser=Voeg nieuwe gebruiker toe adminUserSettings.addUser=Voeg nieuwe gebruiker toe
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
adminUserSettings.roles=Rollen adminUserSettings.roles=Rollen
adminUserSettings.role=Rol adminUserSettings.role=Rol
adminUserSettings.actions=Acties adminUserSettings.actions=Acties
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Converteren naar enkele pagina
pageExtracter.title=Pagina's extraheren pageExtracter.title=Pagina's extraheren
pageExtracter.header=Pagina's extraheren pageExtracter.header=Pagina's extraheren
pageExtracter.submit=Extraheren pageExtracter.submit=Extraheren
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -753,11 +772,23 @@ merge.submit=Samenvoegen
pdfOrganiser.title=Pagina organisator pdfOrganiser.title=Pagina organisator
pdfOrganiser.header=PDF pagina organisator pdfOrganiser.header=PDF pagina organisator
pdfOrganiser.submit=Pagina's herschikken pdfOrganiser.submit=Pagina's herschikken
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)
#multiTool #multiTool
multiTool.title=PDF Multitool multiTool.title=PDF Multitool
multiTool.header=PDF Multitool multiTool.header=PDF Multitool
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=PDF bekijken viewPdf.title=PDF bekijken
@@ -768,6 +799,7 @@ pageRemover.title=Pagina verwijderaar
pageRemover.header=PDF pagina verwijderaar pageRemover.header=PDF pagina verwijderaar
pageRemover.pagesToDelete=Te verwijderen pagina's (Voer een door komma's gescheiden lijst met paginanummers in): pageRemover.pagesToDelete=Te verwijderen pagina's (Voer een door komma's gescheiden lijst met paginanummers in):
pageRemover.submit=Pagina's verwijderen pageRemover.submit=Pagina's verwijderen
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=Selecteer rotatiehoek (in veelvouden van 90 graden):
rotate.submit=Roteren rotate.submit=Roteren
#merge #split-pdfs
split.title=PDF splitsen split.title=PDF splitsen
split.header=PDF splitsen split.header=PDF splitsen
split.desc.1=De nummers die je kiest zijn de paginanummers waarop je een splitsing wilt uitvoeren split.desc.1=De nummers die je kiest zijn de paginanummers waarop je een splitsing wilt uitvoeren
split.desc.2=Als zodanig selecteren van 1,3,7-8 zou een 10 pagina's tellend document splitsen in 6 aparte PDF's met: split.desc.2=Als zodanig selecteren van 1,3,7-9 zou een 10 pagina's tellend document splitsen in 6 aparte PDF's met:
split.desc.3=Document #1: Pagina 1 split.desc.3=Document #1: Pagina 1
split.desc.4=Document #2: Pagina 2 en 3 split.desc.4=Document #2: Pagina 2 en 3
split.desc.5=Document #3: Pagina 4, 5 en 6 split.desc.5=Document #3: Pagina 4, 5, 6 en 7
split.desc.6=Document #4: Pagina 7 split.desc.6=Document #4: Pagina 8
split.desc.7=Document #5: Pagina 8 split.desc.7=Document #5: Pagina 9
split.desc.8=Document #6: Pagina 9 en 10 split.desc.8=Document #6: Pagina 10
split.splitPages=Voer pagina's in om op te splitsen: split.splitPages=Voer pagina's in om op te splitsen:
split.submit=Splitsen split.submit=Splitsen
@@ -855,6 +887,8 @@ watermark.selectText.7=Transparantie (0% - 100%):
watermark.selectText.8=Type watermerk: watermark.selectText.8=Type watermerk:
watermark.selectText.9=Watermerk afbeelding: watermark.selectText.9=Watermerk afbeelding:
watermark.submit=Watermerk toevoegen watermark.submit=Watermerk toevoegen
watermark.type.1=Text
watermark.type.2=Image
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDF naar PDF/A
pdfToPDFA.header=PDF naar PDF/A pdfToPDFA.header=PDF naar PDF/A
pdfToPDFA.credit=Deze service gebruikt OCRmyPDF voor PDF/A-conversie pdfToPDFA.credit=Deze service gebruikt OCRmyPDF voor PDF/A-conversie
pdfToPDFA.submit=Converteren pdfToPDFA.submit=Converteren
pdfToPDFA.tip=Currently does not work for multiple inputs at once
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=Converteren
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF naar HTML PDFToHTML.title=PDF naar HTML
PDFToHTML.header=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 PDFToHTML.submit=Converteren
@@ -989,6 +1024,15 @@ split-by-sections.vertical.placeholder=Voer het aantal verticale secties in
split-by-sections.submit=PDF splitsen split-by-sections.submit=PDF splitsen
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenties licenses.nav=Licenties
licenses.title=Licenties van derden licenses.title=Licenties van derden
@@ -998,3 +1042,16 @@ licenses.version=Versie
licenses.license=Licentie 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

View File

@@ -17,6 +17,7 @@ true=Tak
false=Nie false=Nie
unknown=Nieznany unknown=Nieznany
save=Zapisz save=Zapisz
saveToBrowser=Save to Browser
close=Zamknij close=Zamknij
filesSelected=wybrane pliki filesSelected=wybrane pliki
noFavourites=Nie dodano ulubionych noFavourites=Nie dodano ulubionych
@@ -53,18 +54,32 @@ notAuthenticatedMessage=User not authenticated.
userNotFoundMessage=User not found. userNotFoundMessage=User not found.
incorrectPasswordMessage=Current password is incorrect. incorrectPasswordMessage=Current password is incorrect.
usernameExistsMessage=New Username already exists. usernameExistsMessage=New Username already exists.
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Cannot delete currently logged in user.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. 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
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Pipeline Menu (Beta)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Upload Custom
pipeline.configureButton=Configure pipeline.configureButton=Configure
pipeline.defaultOption=Custom pipeline.defaultOption=Custom
pipeline.submitButton=Submit pipeline.submitButton=Submit
pipeline.help=Pipeline Help
pipeline.scanHelp=Folder Scanning Help
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,6 +112,7 @@ navbar.settings=Ustawienia
############# #############
settings.title=Ustawienia settings.title=Ustawienia
settings.update=Dostępna aktualizacja settings.update=Dostępna aktualizacja
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Wersia aplikacji: settings.appVersion=Wersia aplikacji:
settings.downloadOption.title=Wybierz opcję pobierania (w przypadku pobierania pojedynczych plików innych niż ZIP): settings.downloadOption.title=Wybierz opcję pobierania (w przypadku pobierania pojedynczych plików innych niż ZIP):
settings.downloadOption.1=Otwórz w tym samym oknie settings.downloadOption.1=Otwórz w tym samym oknie
@@ -105,8 +121,9 @@ settings.downloadOption.3=Pobierz plik
settings.zipThreshold=Spakuj pliki, gdy liczba pobranych plików przekroczy settings.zipThreshold=Spakuj pliki, gdy liczba pobranych plików przekroczy
settings.signOut=Sign Out settings.signOut=Sign Out
settings.accountSettings=Account Settings settings.accountSettings=Account Settings
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -145,6 +162,7 @@ adminUserSettings.header=Admin User Control Settings
adminUserSettings.admin=Admin adminUserSettings.admin=Admin
adminUserSettings.user=User adminUserSettings.user=User
adminUserSettings.addUser=Add New User adminUserSettings.addUser=Add New User
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
adminUserSettings.roles=Roles adminUserSettings.roles=Roles
adminUserSettings.role=Role adminUserSettings.role=Role
adminUserSettings.actions=Actions adminUserSettings.actions=Actions
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Convert To Single Page
pageExtracter.title=Extract Pages pageExtracter.title=Extract Pages
pageExtracter.header=Extract Pages pageExtracter.header=Extract Pages
pageExtracter.submit=Extract pageExtracter.submit=Extract
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -753,11 +772,23 @@ merge.submit=Połącz
pdfOrganiser.title=Kolejność stron pdfOrganiser.title=Kolejność stron
pdfOrganiser.header=Kolejność stron PDF pdfOrganiser.header=Kolejność stron PDF
pdfOrganiser.submit=Zmień kolejność stron pdfOrganiser.submit=Zmień kolejność stron
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)
#multiTool #multiTool
multiTool.title=Multi narzędzie PDF multiTool.title=Multi narzędzie PDF
multiTool.header=Multi narzędzie PDF multiTool.header=Multi narzędzie PDF
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=View PDF
@@ -768,6 +799,7 @@ pageRemover.title=Narzędzie do usuwania stron
pageRemover.header=Narzędzie do usuwania stron w dokumentach PDF pageRemover.header=Narzędzie do usuwania stron w dokumentach PDF
pageRemover.pagesToDelete=Strony do usunięcia (wprowadź listę numerów stron oddzielonych przecinkami): pageRemover.pagesToDelete=Strony do usunięcia (wprowadź listę numerów stron oddzielonych przecinkami):
pageRemover.submit=Usuń strony pageRemover.submit=Usuń strony
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=Wybierz kąt obrotu (domyślnie 90 stopni):
rotate.submit=Obróć rotate.submit=Obróć
#merge #split-pdfs
split.title=Podziel dokument PDF split.title=Podziel dokument PDF
split.header=Podziel dokument PDF split.header=Podziel dokument PDF
split.desc.1=Wybrane numery to numery stron, na których chcesz dokonać podziału split.desc.1=Wybrane numery to numery stron, na których chcesz dokonać podziału
split.desc.2=Np. taki wybór 1,3,7-8 podzieliłby 10-stronicowy dokument na 6 oddzielnych plików PDF z: split.desc.2=Np. taki wybór 1,3,7-9 podzieliłby 10-stronicowy dokument na 6 oddzielnych plików PDF z:
split.desc.3=Dokument #1: Strona 1 split.desc.3=Dokument #1: Strona 1
split.desc.4=Dokument #2: Strona 2 i 3 split.desc.4=Dokument #2: Strona 2 i 3
split.desc.5=Dokument #3: Strona 4, 5 i 6 split.desc.5=Dokument #3: Strona 4, 5, 6 i 7
split.desc.6=Dokument #4: Strona 7 split.desc.6=Dokument #4: Strona 8
split.desc.7=Dokument #5: Strona 8 split.desc.7=Dokument #5: Strona 9
split.desc.8=Dokument #6: Strona 9 i 10 split.desc.8=Dokument #6: Strona 10
split.splitPages=Wprowadź strony do podziału na: split.splitPages=Wprowadź strony do podziału na:
split.submit=Podziel split.submit=Podziel
@@ -855,6 +887,8 @@ watermark.selectText.7=Nieprzezroczystość (0% - 100%):
watermark.selectText.8=Watermark Type: watermark.selectText.8=Watermark Type:
watermark.selectText.9=Watermark Image: watermark.selectText.9=Watermark Image:
watermark.submit=Dodaj znak wodny watermark.submit=Dodaj znak wodny
watermark.type.1=Text
watermark.type.2=Image
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDF na PDF/A
pdfToPDFA.header=PDF na PDF/A pdfToPDFA.header=PDF na PDF/A
pdfToPDFA.credit=Ta usługa używa OCRmyPDF do konwersji PDF/A pdfToPDFA.credit=Ta usługa używa OCRmyPDF do konwersji PDF/A
pdfToPDFA.submit=Konwertuj pdfToPDFA.submit=Konwertuj
pdfToPDFA.tip=Currently does not work for multiple inputs at once
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=Konwertuj
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF na HTML PDFToHTML.title=PDF na HTML
PDFToHTML.header=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 PDFToHTML.submit=Konwertuj
@@ -989,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses
@@ -998,3 +1042,16 @@ licenses.version=Version
licenses.license=License 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

View File

@@ -17,6 +17,7 @@ true=Verdadeiro
false=Falso false=Falso
unknown=Desconhecido unknown=Desconhecido
save=Salvar save=Salvar
saveToBrowser=Save to Browser
close=Fechar close=Fechar
filesSelected=arquivos selecionados filesSelected=arquivos selecionados
noFavourites=Nenhum favorito adicionado noFavourites=Nenhum favorito adicionado
@@ -53,18 +54,32 @@ notAuthenticatedMessage=User not authenticated.
userNotFoundMessage=User not found. userNotFoundMessage=User not found.
incorrectPasswordMessage=Current password is incorrect. incorrectPasswordMessage=Current password is incorrect.
usernameExistsMessage=New Username already exists. usernameExistsMessage=New Username already exists.
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Cannot delete currently logged in user.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. 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
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Pipeline Menu (Beta)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Upload Custom
pipeline.configureButton=Configure pipeline.configureButton=Configure
pipeline.defaultOption=Custom pipeline.defaultOption=Custom
pipeline.submitButton=Submit pipeline.submitButton=Submit
pipeline.help=Pipeline Help
pipeline.scanHelp=Folder Scanning Help
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,6 +112,7 @@ navbar.settings=Configurações
############# #############
settings.title=Configurações settings.title=Configurações
settings.update=Atualização disponível settings.update=Atualização disponível
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Versão do aplicativo: settings.appVersion=Versão do aplicativo:
settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de arquivo único): settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de arquivo único):
settings.downloadOption.1=Abrir na mesma janela settings.downloadOption.1=Abrir na mesma janela
@@ -105,8 +121,9 @@ settings.downloadOption.3=⇬ Fazer download do arquivo
settings.zipThreshold=Compactar arquivos quando o número de arquivos baixados exceder settings.zipThreshold=Compactar arquivos quando o número de arquivos baixados exceder
settings.signOut=Sign Out settings.signOut=Sign Out
settings.accountSettings=Account Settings settings.accountSettings=Account Settings
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -145,6 +162,7 @@ adminUserSettings.header=Admin User Control Settings
adminUserSettings.admin=Admin adminUserSettings.admin=Admin
adminUserSettings.user=User adminUserSettings.user=User
adminUserSettings.addUser=Add New User adminUserSettings.addUser=Add New User
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
adminUserSettings.roles=Roles adminUserSettings.roles=Roles
adminUserSettings.role=Role adminUserSettings.role=Role
adminUserSettings.actions=Actions adminUserSettings.actions=Actions
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Converter para Página Única
pageExtracter.title=Extrair Páginas pageExtracter.title=Extrair Páginas
pageExtracter.header=Extrair Páginas pageExtracter.header=Extrair Páginas
pageExtracter.submit=Extrair pageExtracter.submit=Extrair
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -753,11 +772,23 @@ merge.submit=Mesclar
pdfOrganiser.title=Organizador de Páginas pdfOrganiser.title=Organizador de Páginas
pdfOrganiser.header=Organizador de Páginas PDF pdfOrganiser.header=Organizador de Páginas PDF
pdfOrganiser.submit=Reorganizar Páginas pdfOrganiser.submit=Reorganizar 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)
#multiTool #multiTool
multiTool.title=Multiferramenta de PDF multiTool.title=Multiferramenta de PDF
multiTool.header=Multiferramenta de PDF multiTool.header=Multiferramenta de PDF
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=View PDF
@@ -768,6 +799,7 @@ pageRemover.title=Remover Página
pageRemover.header=Remover Páginas do PDF pageRemover.header=Remover Páginas do PDF
pageRemover.pagesToDelete=Páginas a serem excluídas (insira uma lista separada por vírgulas de números de página): pageRemover.pagesToDelete=Páginas a serem excluídas (insira uma lista separada por vírgulas de números de página):
pageRemover.submit=Excluir Páginas pageRemover.submit=Excluir Páginas
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=Selecione o ângulo de rotação (múltiplos de 90 graus):
rotate.submit=Girar rotate.submit=Girar
#merge #split-pdfs
split.title=Dividir PDF split.title=Dividir PDF
split.header=Dividir PDF split.header=Dividir PDF
split.desc.1=Os números selecionados correspondem às páginas onde você deseja fazer a divisão. split.desc.1=Os números selecionados correspondem às páginas onde você deseja fazer a divisão.
split.desc.2=Por exemplo, selecionar 1,3,7-8 dividirá um documento de 10 páginas em 6 PDFs separados da seguinte forma: split.desc.2=Por exemplo, selecionar 1,3,7-9 dividirá um documento de 10 páginas em 6 PDFs separados da seguinte forma:
split.desc.3=Documento Nº1: Página 1 split.desc.3=Documento Nº1: Página 1
split.desc.4=Documento Nº2: Páginas 2 e 3 split.desc.4=Documento Nº2: Páginas 2 e 3
split.desc.5=Documento Nº3: Páginas 4, 5 e 6 split.desc.5=Documento Nº3: Páginas 4, 5, 6 e 7
split.desc.6=Documento Nº4: Página 7 split.desc.6=Documento Nº4: Página 8
split.desc.7=Documento Nº5: Página 8 split.desc.7=Documento Nº5: Página 9
split.desc.8=Documento Nº6: Páginas 9 e 10 split.desc.8=Documento Nº6: Páginas 10
split.splitPages=Digite as páginas para a divisão: split.splitPages=Digite as páginas para a divisão:
split.submit=Dividir split.submit=Dividir
@@ -855,6 +887,8 @@ watermark.selectText.7=Opacidade (0% - 100%)
watermark.selectText.8=Tipo de Marca d'Água watermark.selectText.8=Tipo de Marca d'Água
watermark.selectText.9=Imagem da Marca d'Água watermark.selectText.9=Imagem da Marca d'Água
watermark.submit=Adicionar Marca d'Água watermark.submit=Adicionar Marca d'Água
watermark.type.1=Text
watermark.type.2=Image
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDF para PDF/A
pdfToPDFA.header=PDF para PDF/A pdfToPDFA.header=PDF para PDF/A
pdfToPDFA.credit=Este serviço usa OCRmyPDF para Conversão de PDF/A pdfToPDFA.credit=Este serviço usa OCRmyPDF para Conversão de PDF/A
pdfToPDFA.submit=Converter pdfToPDFA.submit=Converter
pdfToPDFA.tip=Currently does not work for multiple inputs at once
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=Converter
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF para HTML PDFToHTML.title=PDF para HTML
PDFToHTML.header=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 PDFToHTML.submit=Converter
@@ -989,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses
@@ -998,3 +1042,16 @@ licenses.version=Version
licenses.license=License 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

View File

@@ -17,6 +17,7 @@ true=Verdadeiro
false=Falso false=Falso
unknown=Desconhecido unknown=Desconhecido
save=Salvar save=Salvar
saveToBrowser=Save to Browser
close=Fechar close=Fechar
filesSelected=Ficheiros Selecionados filesSelected=Ficheiros Selecionados
noFavourites=Nenhum favorito adicionado noFavourites=Nenhum favorito adicionado
@@ -53,18 +54,32 @@ notAuthenticatedMessage=Utilizador não autenticado.
userNotFoundMessage=Utilizador inexistente. userNotFoundMessage=Utilizador inexistente.
incorrectPasswordMessage=Senha incorreta. incorrectPasswordMessage=Senha incorreta.
usernameExistsMessage=Esse utilizador já existe. usernameExistsMessage=Esse utilizador já existe.
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Cannot delete currently logged in user.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. 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
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Pipeline Menu (Beta)
pipeline.uploadButton=Carregar personalizado pipeline.uploadButton=Carregar personalizado
pipeline.configureButton=Configurar pipeline.configureButton=Configurar
pipeline.defaultOption=Personalizar pipeline.defaultOption=Personalizar
pipeline.submitButton=Submeter pipeline.submitButton=Submeter
pipeline.help=Pipeline Help
pipeline.scanHelp=Folder Scanning Help
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -97,6 +112,7 @@ navbar.settings=Configurações
############# #############
settings.title=Configurações settings.title=Configurações
settings.update=Atualização disponível settings.update=Atualização disponível
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Versão da aplicação: settings.appVersion=Versão da aplicação:
settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de ficheiro único): settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de ficheiro único):
settings.downloadOption.1=Abrir na mesma janela settings.downloadOption.1=Abrir na mesma janela
@@ -105,8 +121,9 @@ settings.downloadOption.3=⇬ Fazer download do ficheiro
settings.zipThreshold=Compactar ficheiros quando o número de ficheiros baixados exceder settings.zipThreshold=Compactar ficheiros quando o número de ficheiros baixados exceder
settings.signOut=Terminar Sessão settings.signOut=Terminar Sessão
settings.accountSettings=Configuração de Conta settings.accountSettings=Configuração de Conta
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Alterar senha changeCreds.title=Alterar senha
changeCreds.header=Alterar dados da sua conta changeCreds.header=Alterar dados da sua conta
@@ -145,6 +162,7 @@ adminUserSettings.header=Admin User Control Settings
adminUserSettings.admin=Admin adminUserSettings.admin=Admin
adminUserSettings.user=User adminUserSettings.user=User
adminUserSettings.addUser=Add New User adminUserSettings.addUser=Add New User
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
adminUserSettings.roles=Roles adminUserSettings.roles=Roles
adminUserSettings.role=Role adminUserSettings.role=Role
adminUserSettings.actions=Actions adminUserSettings.actions=Actions
@@ -451,6 +469,7 @@ pdfToSinglePage.submit=Converter para Página Única
pageExtracter.title=Extrair Páginas pageExtracter.title=Extrair Páginas
pageExtracter.header=Extrair Páginas pageExtracter.header=Extrair Páginas
pageExtracter.submit=Extrair pageExtracter.submit=Extrair
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
#getPdfInfo #getPdfInfo
@@ -753,11 +772,23 @@ merge.submit=Juntar
pdfOrganiser.title=Organizador de Páginas pdfOrganiser.title=Organizador de Páginas
pdfOrganiser.header=Organizador de Páginas PDF pdfOrganiser.header=Organizador de Páginas PDF
pdfOrganiser.submit=Reorganizar Páginas pdfOrganiser.submit=Reorganizar 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)
#multiTool #multiTool
multiTool.title=Multiferramenta de PDF multiTool.title=Multiferramenta de PDF
multiTool.header=Multiferramenta de PDF multiTool.header=Multiferramenta de PDF
multiTool.uploadPrompts=Please Upload PDF
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=View PDF
@@ -768,6 +799,7 @@ pageRemover.title=Remover Página
pageRemover.header=Remover Páginas do PDF pageRemover.header=Remover Páginas do PDF
pageRemover.pagesToDelete=Páginas a serem excluídas (insira uma lista separada por vírgulas de números de página): pageRemover.pagesToDelete=Páginas a serem excluídas (insira uma lista separada por vírgulas de números de página):
pageRemover.submit=Excluir Páginas pageRemover.submit=Excluir Páginas
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
#rotate #rotate
@@ -777,17 +809,17 @@ rotate.selectAngle=Seleccione o ângulo de rotação (múltiplos de 90 graus):
rotate.submit=Girar rotate.submit=Girar
#merge #split-pdfs
split.title=Dividir PDF split.title=Dividir PDF
split.header=Dividir PDF split.header=Dividir PDF
split.desc.1=Os números seleccionados correspondem às páginas onde você deseja fazer a divisão. split.desc.1=Os números seleccionados correspondem às páginas onde você deseja fazer a divisão.
split.desc.2=Por exemplo, seleccionar 1,3,7-8 dividirá um documento de 10 páginas em 6 PDFs separados da seguinte forma: split.desc.2=Por exemplo, seleccionar 1,3,7-9 dividirá um documento de 10 páginas em 6 PDFs separados da seguinte forma:
split.desc.3=Documento Nº1: Página 1 split.desc.3=Documento Nº1: Página 1
split.desc.4=Documento Nº2: Páginas 2 e 3 split.desc.4=Documento Nº2: Páginas 2 e 3
split.desc.5=Documento Nº3: Páginas 4, 5 e 6 split.desc.5=Documento Nº3: Páginas 4, 5, 6 e 7
split.desc.6=Documento Nº4: Página 7 split.desc.6=Documento Nº4: Página 8
split.desc.7=Documento Nº5: Página 8 split.desc.7=Documento Nº5: Página 9
split.desc.8=Documento Nº6: Páginas 9 e 10 split.desc.8=Documento Nº6: Páginas 10
split.splitPages=Digite as páginas para a divisão: split.splitPages=Digite as páginas para a divisão:
split.submit=Dividir split.submit=Dividir
@@ -855,6 +887,8 @@ watermark.selectText.7=Opacidade (0% - 100%)
watermark.selectText.8=Tipo de Marca d'Água watermark.selectText.8=Tipo de Marca d'Água
watermark.selectText.9=Imagem da Marca d'Água watermark.selectText.9=Imagem da Marca d'Água
watermark.submit=Adicionar Marca d'Água watermark.submit=Adicionar Marca d'Água
watermark.type.1=Text
watermark.type.2=Image
#Change permissions #Change permissions
@@ -906,6 +940,7 @@ pdfToPDFA.title=PDF para PDF/A
pdfToPDFA.header=PDF para PDF/A pdfToPDFA.header=PDF para PDF/A
pdfToPDFA.credit=Este serviço usa OCRmyPDF para Conversão de PDF/A pdfToPDFA.credit=Este serviço usa OCRmyPDF para Conversão de PDF/A
pdfToPDFA.submit=Converter pdfToPDFA.submit=Converter
pdfToPDFA.tip=Currently does not work for multiple inputs at once
#PDFToWord #PDFToWord
@@ -935,7 +970,7 @@ PDFToText.submit=Converter
#PDFToHTML #PDFToHTML
PDFToHTML.title=PDF para HTML PDFToHTML.title=PDF para HTML
PDFToHTML.header=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 PDFToHTML.submit=Converter
@@ -989,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.submit=Dividir PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenças licenses.nav=Licenças
licenses.title=Licenças de terceiros licenses.title=Licenças de terceiros
@@ -998,3 +1042,16 @@ licenses.version=Versão
licenses.license=Licença 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

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