Compare commits

...

238 Commits

Author SHA1 Message Date
Anthony Stirling
29dab5e47d numbers name 2023-07-25 00:01:20 +01:00
Anthony Stirling
9e655631b4 lang cleanup 2023-07-24 23:53:52 +01:00
Anthony Stirling
179c7b80bb languages 2023-07-24 23:12:33 +01:00
Anthony Stirling
349bf29122 fix navbar not supporting other languages nicely size wise 2023-07-23 23:20:30 +01:00
Anthony Stirling
295357f12b tags and searching 2023-07-23 23:05:02 +01:00
Anthony Stirling
940f8d999e Update messages_en_GB.properties 2023-07-23 15:13:33 +01:00
Anthony Stirling
5605d53a5f Update messages_en_GB.properties 2023-07-23 13:05:47 +01:00
Anthony Stirling
116d103119 html to pdf 2023-07-23 00:03:25 +01:00
Anthony Stirling
2fd8c643af UI for html/url 2023-07-22 17:27:08 +01:00
Anthony Stirling
4367ae7934 html and url to pdf init 2023-07-22 16:57:40 +01:00
Anthony Stirling
749461334d pdfjs worker changes and crop fix 2023-07-22 13:17:24 +01:00
Anthony Stirling
e83a027023 Merge pull request #266 from webysther/patch-1
Update HowToUseOCR.md
2023-07-19 23:35:20 +01:00
Anthony Stirling
1883b477a3 Merge branch 'main' into patch-1 2023-07-19 23:33:46 +01:00
Anthony Stirling
37e2cd40da Merge pull request #276 from Frooodle/pipelineStuff
Start of v0.11
2023-07-19 23:26:57 +01:00
Anthony Stirling
81a9329975 border to contrast 2023-07-19 23:23:08 +01:00
Anthony Stirling
0eb019fc3c searchbar cleanups 2023-07-19 23:15:16 +01:00
Anthony Stirling
4129c75475 crop fix, auto split docs and UI and message 2023-07-19 22:11:59 +01:00
Anthony Stirling
3d66f03f58 hide pipeline 2023-07-18 22:09:48 +01:00
Anthony Stirling
7b83104fd6 fix for #275 2023-07-18 22:04:18 +01:00
Anthony Stirling
794aede27f docs 2023-07-17 21:59:34 +01:00
Anthony Stirling
08eb39b206 divider examples 2023-07-16 23:52:09 +01:00
Anthony Stirling
2566c7f3d7 translations 2023-07-16 19:42:13 +01:00
Anthony Stirling
a8522bb3b5 GB pretty 2023-07-16 19:34:01 +01:00
Anthony Stirling
92b9142902 language cleanups and sanitize 2023-07-16 18:57:21 +01:00
Anthony Stirling
d07e3e6522 change add numbers grid and remove files from pipelines 2023-07-16 16:07:08 +01:00
Anthony Stirling
29aabdfba8 filter 2023-07-16 00:36:58 +01:00
Anthony Stirling
9af1b0cfdc some more changes also broke pipeline a bit 2023-07-15 16:06:33 +01:00
Anthony Stirling
6e32c7fe85 auto split init 2023-07-15 11:39:10 +01:00
Anthony Stirling
ddf5915c6a drag drop niceness 2023-07-13 22:03:23 +01:00
Anthony Stirling
cdbf1fa73a watermark features 2023-07-12 23:27:36 +01:00
Anthony Stirling
5d926b022b gitingore 2023-07-12 00:17:55 +01:00
Anthony Stirling
50bcca10e2 pipeline stuff 2023-07-12 00:17:44 +01:00
Webysther Sperandio
a5528c06ee Update HowToUseOCR.md 2023-07-10 13:49:58 +02:00
Anthony Stirling
94526de04b sign fix 2023-07-09 20:34:07 +01:00
Anthony Stirling
1ddf7abe6f extra fonts plus dynamic fonts 2023-07-09 19:36:41 +01:00
Anthony Stirling
a742c1b034 stuff 2023-07-09 18:10:10 +01:00
Anthony Stirling
6e726ac2a6 lots of stuff and garbage code for automate to cleanup lots 2023-07-09 00:05:33 +01:00
Anthony Stirling
5877b40be5 adjust contrast! 2023-07-06 22:52:22 +01:00
Anthony Stirling
a3c7f5aa46 Search bar and adjust contrast 2023-07-05 22:21:43 +01:00
Anthony Stirling
4e28bf03bd auto rename 2023-07-04 23:25:21 +01:00
Anthony Stirling
f92482d89e page numbers and custom images 2023-07-04 21:45:35 +01:00
Anthony Stirling
3c54429fe0 Update README.md 2023-07-02 19:19:49 +01:00
dependabot[bot]
4c4c22e861 Merge pull request #252 from Frooodle/dependabot/gradle/org.springframework.boot-3.1.1 2023-07-02 17:41:23 +00:00
Anthony Stirling
00e27d9327 Merge branch 'main' into dependabot/gradle/org.springframework.boot-3.1.1 2023-07-02 18:39:22 +01:00
dependabot[bot]
f082278041 Merge pull request #253 from Frooodle/dependabot/gradle/org.springframework.boot-spring-boot-starter-thymeleaf-3.1.1 2023-07-02 17:38:09 +00:00
Anthony Stirling
09dde64c57 Merge branch 'main' into dependabot/gradle/org.springframework.boot-spring-boot-starter-thymeleaf-3.1.1 2023-07-02 18:37:20 +01:00
dependabot[bot]
b52a6357f6 Merge pull request #239 from Frooodle/dependabot/gradle/edu.sc.seis.launch4j-3.0.3 2023-07-02 17:34:15 +00:00
Anthony Stirling
f14a566d06 Merge branch 'main' into dependabot/gradle/edu.sc.seis.launch4j-3.0.3 2023-07-02 18:33:21 +01:00
Anthony Stirling
b352ec6888 Merge pull request #234 from Frooodle/dependabot/gradle/commons-io-commons-io-2.13.0
Bump commons-io:commons-io from 2.11.0 to 2.13.0
2023-07-02 18:33:12 +01:00
Anthony Stirling
4ec1bad03d Merge branch 'main' into dependabot/gradle/commons-io-commons-io-2.13.0 2023-07-02 18:32:22 +01:00
Anthony Stirling
f20bbc119d Merge branch 'main' into dependabot/gradle/org.springframework.boot-spring-boot-starter-thymeleaf-3.1.1 2023-07-02 18:32:14 +01:00
Anthony Stirling
8555c3d422 Merge branch 'main' into dependabot/gradle/org.springframework.boot-3.1.1 2023-07-02 18:32:08 +01:00
Anthony Stirling
71f9d03b19 Merge pull request #251 from albertopasqualetto/main
addImage text was wrong
2023-07-02 18:31:33 +01:00
dependabot[bot]
0b31379078 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.1.0 to 3.1.1.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.1.0...v3.1.1)

---
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>
2023-07-02 17:30:55 +00:00
dependabot[bot]
29c204b2c2 Bump org.springframework.boot from 3.1.0 to 3.1.1
Bumps [org.springframework.boot](https://github.com/spring-projects/spring-boot) from 3.1.0 to 3.1.1.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.1.0...v3.1.1)

---
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>
2023-07-02 17:30:53 +00:00
dependabot[bot]
657e881963 Bump edu.sc.seis.launch4j from 3.0.1 to 3.0.3
Bumps edu.sc.seis.launch4j from 3.0.1 to 3.0.3.

---
updated-dependencies:
- dependency-name: edu.sc.seis.launch4j
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-02 17:30:51 +00:00
Anthony Stirling
ef6bdc70a4 Merge branch 'main' into dependabot/gradle/commons-io-commons-io-2.13.0 2023-07-02 18:30:35 +01:00
Anthony Stirling
e4a36115a2 Merge pull request #230 from Frooodle/dependabot/gradle/io.swagger.swaggerhub-1.2.0
Bump io.swagger.swaggerhub from 1.1.0 to 1.2.0
2023-07-02 18:30:19 +01:00
dependabot[bot]
325f86832c Bump commons-io:commons-io from 2.11.0 to 2.13.0
Bumps commons-io:commons-io from 2.11.0 to 2.13.0.

---
updated-dependencies:
- dependency-name: commons-io:commons-io
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-02 17:27:54 +00:00
dependabot[bot]
e3dbdd6b09 Bump io.swagger.swaggerhub from 1.1.0 to 1.2.0
Bumps io.swagger.swaggerhub from 1.1.0 to 1.2.0.

---
updated-dependencies:
- dependency-name: io.swagger.swaggerhub
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-02 17:27:54 +00:00
Anthony Stirling
919041e879 Update version and disable folder scan alpha 2023-07-02 18:27:23 +01:00
Anthony Stirling
182231a183 Merge pull request #256 from Frooodle/pipeline
Pipeline changes, fonts, and watermark fixes
2023-07-02 18:21:17 +01:00
Anthony Stirling
46d4ae8fc5 pipeline change 2023-07-02 18:20:23 +01:00
Anthony Stirling
73ab1936a3 filter update 2023-07-02 00:34:04 +01:00
Anthony Stirling
59c72527b5 remove from menu for now 2023-07-01 23:40:17 +01:00
Anthony Stirling
5ea3bcc1dd watermark stuff 2023-07-01 22:18:49 +01:00
Anthony Stirling
c140052822 watermark fix 2023-07-01 21:08:33 +01:00
Anthony Stirling
f7832774d9 cachec change 2023-06-29 23:59:15 +01:00
systo
279d25c03a Merge branch 'pipeline' of git@github.com:Frooodle/Stirling-PDF.git into pipeline 2023-06-29 23:34:22 +01:00
Anthony Stirling
f1984047a8 Update README.md 2023-06-29 22:03:31 +01:00
Anthony Stirling
eae7c1bd60 Update README.md 2023-06-29 22:02:59 +01:00
systo
d7f592ebda Merge remote-tracking branch 'origin/main' into pipeline 2023-06-29 22:01:49 +01:00
Anthony Stirling
1798ce002a Fix metrics 2023-06-29 21:51:08 +01:00
systo
57a0cca595 Merge remote-tracking branch 'origin/master' into pipeline 2023-06-29 19:13:33 +01:00
Anthony Stirling
b26fbd7693 Update README.md 2023-06-29 17:07:34 +01:00
Anthony Stirling
43b0e25bdb modes 2023-06-26 18:23:06 +01:00
Anthony Stirling
3377af1305 api tag 2023-06-25 09:16:32 +01:00
Anthony Stirling
c81c1006b7 Merge branch 'pipeline' of git@github.com:Frooodle/Stirling-PDF.git into
pipeline
2023-06-24 15:25:39 +01:00
systo
f313857f96 Merge branch 'pipeline' of git@github.com:Frooodle/Stirling-PDF.git into pipeline 2023-06-24 14:59:58 +01:00
Anthony Stirling
d5fbe02149 notosans arabic JP, KR SC 2023-06-24 14:59:49 +01:00
Anthony Stirling
159cee0b39 init many new shit 2023-06-23 23:29:53 +01:00
Alberto Pasqualetto
5da4dd6cca Fix addImages text 2023-06-23 00:11:26 +00:00
Anthony Stirling
e9daf05f16 pipeline cleanup 2023-06-21 21:41:58 +01:00
Anthony Stirling
a12643194a changes 2023-06-21 21:19:52 +01:00
Anthony Stirling
25d8fc08f7 Merge pull request #250 from inazkue/patch-1
Update navbar.html
2023-06-21 11:55:44 +01:00
inazkue
a72378dd4d Update navbar.html
fix navbar.html basque language item description
2023-06-21 11:10:50 +02:00
systo
9aed70408b Merge branch 'pipeline' of git@github.com:Frooodle/Stirling-PDF.git into pipeline 2023-06-20 23:50:05 +01:00
Anthony Stirling
5ae2c71c3a Input:PDF Output:PDF 2023-06-20 23:49:53 +01:00
Anthony Stirling
4edce515b8 Merge pull request #249 from inazkue/main
Basque language
2023-06-20 21:42:57 +01:00
Anthony Stirling
67ff664eb8 Delete messages_eu_EU.properties 2023-06-20 21:41:44 +01:00
inazkue
71c1a4f102 Update navbar.html 2023-06-20 14:44:37 +02:00
inazkue
ba4ba1b9fc Add files via upload 2023-06-20 14:38:11 +02:00
inazkue
59f10f06ca Add files via upload 2023-06-19 11:57:18 +02:00
inazkue
f7953cbc37 Add files via upload 2023-06-19 11:55:54 +02:00
Anthony Stirling
9a74e81754 text 2023-06-14 19:57:01 +01:00
Anthony Stirling
420e4b6766 fixes 2023-06-13 23:50:46 +01:00
Anthony Stirling
aed48ffc93 pipe 2023-06-13 19:18:40 +01:00
Anthony Stirling
0cebe69ff8 Pipeline init 2023-06-13 00:32:15 +01:00
Anthony Stirling
e5990dba81 Update Beans.java 2023-06-12 17:31:42 +01:00
Anthony Stirling
c9b0d01250 Update push-docker.yml 2023-06-12 16:20:14 +01:00
Anthony Stirling
4918ed3f3c Merge pull request #238 from tkymmm/japanese
Japanese
2023-06-12 11:02:28 +01:00
tkymmm
b176ce4251 Update navbar.html 2023-06-12 14:57:51 +09:00
tkymmm
518ff5409e Add files via upload 2023-06-12 14:56:45 +09:00
tkymmm
803bd3c5b2 Add files via upload 2023-06-12 14:56:05 +09:00
Anthony Stirling
03d4e73304 jar name change 2023-06-10 18:24:32 +01:00
Anthony Stirling
55a820b09f Update build.gradle 2023-06-10 18:20:28 +01:00
Anthony Stirling
f2a65dc360 Update build.gradle 2023-06-10 18:15:23 +01:00
Anthony Stirling
7b4a889ea7 Remove debugs 2023-06-10 18:14:34 +01:00
Anthony Stirling
f627d251c3 Update releaseArtifacts.yml 2023-06-10 18:06:59 +01:00
Anthony Stirling
d5b7125415 Rename app to Stirling-PDF not S-pdf 2023-06-10 18:04:06 +01:00
Anthony Stirling
67dd3cf0e3 Update releaseArtifacts.yml 2023-06-10 17:54:50 +01:00
Anthony Stirling
b8b62bb5af Update releaseArtifacts.yml 2023-06-10 17:44:02 +01:00
Anthony Stirling
b4a9d1ac18 Update releaseArtifacts.yml 2023-06-10 17:39:36 +01:00
Anthony Stirling
8aae651c2c Update releaseArtifacts.yml 2023-06-10 15:22:35 +01:00
Anthony Stirling
fc9465b324 Update releaseArtifacts.yml 2023-06-10 15:21:54 +01:00
Anthony Stirling
579a50be2c Update releaseArtifacts.yml 2023-06-10 15:15:51 +01:00
Anthony Stirling
9c5b967e4c fix 2023-06-10 15:10:37 +01:00
Anthony Stirling
d41deb729b fix for action 2023-06-10 15:07:20 +01:00
Anthony Stirling
a93a89f3f0 github action for release upload 2023-06-10 15:06:01 +01:00
Anthony Stirling
11d642a25f Upload jar and .exe to release 2023-06-10 15:05:38 +01:00
Anthony Stirling
67448498ea documentation stuff and downloer fix for image to pdf 2023-06-10 00:46:44 +01:00
Anthony Stirling
489b8da713 fix for actions 2023-06-08 22:28:13 +01:00
Anthony Stirling
728d4d0fa8 latest 2023-06-08 22:02:09 +01:00
Anthony Stirling
e70f4ff3a6 version bump 2023-06-08 20:45:35 +01:00
Anthony Stirling
04032c0dfe sign changes min size, lite docker, merge fix #172 2023-06-08 20:25:55 +01:00
Anthony Stirling
ecba6461df Merge branch 'main' of git@github.com:Frooodle/Stirling-PDF.git into
main
2023-06-07 14:47:06 +01:00
Anthony Stirling
433ba6c250 groups update 2023-06-07 14:13:18 +01:00
Anthony Stirling
ff6c55d1d0 fix naming issues in split and made it allign with others 2023-06-07 14:01:37 +01:00
Anthony Stirling
d9f8facf2e Merge pull request #232 from NeilJared/patch-1
Update messages_es_ES.properties
2023-06-06 00:26:20 +01:00
NeilJared
6bd3e5cc8f Update messages_es_ES.properties
Updated Spanish translation
2023-06-06 01:12:03 +02:00
Anthony Stirling
936fb5ae45 Update README.md 2023-06-05 23:08:55 +01:00
Anthony Stirling
8e661e1260 fix spanish remove blanks 2023-06-05 22:30:18 +01:00
Anthony Stirling
987d9b0502 Merge pull request #227 from jordyjordy/fix-imgtopdf-typo
fix typo in img conversion filename
2023-06-05 19:42:48 +01:00
Anthony Stirling
f6a9169446 Merge branch 'main' into fix-imgtopdf-typo 2023-06-05 19:41:24 +01:00
Anthony Stirling
d5c1c43eb1 Merge pull request #228 from jordyjordy/fix-multitool-filemixing
await pdf creation in each for loop.
2023-06-05 19:41:15 +01:00
Anthony Stirling
20c74dac60 Merge branch 'main' into fix-multitool-filemixing 2023-06-05 19:40:00 +01:00
Anthony Stirling
30161275a3 Merge branch 'main' into fix-imgtopdf-typo 2023-06-05 19:39:14 +01:00
jordy
7e9479806e await pdf creation in each for loop. 2023-06-05 19:38:25 +02:00
jordy
39b9ea9f1d fix typo 2023-06-05 19:25:36 +02:00
Anthony Stirling
5a9165d7c6 missing lang 2023-06-05 18:23:15 +01:00
Anthony Stirling
4f851156b7 dummy lang changes 2023-06-04 22:40:14 +01:00
Anthony Stirling
b8fa278173 finalise auto swagger docs 2023-06-03 23:32:47 +01:00
Anthony Stirling
2cfb344e13 swagger 2023-06-03 23:24:40 +01:00
Anthony Stirling
1d2bf92abe Merge branch 'main' of git@github.com:Frooodle/Stirling-PDF.git into
main
2023-06-03 23:21:47 +01:00
Anthony Stirling
cefcda9f40 test 2023-06-03 23:21:12 +01:00
Anthony Stirling
a4bc67ff8e Update swagger.yml 2023-06-03 23:08:10 +01:00
Anthony Stirling
48b3dea256 remove push 2023-06-03 23:05:20 +01:00
Anthony Stirling
1f5231d905 @./SwaggerDoc.json 2023-06-03 23:01:14 +01:00
Anthony Stirling
c526e18992 Split pages support n function and other stuff 2023-06-03 22:56:15 +01:00
Anthony Stirling
4594765cbd rearrange support n numbers, downloader.js fixes 2023-06-03 17:21:59 +01:00
Anthony Stirling
e2a787e519 Hide banner if mobile 2023-06-02 23:43:22 +01:00
Anthony Stirling
45b3e0aa6a JS and css cleanup 2023-06-02 20:15:10 +01:00
Anthony Stirling
7bdb2615d4 css cleanup 2023-06-01 23:12:55 +01:00
systo
019a502490 Merge branch 'main' of git@github.com:Frooodle/Stirling-PDF.git into main 2023-06-01 21:37:40 +01:00
Anthony Stirling
6793fd5bc7 thirs party js folder 2023-06-01 21:37:33 +01:00
systo
8ac5cf759e Merge branch 'main' of git@github.com:Frooodle/Stirling-PDF.git into main 2023-06-01 11:22:56 +01:00
Anthony Stirling
19880567ba Donation buttons 2023-06-01 11:22:44 +01:00
Anthony Stirling
5c5a3fefc1 Merge pull request #205 from Frooodle/dependabot/gradle/org.springframework.boot-spring-boot-starter-test-3.1.0
Bump org.springframework.boot:spring-boot-starter-test from 3.0.6 to 3.1.0
2023-06-01 10:53:13 +01:00
Anthony Stirling
90057828a5 Merge branch 'main' into dependabot/gradle/org.springframework.boot-spring-boot-starter-test-3.1.0 2023-06-01 10:52:24 +01:00
Anthony Stirling
7cfc3a09a2 Merge pull request #206 from Frooodle/dependabot/gradle/org.springframework.boot-3.1.0
Bump org.springframework.boot from 3.0.6 to 3.1.0
2023-06-01 10:52:08 +01:00
dependabot[bot]
b8bbee27f8 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.0.6 to 3.1.0.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.0.6...v3.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 09:51:11 +00:00
Anthony Stirling
8e5c665e49 Merge branch 'main' into dependabot/gradle/org.springframework.boot-3.1.0 2023-06-01 10:50:49 +01:00
Anthony Stirling
7b1e6fb953 Merge pull request #204 from Frooodle/dependabot/gradle/org.springframework.boot-spring-boot-starter-thymeleaf-3.1.0
Bump org.springframework.boot:spring-boot-starter-thymeleaf from 3.0.6 to 3.1.0
2023-06-01 10:50:22 +01:00
dependabot[bot]
79936e69c5 Bump org.springframework.boot from 3.0.6 to 3.1.0
Bumps [org.springframework.boot](https://github.com/spring-projects/spring-boot) from 3.0.6 to 3.1.0.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.0.6...v3.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 09:49:33 +00:00
dependabot[bot]
a19cd327f3 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.0.6 to 3.1.0.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.0.6...v3.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 09:49:26 +00:00
Anthony Stirling
5c831c156b Merge pull request #203 from Frooodle/dependabot/gradle/org.springframework.boot-spring-boot-starter-web-3.1.0
Bump org.springframework.boot:spring-boot-starter-web from 3.0.6 to 3.1.0
2023-06-01 10:48:55 +01:00
Anthony Stirling
602df08df5 Merge branch 'main' into dependabot/gradle/org.springframework.boot-spring-boot-starter-web-3.1.0 2023-06-01 10:48:04 +01:00
Anthony Stirling
3b8d06a9e3 Merge pull request #222 from MarcO-79/patch-14
Update messages_pl_PL.properties
2023-06-01 07:40:45 +01:00
Marcin Bielicki
5fd43b50e0 Update messages_pl_PL.properties
Adjusting the translation to the new version
2023-06-01 08:00:39 +02:00
Anthony Stirling
15d39413f3 scaled changes 2023-05-31 21:33:45 +01:00
systo
5e01946981 Merge branch 'main' of git@github.com:Frooodle/Stirling-PDF.git into main 2023-05-31 21:28:15 +01:00
Anthony Stirling
576d11f09a Download cleanup 2023-05-31 21:28:05 +01:00
Anthony Stirling
a43c296eef Merge pull request #221 from LaserKaspar/main
Scale Pages
2023-05-31 21:27:32 +01:00
Felix Kaspar
6015591e34 Language 2023-05-31 21:44:59 +02:00
Felix Kaspar
6f5f031b24 Scale Pages 2023-05-31 21:39:40 +02:00
Anthony Stirling
1499e78795 GeneralUtils 2023-05-31 20:37:13 +01:00
Anthony Stirling
1b45ab7222 util move around 2023-05-31 20:15:48 +01:00
Anthony Stirling
005b158ad3 naming fix 2023-05-31 18:44:32 +01:00
Anthony Stirling
26d003e840 css fix 2023-05-31 00:17:48 +01:00
Anthony Stirling
192fb39302 new error display logic init 2023-05-31 00:06:35 +01:00
dependabot[bot]
1650dfcc29 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.0.6 to 3.1.0.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v3.0.6...v3.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-30 19:55:06 +00:00
Anthony Stirling
fda83c4c1d password fix init 2023-05-30 20:54:19 +01:00
systo
1a6ebbb8e5 Merge branch 'main' of git@github.com:Frooodle/Stirling-PDF.git into main 2023-05-30 19:46:09 +01:00
Anthony Stirling
ea1f8912b8 cert change remove requirement for para,s. pdf-to-img dpi fix 2023-05-30 19:45:51 +01:00
Anthony Stirling
a5885d2628 Merge pull request #218 from blairw/patch-1
Update LocalRunGuide.md
2023-05-29 23:27:57 +01:00
Blair Wang
716d4c6f28 Update LocalRunGuide.md
Correct small typo (`/build/libs/` does not exist, `./build/libs/` does)
2023-05-30 08:15:26 +10:00
Anthony Stirling
b3a36c82bb Merge pull request #215 from MarcO-79/patch-13
Update messages_pl_PL.properties
2023-05-29 14:02:43 +01:00
Marcin Bielicki
75fff1d52f Update messages_pl_PL.properties
Adjusting the translation to the new version
2023-05-29 13:34:20 +02:00
Anthony Stirling
2d88987cb3 Multi page layout init for #212 2023-05-27 14:23:25 +01:00
Anthony Stirling
8bbbdbd359 duplex 2023-05-26 23:53:11 +01:00
systo
8a2aa44de8 Merge branch 'main' of git@github.com:Frooodle/Stirling-PDF.git into main 2023-05-26 19:30:06 +01:00
Anthony Stirling
3715c555d3 fix for #213 2023-05-26 15:25:18 +01:00
Anthony Stirling
5e4de6cc5f some filename fixes for nicer extraction 2023-05-26 14:39:08 +01:00
Anthony Stirling
4cadfc64f6 Merge pull request #211 from itsfks/main
Adição tradução PT_BR
2023-05-26 10:15:35 +01:00
felipe
a3f0d47cad Adição tradução PT_BR 2023-05-25 20:49:04 -03:00
Anthony Stirling
bc55b5fdda Merge pull request #208 from MarcO-79/patch-12
Update messages_pl_PL.properties
2023-05-23 11:29:20 +01:00
Marcin Bielicki
43474712eb Update messages_pl_PL.properties
Corrections to the translation
2023-05-23 12:02:37 +02:00
Anthony Stirling
bf48cbb89c Update README.md 2023-05-22 20:43:24 +01:00
Anthony Stirling
c50d8e216a Merge pull request #202 from Frooodle/compress
Fixes for split photo scans
2023-05-22 20:37:55 +01:00
Anthony Stirling
8c160bcddf version bump 2023-05-22 20:33:10 +01:00
Anthony Stirling
6fd6aa2733 fixes to split photos 2023-05-22 20:32:50 +01:00
Anthony Stirling
d7431c459d Merge pull request #200 from ButaNicolae/Romanian-language-and-fixes
Romanian language and fixes
2023-05-22 20:25:51 +01:00
Anthony Stirling
464a11cd69 Merge branch 'main' into Romanian-language-and-fixes 2023-05-22 20:22:37 +01:00
Anthony Stirling
154535a7b1 Merge pull request #201 from Alanimdeo/ko_KR
Add Korean translation
2023-05-22 20:14:38 +01:00
Alanimdeo
f379a759bb Add Korean translation 2023-05-23 00:57:48 +09:00
Nicolae Buta
8cbd7eafb8 required select one language on ocr-pdf 2023-05-22 18:28:16 +03:00
Nicolae Buta
6fb304d010 Detect/Split Scanned photos fixes 2023-05-22 18:27:46 +03:00
Nicolae Buta
089b2290bd blank page path problem fixed 2023-05-22 18:26:29 +03:00
Nicolae Buta
c4e5bfdabb added language Romanian and dosplay u/notpdates button ? 2023-05-22 18:25:58 +03:00
Nicolae Buta
9d5cb104c3 fixed zip on ocr-pdf 2023-05-22 18:25:23 +03:00
Nicolae Buta
d577b8b34e added language Romanian and dosplay u/notpdates button ? 2023-05-22 18:24:55 +03:00
Anthony Stirling
6219cd1d86 Update cert-sign.html 2023-05-22 15:44:45 +01:00
Anthony Stirling
dfd1ac7e99 Merge pull request #197 from wrongecho/patch-1
Update README.md - typo
2023-05-22 09:21:53 +01:00
Anthony Stirling
e3838b291f Merge branch 'main' into patch-1 2023-05-22 08:46:30 +01:00
Anthony Stirling
04a073c7cf Merge pull request #198 from MarcO-79/patch-11
Update messages_pl_PL.properties
2023-05-22 08:46:21 +01:00
Marcin Bielicki
04d5c60957 Update messages_pl_PL.properties
Adjusting the translation to the new version
2023-05-22 08:22:42 +02:00
wrongecho
2be6cad7e1 Update README.md
Correct typo in readme
2023-05-22 06:50:37 +01:00
Anthony Stirling
b44e036be3 Merge pull request #196 from Frooodle/compress
Compress abd cert sign
2023-05-21 23:29:21 +01:00
Anthony Stirling
7ac6e9d37b Update build.gradle 2023-05-21 23:27:59 +01:00
Anthony Stirling
6854e96fb8 cahnges 2023-05-21 23:25:34 +01:00
Anthony Stirling
2df3a386ad Merge remote-tracking branch 'origin/main' into compress 2023-05-21 17:13:53 +01:00
Anthony Stirling
187b47eddd cleanups 2023-05-21 17:12:18 +01:00
Anthony Stirling
763aeb5fae further sign stuff 2023-05-21 12:32:24 +01:00
Anthony Stirling
3cad43006a compress finalise, cert test, locale test 2023-05-20 22:48:59 +01:00
Anthony Stirling
8e4cdb78a0 Update LICENSE 2023-05-20 21:01:33 +01:00
Anthony Stirling
9d80458250 as 2023-05-19 23:58:54 +01:00
Anthony Stirling
d601c2ae64 Update README.md 2023-05-19 23:34:50 +01:00
Anthony Stirling
87cd6dfb54 compress 2023-05-19 20:43:30 +01:00
Anthony Stirling
3dea1b3d7c Merge pull request #194 from Frooodle/Sf298-patch-1
Missed a part in FAQ fixes
2023-05-19 13:52:19 +01:00
Saud Fatayerji
f882c166cd Missed a bit 2023-05-19 15:27:06 +03:00
Anthony Stirling
9be0acd75b Merge pull request #193 from Frooodle/cropping
Fixed language of FAQ
2023-05-19 13:21:03 +01:00
Saud Fatayerji
0901683880 Merge branch 'main' into signCrop 2023-05-19 15:13:51 +03:00
Anthony Stirling
216f3045db Merge pull request #189 from NeilJared/patch-2
Update messages_es_ES.properties
2023-05-19 11:54:20 +01:00
NeilJared
ce544adb62 Merge branch 'main' into patch-2 2023-05-19 10:18:25 +02:00
Anthony Stirling
107d299822 Merge pull request #192 from MarcO-79/patch-10
Update messages_pl_PL.properties
2023-05-19 08:10:00 +01:00
Marcin Bielicki
d577a34135 Update messages_pl_PL.properties
Corrections to the translation
2023-05-19 08:23:25 +02:00
Anthony Stirling
394c3412e5 Update README.md 2023-05-19 00:32:37 +01:00
NeilJared
b53920ddc5 Update messages_es_ES.properties
Updated es-ES translation
2023-05-19 00:33:26 +02:00
191 changed files with 22634 additions and 7844 deletions

View File

@@ -8,7 +8,6 @@ on:
- main - main
jobs: jobs:
push: push:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
@@ -46,13 +45,17 @@ jobs:
username: ${{ github.actor }} username: ${{ github.actor }}
password: ${{ github.token }} password: ${{ github.token }}
- name: Convert repository owner to lowercase
id: repoowner
run: echo "::set-output name=lowercase::$(echo ${{ github.repository_owner }} | awk '{print tolower($0)}')"
- name: Generate tags - name: Generate tags
id: meta id: meta
uses: docker/metadata-action@v4.4.0 uses: docker/metadata-action@v4.4.0
with: with:
images: | images: |
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf ${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
ghcr.io/${{ github.repository_owner }}/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' }}
@@ -76,27 +79,27 @@ jobs:
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
platforms: linux/amd64,linux/arm64/v8 platforms: linux/amd64,linux/arm64/v8
- name: Generate tags
- name: Generate tags ultra-lite
id: meta2 id: meta2
uses: docker/metadata-action@v4.4.0 uses: docker/metadata-action@v4.4.0
if: github.ref != 'refs/heads/main'
with: with:
images: | images: |
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf ${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
ghcr.io/${{ github.repository_owner }}/s-pdf ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf
tags: | tags: |
type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}-ultra-light,enable=${{ github.ref == 'refs/heads/master' }} type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}-ultra-lite,enable=${{ github.ref == 'refs/heads/master' }}
type=raw,value=latest-ultra-light,enable=${{ github.ref == 'refs/heads/master' }} type=raw,value=latest-ultra-lite,enable=${{ github.ref == 'refs/heads/master' }}
type=raw,value=alpha-ultra-light,enable=${{ github.ref == 'refs/heads/main' }}
- name: Convert repository owner to lowercase
id: repoowner
run: echo "::set-output name=lowercase::$(echo ${{ github.repository_owner }} | awk '{print tolower($0)}')"
- name: Build and push Dockerfile-ultralite - name: Build and push Dockerfile-ultra-lite
uses: docker/build-push-action@v4.0.0 uses: docker/build-push-action@v4.0.0
if: github.ref != 'refs/heads/main'
with: with:
context: . context: .
file: ./Dockerfile-ultralite file: ./Dockerfile-ultra-lite
push: true push: true
cache-from: type=gha cache-from: type=gha
cache-to: type=gha,mode=max cache-to: type=gha,mode=max
@@ -105,3 +108,29 @@ jobs:
platforms: linux/amd64,linux/arm64/v8 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 }}
platforms: linux/amd64,linux/arm64/v8

45
.github/workflows/releaseArtifacts.yml vendored Normal file
View File

@@ -0,0 +1,45 @@
name: Release Artifacts
on:
release:
types: [created]
jobs:
push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3.5.2
- name: Set up JDK 17
uses: actions/setup-java@v3.11.0
with:
java-version: '17'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Generate jar
run: ./gradlew clean createExe
- name: Upload binaries to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ./build/launch4j/Stirling-PDF.exe
asset_name: Stirling-PDF.exe
tag: ${{ github.ref }}
overwrite: true
- name: Get version number
id: versionNumber
run: echo "::set-output name=versionNumber::$(./gradlew printVersion --quiet | tail -1)"
- name: Upload binaries to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ./build/libs/Stirling-PDF-${{ steps.versionNumber.outputs.versionNumber }}.jar
asset_name: Stirling-PDF.jar
tag: ${{ github.ref }}
overwrite: true

37
.github/workflows/swagger.yml vendored Normal file
View File

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

8
.gitignore vendored
View File

@@ -14,6 +14,14 @@ local.properties
.recommenders .recommenders
.classpath .classpath
.project .project
version.properties
pipeline/
#### Stirling-PDF Files ###
customFiles/
config/
watchedFolders/
# Gradle # Gradle
.gradle .gradle

View File

@@ -1,10 +1,16 @@
# Build jbig2enc in a separate stage # Build jbig2enc in a separate stage
FROM frooodle/stirling-pdf-base:beta2 FROM frooodle/stirling-pdf-base:beta4
# Create scripts folder and copy local scripts # Create scripts folder and copy local scripts
RUN mkdir /scripts RUN mkdir /scripts
COPY ./scripts/* /scripts/ COPY ./scripts/* /scripts/
#Install fonts
RUN mkdir /usr/share/fonts/opentype/noto/
COPY src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/
COPY src/main/resources/static/fonts/*.otf /usr/share/fonts/opentype/noto/
RUN fc-cache -f -v
# Copy the application JAR file # Copy the application JAR file
COPY build/libs/*.jar app.jar COPY build/libs/*.jar app.jar

29
Dockerfile-lite Normal file
View File

@@ -0,0 +1,29 @@
# Build jbig2enc in a separate stage
FROM bellsoft/liberica-openjdk-debian:17
RUN apt-get update && \
apt-get install -y --no-install-recommends \
libreoffice-core-nogui \
libreoffice-common \
libreoffice-writer-nogui \
libreoffice-calc-nogui \
libreoffice-impress-nogui \
unoconv && \
rm -rf /var/lib/apt/lists/*
#Install fonts
RUN mkdir /usr/share/fonts/opentype/noto/
COPY src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/
COPY src/main/resources/static/fonts/*.otf /usr/share/fonts/opentype/noto/
RUN fc-cache -f -v
# Copy the application JAR file
COPY build/libs/*.jar app.jar
# Expose the application port
EXPOSE 8080
# Set environment variables
ENV GROUPS_TO_REMOVE=Python,OpenCV,OCRmyPDF
# Run the application
CMD ["java", "-jar", "/app.jar"]

View File

@@ -1,5 +1,5 @@
# Build jbig2enc in a separate stage # Build jbig2enc in a separate stage
FROM openjdk:17-jdk-slim FROM bellsoft/liberica-openjdk-alpine:17
# Copy the application JAR file # Copy the application JAR file
COPY build/libs/*.jar app.jar COPY build/libs/*.jar app.jar
@@ -8,7 +8,7 @@ COPY build/libs/*.jar app.jar
EXPOSE 8080 EXPOSE 8080
# Set environment variables # Set environment variables
ENV GROUPS_TO_REMOVE=LibreOffice,CLI ENV GROUPS_TO_REMOVE=CLI
# Run the application # Run the application
CMD ["java", "-jar", "/app.jar"] CMD ["java", "-jar", "/app.jar"]

View File

@@ -1,29 +1,5 @@
# Build jbig2enc in a separate stage
FROM debian:bullseye-slim as jbig2enc_builder
RUN apt-get update && \
apt-get install -y --no-install-recommends \
git \
automake \
autoconf \
libtool \
libleptonica-dev \
pkg-config \
ca-certificates \
zlib1g-dev \
make \
g++
RUN git clone https://github.com/agl/jbig2enc && \
cd jbig2enc && \
./autogen.sh && \
./configure && \
make && \
make install
# Main stage # Main stage
FROM openjdk:17-jdk-slim AS base FROM bellsoft/liberica-openjdk-debian:17 AS base
RUN apt-get update && \ RUN apt-get update && \
apt-get install -y --no-install-recommends \ apt-get install -y --no-install-recommends \
libreoffice-core-nogui \ libreoffice-core-nogui \
@@ -53,10 +29,9 @@ RUN apt-get update && \
libjpeg-dev && \ libjpeg-dev && \
pip install --upgrade pip && \ pip install --upgrade pip && \
pip install --no-cache-dir \ pip install --no-cache-dir \
opencv-python-headless && \ opencv-python-headless WeasyPrint && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
# Final stage: Copy necessary files from the previous stage # Final stage: Copy necessary files from the previous stage
FROM base FROM base
COPY --from=python-packages /usr/local /usr/local COPY --from=python-packages /usr/local /usr/local
COPY --from=jbig2enc_builder /usr/local/bin/jbig2 /usr/local/bin/jbig2

41
Endpoint-groups.md Normal file
View File

@@ -0,0 +1,41 @@
| Operation | PageOps | Convert | Security | Other | CLI | Python | OpenCV | LibreOffice | OCRmyPDF | Java | Javascript |
|---------------------|---------|---------|----------|-------|------|--------|--------|-------------|----------|----------|------------|
| adjust-contrast | ✔️ | | | | | | | | | | ✔️ |
| auto-split-pdf | ✔️ | | | | | | | | | ✔️ | |
| crop | ✔️ | | | | | | | | | ✔️ | |
| merge-pdfs | ✔️ | | | | | | | | | ✔️ | |
| multi-page-layout | ✔️ | | | | | | | | | ✔️ | |
| pdf-organizer | ✔️ | | | | | | | | | ✔️ | ✔️ |
| remove-pages | ✔️ | | | | | | | | | ✔️ | |
| rotate-pdf | ✔️ | | | | | | | | | ✔️ | |
| scale-pages | ✔️ | | | | | | | | | ✔️ | |
| split-pdfs | ✔️ | | | | | | | | | ✔️ | |
| file-to-pdf | | ✔️ | | | ✔️ | | | ✔️ | | | |
| img-to-pdf | | ✔️ | | | | | | | | ✔️ | |
| pdf-to-html | | ✔️ | | | ✔️ | | | ✔️ | | | |
| pdf-to-img | | ✔️ | | | | | | | | ✔️ | |
| pdf-to-pdfa | | ✔️ | | | ✔️ | | | | ✔️ | | |
| pdf-to-presentation | | ✔️ | | | ✔️ | | | ✔️ | | | |
| pdf-to-text | | ✔️ | | | ✔️ | | | ✔️ | | | |
| pdf-to-word | | ✔️ | | | ✔️ | | | ✔️ | | | |
| pdf-to-xml | | ✔️ | | | ✔️ | | | ✔️ | | | |
| xlsx-to-pdf | | ✔️ | | | ✔️ | | | ✔️ | | | |
| add-password | | | ✔️ | | | | | | | ✔️ | |
| add-watermark | | | ✔️ | | | | | | | ✔️ | |
| cert-sign | | | ✔️ | | | | | | | ✔️ | |
| change-permissions | | | ✔️ | | | | | | | ✔️ | |
| remove-password | | | ✔️ | | | | | | | ✔️ | |
| sanitize-pdf | | | ✔️ | | | | | | | ✔️ | |
| add-image | | | | ✔️ | | | | | | ✔️ | |
| add-page-numbers | | | | ✔️ | | | | | | ✔️ | |
| auto-rename | | | | ✔️ | | | | | | ✔️ | |
| change-metadata | | | | ✔️ | | | | | | ✔️ | |
| compare | | | | ✔️ | | | | | | | ✔️ |
| compress-pdf | | | | ✔️ | ✔️ | | | | ✔️ | | |
| extract-image-scans | | | | ✔️ | ✔️ | ✔️ | ✔️ | | | | |
| extract-images | | | | ✔️ | | | | | | ✔️ | |
| flatten | | | | ✔️ | | | | | | | |
| ocr-pdf | | | | ✔️ | ✔️ | | | | ✔️ | | |
| remove-blanks | | | | ✔️ | ✔️ | ✔️ | ✔️ | | | | |
| repair | | | | ✔️ | ✔️ | | | ✔️ | | | |
| sign | | | | ✔️ | | | | | | | ✔️ |

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.
## How does the OCR Work ## How does the OCR Work
Stirling-PDF uses 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.
All credit goes to them for this awesome work! All credit goes to them for this awesome work!
## Language Packs ## Language Packs

811
LICENSE
View File

@@ -1,201 +1,674 @@
Apache License GNU GENERAL PUBLIC LICENSE
Version 2.0, January 2004 Version 3, 29 June 2007
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
1. Definitions. Preamble
"License" shall mean the terms and conditions for use, reproduction, The GNU General Public License is a free, copyleft license for
and distribution as defined by Sections 1 through 9 of this document. software and other kinds of works.
"Licensor" shall mean the copyright owner or entity authorized by The licenses for most software and other practical works are designed
the copyright owner that is granting the License. to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
"Legal Entity" shall mean the union of the acting entity and all When we speak of free software, we are referring to freedom, not
other entities that control, are controlled by, or are under common price. Our General Public Licenses are designed to make sure that you
control with that entity. For the purposes of this definition, have the freedom to distribute copies of free software (and charge for
"control" means (i) the power, direct or indirect, to cause the them if you wish), that you receive source code or can get it if you
direction or management of such entity, whether by contract or want it, that you can change the software or use pieces of it in new
otherwise, or (ii) ownership of fifty percent (50%) or more of the free programs, and that you know you can do these things.
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity To protect your rights, we need to prevent others from denying you
exercising permissions granted by this License. these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
"Source" form shall mean the preferred form for making modifications, For example, if you distribute copies of such a program, whether
including but not limited to software source code, documentation gratis or for a fee, you must pass on to the recipients the same
source, and configuration files. freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
"Object" form shall mean any form resulting from mechanical Developers that use the GNU GPL protect your rights with two steps:
transformation or translation of a Source form, including but (1) assert copyright on the software, and (2) offer you this License
not limited to compiled object code, generated documentation, giving you legal permission to copy, distribute and/or modify it.
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or For the developers' and authors' protection, the GPL clearly explains
Object form, made available under the License, as indicated by a that there is no warranty for this free software. For both users' and
copyright notice that is included in or attached to the work authors' sake, the GPL requires that modified versions be marked as
(an example is provided in the Appendix below). changed, so that their problems will not be attributed erroneously to
authors of previous versions.
"Derivative Works" shall mean any work, whether in Source or Object Some devices are designed to deny users access to install or run
form, that is based on (or derived from) the Work and for which the modified versions of the software inside them, although the manufacturer
editorial revisions, annotations, elaborations, or other modifications can do so. This is fundamentally incompatible with the aim of
represent, as a whole, an original work of authorship. For the purposes protecting users' freedom to change the software. The systematic
of this License, Derivative Works shall not include works that remain pattern of such abuse occurs in the area of products for individuals to
separable from, or merely link (or bind by name) to the interfaces of, use, which is precisely where it is most unacceptable. Therefore, we
the Work and Derivative Works thereof. have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
"Contribution" shall mean any work of authorship, including Finally, every program is threatened constantly by software patents.
the original version of the Work and any modifications or additions States should not allow patents to restrict development and use of
to that Work or Derivative Works thereof, that is intentionally software on general-purpose computers, but in those that do, we wish to
submitted to Licensor for inclusion in the Work by the copyright owner avoid the special danger that patents applied to a free program could
or by an individual or Legal Entity authorized to submit on behalf of make it effectively proprietary. To prevent this, the GPL assures that
the copyright owner. For the purposes of this definition, "submitted" patents cannot be used to render the program non-free.
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity The precise terms and conditions for copying, distribution and
on behalf of whom a Contribution has been received by Licensor and modification follow.
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of TERMS AND CONDITIONS
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of 0. Definitions.
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the "This License" refers to version 3 of the GNU General Public License.
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or "Copyright" also means copyright-like laws that apply to other kinds of
Derivative Works a copy of this License; and works, such as semiconductor masks.
(b) You must cause any modified files to carry prominent notices "The Program" refers to any copyrightable work licensed under this
stating that You changed the files; and License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
(c) You must retain, in the Source form of any Derivative Works To "modify" a work means to copy from or adapt all or part of the work
that You distribute, all copyright, patent, trademark, and in a fashion requiring copyright permission, other than the making of an
attribution notices from the Source form of the Work, exact copy. The resulting work is called a "modified version" of the
excluding those notices that do not pertain to any part of earlier work or a work "based on" the earlier work.
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its A "covered work" means either the unmodified Program or a work based
distribution, then any Derivative Works that You distribute must on the Program.
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and To "propagate" a work means to do anything with it that, without
may provide additional or different license terms and conditions permission, would make you directly or secondarily liable for
for use, reproduction, or distribution of Your modifications, or infringement under applicable copyright law, except executing it on a
for any such Derivative Works as a whole, provided Your use, computer or modifying a private copy. Propagation includes copying,
reproduction, and distribution of the Work otherwise complies with distribution (with or without modification), making available to the
the conditions stated in this License. public, and in some countries other activities as well.
5. Submission of Contributions. Unless You explicitly state otherwise, To "convey" a work means any kind of propagation that enables other
any Contribution intentionally submitted for inclusion in the Work parties to make or receive copies. Mere interaction with a user through
by You to the Licensor shall be under the terms and conditions of a computer network, with no transfer of a copy, is not conveying.
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade An interactive user interface displays "Appropriate Legal Notices"
names, trademarks, service marks, or product names of the Licensor, to the extent that it includes a convenient and prominently visible
except as required for reasonable and customary use in describing the feature that (1) displays an appropriate copyright notice, and (2)
origin of the Work and reproducing the content of the NOTICE file. tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
7. Disclaimer of Warranty. Unless required by applicable law or 1. Source Code.
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory, The "source code" for a work means the preferred form of the work
whether in tort (including negligence), contract, or otherwise, for making modifications to it. "Object code" means any non-source
unless required by applicable law (such as deliberate and grossly form of a work.
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing A "Standard Interface" means an interface that either is an official
the Work or Derivative Works thereof, You may choose to offer, standard defined by a recognized standards body, or, in the case of
and charge a fee for, acceptance of support, warranty, indemnity, interfaces specified for a particular programming language, one that
or other liability obligations and/or rights consistent with this is widely used among developers working in that language.
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
APPENDIX: How to apply the Apache License to your work. The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
To apply the Apache License to your work, attach the following The Corresponding Source need not include anything that users
boilerplate notice, with the fields enclosed by brackets "[]" can regenerate automatically from other parts of the Corresponding
replaced with your own identifying information. (Don't include Source.
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner] The Corresponding Source for a work in source code form is that
same work.
Licensed under the Apache License, Version 2.0 (the "License"); 2. Basic Permissions.
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
Unless required by applicable law or agreed to in writing, software You may make, run and propagate covered works that you do not
distributed under the License is distributed on an "AS IS" BASIS, convey, without conditions so long as your license otherwise remains
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. in force. You may convey covered works to others for the sole purpose
See the License for the specific language governing permissions and of having them make modifications exclusively for you, or provide you
limitations under the License. with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

View File

@@ -123,7 +123,7 @@ This folder is required for the python scripts using OpenCV
```bash ```bash
sudo mkdir /opt/Stirling-PDF &&\ sudo mkdir /opt/Stirling-PDF &&\
sudo mv /build/libs/S-PDF-*.jar /opt/Stirling-PDF/ &&\ sudo mv ./build/libs/Stirling-PDF-*.jar /opt/Stirling-PDF/ &&\
sudo mv scripts /opt/Stirling-PDF/ &&\ sudo mv scripts /opt/Stirling-PDF/ &&\
echo "Scripts installed." echo "Scripts installed."
``` ```

View File

@@ -10,7 +10,7 @@
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 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.
Stirling PDF makes no outbount calls for any record keeping or tracking. Stirling PDF makes no outbound calls for any record keeping or tracking.
All files and PDFs are either purely client side, in server memory only during the execution of the task or within a temporay file only for execution of the task. All files and PDFs are either purely client side, in server memory only during the execution of the task or within a temporay file only for execution of the task.
Any file which has been downloaded by the user will have already been deleted from the server by that time. Any file which has been downloaded by the user will have already been deleted from the server by that time.
@@ -21,7 +21,7 @@ Feel free to request any features or bug fixes either in github issues or our [D
![stirling-home](images/stirling-home.png) ![stirling-home](images/stirling-home.png)
## Features ## Features
- Full intractable GUI for merging/splitting/rotating/moving PDFs and their pages. - Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages.
- Split PDFs into multiple files at specified page numbers or extract all pages as individual files. - Split PDFs into multiple files at specified page numbers or extract all pages as individual files.
- Merge multiple PDFs together into a single resultant file - Merge multiple PDFs together into a single resultant file
- Convert PDFs to and from images - Convert PDFs to and from images
@@ -53,6 +53,7 @@ Hosted instance/demo of the app can be seen [here](https://pdf.adminforge.de/) h
## Technologies used ## Technologies used
- Spring Boot + Thymeleaf - Spring Boot + Thymeleaf
- PDFBox - PDFBox
- IText7
- [LibreOffice](https://www.libreoffice.org/discover/libreoffice/) for advanced conversions - [LibreOffice](https://www.libreoffice.org/discover/libreoffice/) for advanced conversions
- [OcrMyPdf](https://github.com/ocrmypdf/OCRmyPDF) - [OcrMyPdf](https://github.com/ocrmypdf/OCRmyPDF)
- HTML, CSS, JavaScript - HTML, CSS, JavaScript
@@ -68,16 +69,25 @@ Please view https://github.com/Frooodle/Stirling-PDF/blob/main/LocalRunGuide.md
### Docker ### Docker
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.
To see what the different versions offer please look at our [version mapping](https://github.com/Frooodle/Stirling-PDF/blob/main/Version-groups.md)
For people that dont mind about space optimisation just use 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-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 Run Docker Run
``` ```
docker run -d \ docker run -d \
-p 8080:8080 \ -p 8080:8080 \
-v /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata \ -v /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata \
--name stirling-pdf \ --name stirling-pdf \
frooodle/s-pdf frooodle/s-pdf:latest
Can also add these for customisation but are not required Can also add these for customisation but are not required
-v /location/of/extraConfigs:/configs \
-v /location/of/customFiles:/customFiles \
-e APP_HOME_NAME="Stirling PDF" \ -e APP_HOME_NAME="Stirling PDF" \
-e APP_HOME_DESCRIPTION="Your locally hosted one-stop-shop for all your PDF needs." \ -e APP_HOME_DESCRIPTION="Your locally hosted one-stop-shop for all your PDF needs." \
-e APP_NAVBAR_NAME="Stirling PDF" \ -e APP_NAVBAR_NAME="Stirling PDF" \
@@ -90,12 +100,13 @@ Docker Compose
version: '3.3' version: '3.3'
services: services:
stirling-pdf: stirling-pdf:
image: frooodle/s-pdf image: frooodle/s-pdf:latest
ports: ports:
- '8080:8080' - '8080:8080'
volumes: volumes:
- /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata #Required for extra OCR languages - /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata #Required for extra OCR languages
# - /location/of/extraConfigs:/configs # - /location/of/extraConfigs:/configs
# - /location/of/customFiles:/customFiles/
# environment: # environment:
# APP_LOCALE: en_GB # APP_LOCALE: en_GB
# APP_HOME_NAME: Stirling PDF # APP_HOME_NAME: Stirling PDF
@@ -111,17 +122,23 @@ services:
Please view https://github.com/Frooodle/Stirling-PDF/blob/main/HowToUseOCR.md Please view https://github.com/Frooodle/Stirling-PDF/blob/main/HowToUseOCR.md
## Want to add your own language? ## Want to add your own language?
Stirling PDF currently supports Stirling PDF currently supports 16!
- English (English) (en_GB) - English (English) (en_GB)
- Arabic (العربية) (ar_AR) - Arabic (العربية) (ar_AR)
- German (Deutsch) (de_DE) - German (Deutsch) (de_DE)
- French (Français) (fr_FR) - French (Français) (fr_FR)
- Spanish (Español) (es_ES) - Spanish (Español) (es_ES)
- Chinese (简体中文) (it_IT) - Chinese (简体中文) (zh_CN)
- Catalan (Català) (zh_CN) - Catalan (Català) (ca_CA)
- Italian (Italiano) (ca_CA) - Italian (Italiano) (it_IT)
- Swedish (Svenska) (sv_SE) - Swedish (Svenska) (sv_SE)
- Polish (Polski) (pl_PL) - Polish (Polski) (pl_PL)
- Romanian (Română) (ro_RO)
- Korean (한국어) (ko_KR)
- Portuguese Brazilian (Português) (pt_BR)
- Russian (Русский) (ru_RU)
- Basque (Euskara) (eu_ES)
- Japanese (日本語) (ja_JP)
If you want to add your own language to Stirling-PDF please refer If you want to add your own language to Stirling-PDF please refer
https://github.com/Frooodle/Stirling-PDF/blob/main/HowToAddNewLanguage.md https://github.com/Frooodle/Stirling-PDF/blob/main/HowToAddNewLanguage.md
@@ -145,30 +162,30 @@ Using the same method you can also change
- The default language by providing APP_LOCALE with values like de-DE fr-FR or ar-AR (Note the - character not _ ) to select your default language (Will always default to English on invalid locale) Current accepted locales can be seen above in the Want to add your own language section - The default language by providing APP_LOCALE with values like de-DE fr-FR or ar-AR (Note the - character not _ ) to select your default language (Will always default to English on invalid locale) Current accepted locales can be seen above in the Want to add your own language section
- Enable/Disable search engine visiblility with ALLOW_GOOGLE_VISIBILITY with true / false values. Default disable visiblility. - Enable/Disable search engine visiblility with ALLOW_GOOGLE_VISIBILITY with true / false values. Default disable visiblility.
- Change root URI for Stirling-PDF ie change server.com/ to server.com/pdf-app by running APP_ROOT_PATH as pdf-app - Change root URI for Stirling-PDF ie change server.com/ to server.com/pdf-app by running APP_ROOT_PATH as pdf-app
- Disable and remove endpoints and functionality from Stirling-PDF. Currently the endpoints ENDPOINTS_TO_REMOVE and GROUPS_TO_REMOVE can include comma seperated 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/Frooodle/Stirling-PDF/blob/main/Groups.md) - Disable and remove endpoints and functionality from Stirling-PDF. Currently the endpoints ENDPOINTS_TO_REMOVE and GROUPS_TO_REMOVE can include comma seperated 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/Frooodle/Stirling-PDF/blob/main/groups.md)
- Change the max file size allowed through the server with the environment variable MAX_FILE_SIZE. default 2000MB
- Customise static files such as app logo by placing files in the /customFiles/static/ directory. Example to customise 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
## 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/Frooodle/Stirling-PDF/) or navigate to /swagger-ui/index.html of your stirling-pdf instance for your versions documentation [here](https://app.swaggerhub.com/apis-docs/Frooodle/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)
## FAQ ## FAQ
### Q1: Where is the authentication for Stirling PDF ### Q1: Can you add authentication in Stirling PDF?
There is no Auth within Stirling PDF and there is none planned. This feature will not be added. Instead its recommended to use trusted and secure auth software like Authentik or Authelia. There is no Auth within Stirling PDF and there is none planned. This feature will not be added. Instead we recommended you use trusted and secure authentication software like Authentik or Authelia.
### Q2: What are your planned features ### Q2: What are your planned features?
- Crop - Crop
- Progress bar/Tracking - Progress bar/Tracking
- Annotations (Sign/draw logic directly on page)
- 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
- Redact text - Redact sections of pages
- Add page numbers - Add page numbers
- Auto rename (Renames file based on file title text) - Auto rename (Renames file based on file title text)
- URL to PDF - URL to PDF
- Change contrast - Change contrast
### Q3: Why is my application download .htm files ### Q3: Why is my application downloading .htm files?
This is a issue caused commonly by your NGINX congifuration. 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 a issue caused commonly by your NGINX congifuration. 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.

54
Version-groups.md Normal file
View File

@@ -0,0 +1,54 @@
|Technology | Ultra-Lite | Lite | Full |
|----------------|:----------:|:----:|:----:|
| Java | ✔️ | ✔️ | ✔️ |
| JavaScript | ✔️ | ✔️ | ✔️ |
| Libre | | ✔️ | ✔️ |
| Python | | | ✔️ |
| OpenCV | | | ✔️ |
| OCRmyPDF | | | ✔️ |
Operation | Ultra-Lite | Lite | Full
--------------------|------------|------|-----
add-page-numbers | ✔️ | ✔️ | ✔️
add-password | ✔️ | ✔️ | ✔️
add-watermark | ✔️ | ✔️ | ✔️
adjust-contrast | ✔️ | ✔️ | ✔️
auto-split-pdf | ✔️ | ✔️ | ✔️
auto-rename | ✔️ | ✔️ | ✔️
cert-sign | ✔️ | ✔️ | ✔️
crop | ✔️ | ✔️ | ✔️
change-metadata | ✔️ | ✔️ | ✔️
change-permissions | ✔️ | ✔️ | ✔️
compare | ✔️ | ✔️ | ✔️
extract-images | ✔️ | ✔️ | ✔️
flatten | ✔️ | ✔️ | ✔️
img-to-pdf | ✔️ | ✔️ | ✔️
merge-pdfs | ✔️ | ✔️ | ✔️
multi-page-layout | ✔️ | ✔️ | ✔️
pdf-organizer | ✔️ | ✔️ | ✔️
pdf-to-img | ✔️ | ✔️ | ✔️
remove-pages | ✔️ | ✔️ | ✔️
remove-password | ✔️ | ✔️ | ✔️
rotate-pdf | ✔️ | ✔️ | ✔️
sanitize-pdf | ✔️ | ✔️ | ✔️
scale-pages | ✔️ | ✔️ | ✔️
sign | ✔️ | ✔️ | ✔️
split-pdfs | ✔️ | ✔️ | ✔️
add-image | ✔️ | ✔️ | ✔️
file-to-pdf | | ✔️ | ✔️
pdf-to-html | | ✔️ | ✔️
pdf-to-presentation | | ✔️ | ✔️
pdf-to-text | | ✔️ | ✔️
pdf-to-word | | ✔️ | ✔️
pdf-to-xml | | ✔️ | ✔️
repair | | ✔️ | ✔️
xlsx-to-pdf | | ✔️ | ✔️
compress-pdf | | | ✔️
extract-image-scans | | | ✔️
ocr-pdf | | | ✔️
pdf-to-pdfa | | | ✔️
remove-blanks | | | ✔️

View File

@@ -1,38 +1,92 @@
plugins { plugins {
id 'java' id 'java'
id 'org.springframework.boot' version '3.0.6' id 'org.springframework.boot' version '3.1.1'
id 'io.spring.dependency-management' version '1.1.0' id 'io.spring.dependency-management' version '1.1.0'
id 'org.springdoc.openapi-gradle-plugin' version '1.6.0'
id "io.swagger.swaggerhub" version "1.2.0"
id 'edu.sc.seis.launch4j' version '3.0.3'
} }
group = 'stirling.software' group = 'stirling.software'
version = '0.8.3' version = '0.11.0'
sourceCompatibility = '17' sourceCompatibility = '17'
repositories { repositories {
mavenCentral() mavenCentral()
} }
openApi {
apiDocsUrl = "http://localhost:8080/v3/api-docs"
outputDir = file("$projectDir")
outputFileName = "SwaggerDoc.json"
}
launch4j {
icon = "${projectDir}/src/main/resources/static/favicon.ico"
outfile="Stirling-PDF.exe"
headerType="console"
jarTask = tasks.bootJar
errTitle="Encountered error, Do you have Java 17?"
downloadUrl="https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe"
variables=["BROWSER_OPEN=true"]
jreMinVersion="17"
mutexName="Stirling-PDF"
windowTitle="Stirling-PDF"
messagesStartupError="An error occurred while starting Stirling-PDF"
//messagesJreNotFoundError="This application requires a Java Runtime Environment, Please download Java 17."
messagesJreVersionError="You are running the wrong version of Java, Please download Java 17."
messagesLauncherError="Java is corrupted. Please uninstall and then install Java 17."
messagesInstanceAlreadyExists="Stirling-PDF is already running."
}
dependencies { dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:3.0.6' implementation 'org.springframework.boot:spring-boot-starter-web:3.1.0'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.0.6' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.1.1'
testImplementation 'org.springframework.boot:spring-boot-starter-test:3.0.6' testImplementation 'org.springframework.boot:spring-boot-starter-test:3.1.0'
// https://mvnrepository.com/artifact/org.apache.pdfbox/jbig2-imageio // https://mvnrepository.com/artifact/org.apache.pdfbox/jbig2-imageio
implementation group: 'org.apache.pdfbox', name: 'jbig2-imageio', version: '3.0.4' implementation group: 'org.apache.pdfbox', name: 'jbig2-imageio', version: '3.0.4'
implementation 'commons-io:commons-io:2.11.0' implementation 'commons-io:commons-io:2.13.0'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0'
//general PDF //general PDF
implementation 'org.apache.pdfbox:pdfbox:2.0.28' implementation 'org.apache.pdfbox:pdfbox:2.0.28'
implementation 'org.bouncycastle:bcprov-jdk15on:1.70'
implementation 'org.bouncycastle:bcpkix-jdk15on:1.70'
implementation 'com.itextpdf:itext7-core:7.2.5'
implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-core' implementation 'io.micrometer:micrometer-core'
implementation group: 'com.google.zxing', name: 'core', version: '3.5.1'
developmentOnly("org.springframework.boot:spring-boot-devtools") developmentOnly("org.springframework.boot:spring-boot-devtools")
} }
task writeVersion {
def propsFile = file('src/main/resources/version.properties')
def props = new Properties()
props.setProperty('version', version)
props.store(propsFile.newWriter(), null)
}
swaggerhubUpload {
//dependsOn generateOpenApiDocs // Depends on your task generating Swagger docs
api 'Stirling-PDF' // The name of your API on SwaggerHub
owner 'Frooodle' // Your SwaggerHub username (or organization name)
version project.version // The version of your API
inputFile './SwaggerDoc.json' // The path to your Swagger docs
token "${System.getenv('SWAGGERHUB_API_KEY')}" // Your SwaggerHub API key, passed as an environment variable
oas '3.0.0' // The version of the OpenAPI Specification you're using
}
jar { jar {
enabled = false enabled = false
manifest { manifest {

View File

@@ -1,32 +0,0 @@
Operation | PageOps | Convert | Security | Other | CLI | Python | OpenCV | LibreOffice | OCRmyPDF | Java | Javascript
--------------------|---------|---------|----------|-------|------|--------|--------|-------------|--------- |-------- |-----------
remove-pages | X | | | | | | | | | X |
merge-pdfs | X | | | | | | | | | X |
split-pdfs | X | | | | | | | | | X |
pdf-organizer | X | | | | | | | | | X | X
rotate-pdf | X | | | | | | | | | X |
pdf-to-img | | X | | | | | | | | X |
img-to-pdf | | X | | | | | | | | X |
pdf-to-pdfa | | X | | | X | | | | X | |
file-to-pdf | | X | | | X | | | X | | |
xlsx-to-pdf | | X | | | X | | | X | | |
pdf-to-word | | X | | | X | | | X | | |
pdf-to-presentation | | X | | | X | | | X | | |
pdf-to-text | | X | | | X | | | X | | |
pdf-to-html | | X | | | X | | | X | | |
pdf-to-xml | | X | | | X | | | X | | |
add-password | | | X | | | | | | | X |
remove-password | | | X | | | | | | | X |
change-permissions | | | X | | | | | | | X |
add-watermark | | | X | | | | | | | X |
ocr-pdf | | | | X | X | | | | X | |
add-image | | | | X | | | | | | X |
compress-pdf | | | | X | X | | | | X
extract-images | | | | X | | | | | | X |
change-metadata | | | | X | | | | | | X |
extract-image-scans | | | | X | X | X | X | | | |
sign | | | | X | | | | | | | X
flatten | | | | X | | | | | | |
repair | | | | X | X | | | X | | |
remove-blanks | | | | X | X | X | X | | | |
compare | | | | X | | | | | | | X

36
lauch4jConfig.xml Normal file
View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<launch4jConfig>
<dontWrapJar>false</dontWrapJar>
<headerType>console</headerType>
<jar>.\build\libs\S-PDF-0.10.1.jar</jar>
<outfile>.\Stirling-PDF.exe</outfile>
<errTitle>Please download Java17</errTitle>
<cmdLine></cmdLine>
<chdir>.</chdir>
<priority>normal</priority>
<downloadUrl>https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe</downloadUrl>
<supportUrl></supportUrl>
<stayAlive>false</stayAlive>
<restartOnCrash>false</restartOnCrash>
<manifest></manifest>
<icon>./src/main/resources/static/favicon.ico</icon>
<var>BROWSER_OPEN=true</var>
<singleInstance>
<mutexName>Stirling-PDF</mutexName>
<windowTitle>Stirling-PDF</windowTitle>
</singleInstance>
<jre>
<path>%JAVA_HOME%;%PATH%</path>
<requiresJdk>false</requiresJdk>
<requires64Bit>false</requires64Bit>
<minVersion>17</minVersion>
<maxVersion></maxVersion>
</jre>
<messages>
<startupErr>An error occurred while starting Stirling-PDF</startupErr>
<jreNotFoundErr>This application requires a Java Runtime Environment, Please download Java 17.</jreNotFoundErr>
<jreVersionErr>You are running the wrong version of Java, Please download Java 17.</jreVersionErr>
<launcherErr>Java is corrupted. Please uninstall and then install Java 17.</launcherErr>
<instanceAlreadyExistsMsg>Stirling-PDF is already running.</instanceAlreadyExistsMsg>
</messages>
</launch4jConfig>

80
scripts/PropSync.java Normal file
View File

@@ -0,0 +1,80 @@
package stirling.software.Stirling.Stats;
import java.nio.file.*;
import java.nio.charset.MalformedInputException;
import java.nio.charset.StandardCharsets;
import java.io.*;
import java.util.*;
public class PropSync {
public static void main(String[] args) throws IOException {
File folder = new File("C:\\Users\\systo\\git\\Stirling-PDF\\src\\main\\resources");
File[] files = folder.listFiles((dir, name) -> name.matches("messages_.*\\.properties"));
List<String> enLines = Files.readAllLines(Paths.get(folder + "\\messages_en_GB.properties"), StandardCharsets.UTF_8);
Map<String, String> enProps = linesToProps(enLines);
for (File file : files) {
if (!file.getName().equals("messages_en_GB.properties")) {
System.out.println("Processing file: " + file.getName());
List<String> lines;
try {
lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
} catch (MalformedInputException e) {
System.out.println("Skipping due to not UTF8 format for file: " + file.getName());
continue;
} catch (IOException e) {
throw new UncheckedIOException(e);
}
Map<String, String> currentProps = linesToProps(lines);
List<String> newLines = syncPropsWithLines(enProps, currentProps, enLines);
Files.write(file.toPath(), newLines, StandardCharsets.UTF_8);
System.out.println("Finished processing file: " + file.getName());
}
}
}
private static Map<String, String> linesToProps(List<String> lines) {
Map<String, String> props = new LinkedHashMap<>();
for (String line : lines) {
if (!line.trim().isEmpty() && line.contains("=")) {
String[] parts = line.split("=", 2);
props.put(parts[0].trim(), parts[1].trim());
}
}
return props;
}
private static List<String> syncPropsWithLines(Map<String, String> enProps, Map<String, String> currentProps, List<String> enLines) {
List<String> newLines = new ArrayList<>();
boolean needsTranslateComment = false; // flag to check if we need to add "TODO: Translate"
for (String line : enLines) {
if (line.contains("=")) {
String key = line.split("=", 2)[0].trim();
if (currentProps.containsKey(key)) {
newLines.add(key + "=" + currentProps.get(key));
needsTranslateComment = false;
} else {
if (!needsTranslateComment) {
newLines.add("##########################");
newLines.add("### TODO: Translate ###");
newLines.add("##########################");
needsTranslateComment = true;
}
newLines.add(line);
}
} else {
// handle comments and other non-property lines
newLines.add(line);
needsTranslateComment = false; // reset the flag when we encounter comments or empty lines
}
}
return newLines;
}
}

View File

@@ -16,11 +16,19 @@ def is_blank_image(image_path, threshold=10, white_percent=99, white_value=255,
_, thresholded_image = cv2.threshold(blurred_image, white_value - threshold, white_value, cv2.THRESH_BINARY) _, thresholded_image = cv2.threshold(blurred_image, white_value - threshold, white_value, cv2.THRESH_BINARY)
# Calculate the percentage of white pixels in the thresholded image # Calculate the percentage of white pixels in the thresholded image
white_pixels = np.sum(thresholded_image == white_value) white_pixels = 0
total_pixels = thresholded_image.size total_pixels = thresholded_image.size
white_pixel_percentage = (white_pixels / total_pixels) * 100 for i in range(0, thresholded_image.shape[0], 2):
for j in range(0, thresholded_image.shape[1], 2):
if thresholded_image[i, j] == white_value:
white_pixels += 1
white_pixel_percentage = (white_pixels / (i * thresholded_image.shape[1] + j + 1)) * 100
if white_pixel_percentage < white_percent:
return False
print(f"Page has white pixel percent of {white_pixel_percentage}") print(f"Page has white pixel percent of {white_pixel_percentage}")
return white_pixel_percentage > white_percent return True
if __name__ == "__main__": if __name__ == "__main__":

View File

@@ -1,3 +1,4 @@
import argparse
import sys import sys
import cv2 import cv2
import numpy as np import numpy as np
@@ -36,32 +37,20 @@ def estimate_background_color(image, sample_points=5):
return np.median(colors, axis=0) return np.median(colors, axis=0)
def auto_rotate(image, angle_threshold=10): def auto_rotate(image, angle_threshold=1):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) edges = cv2.Canny(gray, 50, 150, apertureSize=3)
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)
if len(contours) == 0: if lines is None:
return image return image
largest_contour = max(contours, key=cv2.contourArea) # compute the median angle of the lines
mu = cv2.moments(largest_contour) angles = []
for rho, theta in lines[:, 0]:
angles.append((theta * 180) / np.pi - 90)
if mu["m00"] == 0: angle = np.median(angles)
return image
x_centroid = int(mu["m10"] / mu["m00"])
y_centroid = int(mu["m01"] / mu["m00"])
coords = np.column_stack(np.where(binary > 0))
u, _, vt = np.linalg.svd(coords - np.array([[y_centroid, x_centroid]]), full_matrices=False)
angle = np.arctan2(u[1, 0], u[0, 0]) * 180 / np.pi
if angle < -45:
angle = -(90 + angle)
else:
angle = -angle
if abs(angle) < angle_threshold: if abs(angle) < angle_threshold:
return image return image
@@ -73,6 +62,7 @@ def auto_rotate(image, angle_threshold=10):
def crop_borders(image, border_color, tolerance=30): def crop_borders(image, border_color, tolerance=30):
mask = cv2.inRange(image, border_color - tolerance, border_color + tolerance) mask = cv2.inRange(image, border_color - tolerance, border_color + tolerance)
@@ -112,23 +102,15 @@ def split_photos(input_file, output_directory, tolerance=30, min_area=10000, min
print(f"Saved {output_path}") print(f"Saved {output_path}")
if __name__ == "__main__": if __name__ == "__main__":
if len(sys.argv) < 2: parser = argparse.ArgumentParser(description="Split photos in an image")
print("Usage: python3 split_photos.py <input_file> <output_directory> [tolerance] [min_area] [min_contour_area] [angle_threshold] [border_size]") parser.add_argument("input_file", help="The input scanned image containing multiple photos.")
print("\nParameters:") parser.add_argument("output_directory", help="The directory where the result images should be placed.")
print(" <input_file> - The input scanned image containing multiple photos.") parser.add_argument("--tolerance", type=int, default=30, help="Determines the range of color variation around the estimated background color (default: 30).")
print(" <output_directory> - The directory where the result images should be placed.") parser.add_argument("--min_area", type=int, default=10000, help="Sets the minimum area threshold for a photo (default: 10000).")
print(" [tolerance] - Optional. Determines the range of color variation around the estimated background color (default: 30).") parser.add_argument("--min_contour_area", type=int, default=500, help="Sets the minimum contour area threshold for a photo (default: 500).")
print(" [min_area] - Optional. Sets the minimum area threshold for a photo (default: 10000).") parser.add_argument("--angle_threshold", type=int, default=10, help="Sets the minimum absolute angle required for the image to be rotated (default: 10).")
print(" [min_contour_area] - Optional. Sets the minimum contour area threshold for a photo (default: 500).") parser.add_argument("--border_size", type=int, default=0, help="Sets the size of the border added and removed to prevent white borders in the output (default: 0).")
print(" [angle_threshold] - Optional. Sets the minimum absolute angle required for the image to be rotated (default: 10).")
print(" [border_size] - Optional. Sets the size of the border added and removed to prevent white borders in the output (default: 0).")
sys.exit(1)
input_file = sys.argv[1] args = parser.parse_args()
output_directory = sys.argv[2]
tolerance = int(sys.argv[3]) if len(sys.argv) > 3 else 20 split_photos(args.input_file, args.output_directory, tolerance=args.tolerance, min_area=args.min_area, min_contour_area=args.min_contour_area, angle_threshold=args.angle_threshold, border_size=args.border_size)
min_area = int(sys.argv[4]) if len(sys.argv) > 4 else 8000
min_contour_area = int(sys.argv[5]) if len(sys.argv) > 5 else 500
angle_threshold = int(sys.argv[6]) if len(sys.argv) > 6 else 60
border_size = int(sys.argv[7]) if len(sys.argv) > 7 else 0
split_photos(input_file, output_directory, tolerance=tolerance, min_area=min_area, min_contour_area=min_contour_area, angle_threshold=angle_threshold, border_size=border_size)

View File

@@ -1 +1 @@
rootProject.name = 'S-PDF' rootProject.name = 'Stirling-PDF'

View File

@@ -1,11 +1,76 @@
package stirling.software.SPDF; package stirling.software.SPDF;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.EnableScheduling;
import jakarta.annotation.PostConstruct;
import stirling.software.SPDF.utils.GeneralUtils;
@SpringBootApplication @SpringBootApplication
//@EnableScheduling
public class SPdfApplication { public class SPdfApplication {
@Autowired
private Environment env;
@PostConstruct
public void init() {
// Check if the BROWSER_OPEN environment variable is set to true
String browserOpenEnv = env.getProperty("BROWSER_OPEN");
boolean browserOpen = browserOpenEnv != null && browserOpenEnv.equalsIgnoreCase("true");
if (browserOpen) {
try {
String port = env.getProperty("local.server.port");
if(port == null || port.length() == 0) {
port="8080";
}
String url = "http://localhost:" + port;
String os = System.getProperty("os.name").toLowerCase();
Runtime rt = Runtime.getRuntime();
if (os.contains("win")) {
// For Windows
rt.exec("rundll32 url.dll,FileProtocolHandler " + url);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(SPdfApplication.class, args); SpringApplication.run(SPdfApplication.class, args);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
GeneralUtils.createDir("customFiles/static/");
GeneralUtils.createDir("customFiles/templates/");
GeneralUtils.createDir("config");
System.out.println("Stirling-PDF Started.");
String port = System.getProperty("local.server.port");
if(port == null || port.length() == 0) {
port="8080";
}
String url = "http://localhost:" + port;
System.out.println("Navigate to " + url);
} }
} }

View File

@@ -16,7 +16,7 @@ public class AppConfig {
@Bean(name = "appVersion") @Bean(name = "appVersion")
public String appVersion() { public String appVersion() {
String version = getClass().getPackage().getImplementationVersion(); String version = getClass().getPackage().getImplementationVersion();
return (version != null) ? version : "0.3.3"; return (version != null) ? version : "0.0.0";
} }
@Bean(name = "homeText") @Bean(name = "homeText")

View File

@@ -39,10 +39,17 @@ public class Beans implements WebMvcConfigurer {
Locale tempLocale = Locale.forLanguageTag(appLocaleEnv); Locale tempLocale = Locale.forLanguageTag(appLocaleEnv);
String tempLanguageTag = tempLocale.toLanguageTag(); String tempLanguageTag = tempLocale.toLanguageTag();
if (appLocaleEnv.equalsIgnoreCase(tempLanguageTag)) { if (appLocaleEnv.equalsIgnoreCase(tempLanguageTag)) {
defaultLocale = tempLocale; defaultLocale = tempLocale;
} else { } else {
System.err.println("Invalid APP_LOCALE environment variable value. Falling back to default Locale.UK."); tempLocale = Locale.forLanguageTag(appLocaleEnv.replace("_","-"));
tempLanguageTag = tempLocale.toLanguageTag();
if (appLocaleEnv.equalsIgnoreCase(tempLanguageTag)) {
defaultLocale = tempLocale;
} else {
System.err.println("Invalid APP_LOCALE environment variable value. Falling back to default Locale.UK.");
}
} }
} }

View File

@@ -1,4 +1,6 @@
package stirling.software.SPDF.config; package stirling.software.SPDF.config;
import java.util.List;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@@ -7,39 +9,71 @@ import org.springframework.web.servlet.ModelAndView;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Arrays;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class CleanUrlInterceptor implements HandlerInterceptor { public class CleanUrlInterceptor implements HandlerInterceptor {
private static final Pattern LANG_PATTERN = Pattern.compile("&?lang=([^&]+)"); private static final List<String> ALLOWED_PARAMS = Arrays.asList("lang", "endpoint", "endpoints");
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
String queryString = request.getQueryString(); throws Exception {
if (queryString != null && !queryString.isEmpty()) { String queryString = request.getQueryString();
String requestURI = request.getRequestURI(); if (queryString != null && !queryString.isEmpty()) {
String requestURI = request.getRequestURI();
// Keep the lang parameter if it exists Map<String, String> parameters = new HashMap<>();
Matcher langMatcher = LANG_PATTERN.matcher(queryString);
String langQueryString = langMatcher.find() ? "lang=" + langMatcher.group(1) : "";
// Check if there are any other query parameters besides the lang parameter // Keep only the allowed parameters
String remainingQueryString = queryString.replaceAll(LANG_PATTERN.pattern(), "").replaceAll("&+", "&").replaceAll("^&|&$", ""); String[] queryParameters = queryString.split("&");
for (String param : queryParameters) {
String[] keyValue = param.split("=");
if (keyValue.length != 2) {
continue;
}
if (ALLOWED_PARAMS.contains(keyValue[0])) {
parameters.put(keyValue[0], keyValue[1]);
}
}
if (!remainingQueryString.isEmpty()) { // If there are any parameters that are not allowed
// Redirect to the URL without other query parameters if (parameters.size() != queryParameters.length) {
String redirectUrl = requestURI + (langQueryString.isEmpty() ? "" : "?" + langQueryString); // Construct new query string
response.sendRedirect(redirectUrl); StringBuilder newQueryString = new StringBuilder();
return false; for (Map.Entry<String, String> entry : parameters.entrySet()) {
} if (newQueryString.length() > 0) {
} newQueryString.append("&");
return true; }
} newQueryString.append(entry.getKey()).append("=").append(entry.getValue());
}
@Override // Redirect to the URL with only allowed query parameters
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { String redirectUrl = requestURI + "?" + newQueryString;
} response.sendRedirect(redirectUrl);
return false;
}
}
return true;
}
@Override @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
} ModelAndView modelAndView) {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
}
} }

View File

@@ -1,15 +1,13 @@
package stirling.software.SPDF.config; package stirling.software.SPDF.config;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.slf4j.Logger;
@Service @Service
public class EndpointConfiguration { public class EndpointConfiguration {
private static final Logger logger = LoggerFactory.getLogger(EndpointConfiguration.class); private static final Logger logger = LoggerFactory.getLogger(EndpointConfiguration.class);
@@ -22,12 +20,14 @@ public class EndpointConfiguration {
} }
public void enableEndpoint(String endpoint) { public void enableEndpoint(String endpoint) {
endpointStatuses.put(endpoint, true); endpointStatuses.put(endpoint, true);
} }
public void disableEndpoint(String endpoint) { public void disableEndpoint(String endpoint) {
logger.info("Disabling {}", endpoint); if(!endpointStatuses.containsKey(endpoint) || endpointStatuses.get(endpoint) != false) {
endpointStatuses.put(endpoint, false); logger.info("Disabling {}", endpoint);
endpointStatuses.put(endpoint, false);
}
} }
public boolean isEndpointEnabled(String endpoint) { public boolean isEndpointEnabled(String endpoint) {
@@ -66,6 +66,11 @@ public class EndpointConfiguration {
addEndpointToGroup("PageOps", "split-pdfs"); addEndpointToGroup("PageOps", "split-pdfs");
addEndpointToGroup("PageOps", "pdf-organizer"); addEndpointToGroup("PageOps", "pdf-organizer");
addEndpointToGroup("PageOps", "rotate-pdf"); addEndpointToGroup("PageOps", "rotate-pdf");
addEndpointToGroup("PageOps", "multi-page-layout");
addEndpointToGroup("PageOps", "scale-pages");
addEndpointToGroup("PageOps", "adjust-contrast");
addEndpointToGroup("PageOps", "crop");
addEndpointToGroup("PageOps", "auto-split-pdf");
// Adding endpoints to "Convert" group // Adding endpoints to "Convert" group
addEndpointToGroup("Convert", "pdf-to-img"); addEndpointToGroup("Convert", "pdf-to-img");
@@ -78,12 +83,17 @@ public class EndpointConfiguration {
addEndpointToGroup("Convert", "pdf-to-text"); addEndpointToGroup("Convert", "pdf-to-text");
addEndpointToGroup("Convert", "pdf-to-html"); addEndpointToGroup("Convert", "pdf-to-html");
addEndpointToGroup("Convert", "pdf-to-xml"); addEndpointToGroup("Convert", "pdf-to-xml");
addEndpointToGroup("Convert", "html-to-pdf");
addEndpointToGroup("Convert", "url-to-pdf");
// Adding endpoints to "Security" group // Adding endpoints to "Security" group
addEndpointToGroup("Security", "add-password"); addEndpointToGroup("Security", "add-password");
addEndpointToGroup("Security", "remove-password"); addEndpointToGroup("Security", "remove-password");
addEndpointToGroup("Security", "change-permissions"); addEndpointToGroup("Security", "change-permissions");
addEndpointToGroup("Security", "add-watermark"); addEndpointToGroup("Security", "add-watermark");
addEndpointToGroup("Security", "cert-sign");
addEndpointToGroup("Security", "sanitize-pdf");
// Adding endpoints to "Other" group // Adding endpoints to "Other" group
addEndpointToGroup("Other", "ocr-pdf"); addEndpointToGroup("Other", "ocr-pdf");
@@ -97,9 +107,8 @@ public class EndpointConfiguration {
addEndpointToGroup("Other", "repair"); addEndpointToGroup("Other", "repair");
addEndpointToGroup("Other", "remove-blanks"); addEndpointToGroup("Other", "remove-blanks");
addEndpointToGroup("Other", "compare"); addEndpointToGroup("Other", "compare");
addEndpointToGroup("Other", "add-page-numbers");
addEndpointToGroup("Other", "auto-rename");
@@ -118,12 +127,15 @@ public class EndpointConfiguration {
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");
addEndpointToGroup("CLI", "html-to-pdf");
addEndpointToGroup("CLI", "url-to-pdf");
//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", "url-to-pdf");
//openCV //openCV
addEndpointToGroup("OpenCV", "extract-image-scans"); addEndpointToGroup("OpenCV", "extract-image-scans");
@@ -160,12 +172,21 @@ public class EndpointConfiguration {
addEndpointToGroup("Java", "add-image"); addEndpointToGroup("Java", "add-image");
addEndpointToGroup("Java", "extract-images"); addEndpointToGroup("Java", "extract-images");
addEndpointToGroup("Java", "change-metadata"); addEndpointToGroup("Java", "change-metadata");
addEndpointToGroup("Java", "cert-sign");
addEndpointToGroup("Java", "multi-page-layout");
addEndpointToGroup("Java", "scale-pages");
addEndpointToGroup("Java", "add-page-numbers");
addEndpointToGroup("Java", "auto-rename");
addEndpointToGroup("Java", "auto-split-pdf");
addEndpointToGroup("Java", "sanitize-pdf");
addEndpointToGroup("Java", "crop");
//Javascript //Javascript
addEndpointToGroup("Javascript", "pdf-organizer"); addEndpointToGroup("Javascript", "pdf-organizer");
addEndpointToGroup("Javascript", "sign"); addEndpointToGroup("Javascript", "sign");
addEndpointToGroup("Javascript", "compare"); addEndpointToGroup("Javascript", "compare");
addEndpointToGroup("Javascript", "adjust-contrast");
} }

View File

@@ -1,12 +1,8 @@
package stirling.software.SPDF.config; package stirling.software.SPDF.config;
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.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.config.MeterFilter; import io.micrometer.core.instrument.config.MeterFilter;
import io.micrometer.core.instrument.config.MeterFilterReply; import io.micrometer.core.instrument.config.MeterFilterReply;

View File

@@ -3,15 +3,11 @@ package stirling.software.SPDF.config;
import java.io.IOException; import java.io.IOException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.config.MeterFilter;
import io.micrometer.core.instrument.config.MeterFilterReply;
import jakarta.servlet.FilterChain; import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException; import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
@@ -32,6 +28,7 @@ public class MetricsFilter extends OncePerRequestFilter {
throws ServletException, IOException { throws ServletException, IOException {
String uri = request.getRequestURI(); String uri = request.getRequestURI();
//System.out.println("uri="+uri + ", method=" + request.getMethod() );
// Ignore static resources // Ignore static resources
if (!(uri.startsWith("/js") || uri.startsWith("/images") || uri.endsWith(".ico") || uri.endsWith(".css") || uri.endsWith(".svg")|| uri.endsWith(".js") || uri.contains("swagger") || uri.startsWith("/api"))) { if (!(uri.startsWith("/js") || uri.startsWith("/images") || uri.endsWith(".ico") || uri.endsWith(".css") || uri.endsWith(".svg")|| uri.endsWith(".js") || uri.contains("swagger") || uri.startsWith("/api"))) {
Counter counter = Counter.builder("http.requests") Counter counter = Counter.builder("http.requests")
@@ -40,6 +37,7 @@ public class MetricsFilter extends OncePerRequestFilter {
.register(meterRegistry); .register(meterRegistry);
counter.increment(); counter.increment();
//System.out.println("Counted");
} }
filterChain.doFilter(request, response); filterChain.doFilter(request, response);

View File

@@ -1,5 +1,9 @@
package stirling.software.SPDF.config; package stirling.software.SPDF.config;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@@ -10,13 +14,23 @@ import io.swagger.v3.oas.models.info.Info;
@Configuration @Configuration
public class OpenApiConfig { public class OpenApiConfig {
@Bean @Bean
public OpenAPI customOpenAPI() { public OpenAPI customOpenAPI() {
String version = getClass().getPackage().getImplementationVersion(); String version = getClass().getPackage().getImplementationVersion();
version = (version != null) ? version : "1.0.0"; if (version == null) {
Properties props = new Properties();
try (InputStream input = getClass().getClassLoader().getResourceAsStream("version.properties")) {
props.load(input);
version = props.getProperty("version");
} catch (IOException ex) {
ex.printStackTrace();
version = "1.0.0"; // default version if all else fails
}
}
return new OpenAPI().components(new Components()).info(
new Info().title("Stirling PDF API").version(version).description("API documentation for all Server-Side processing.\nPlease note some functionality might be UI only and missing from here."));
}
return new OpenAPI().components(new Components()).info(
new Info().title("Stirling PDF API").version(version).description("API documentation for all Server-Side processing.\nPlease note some functionality might be UI only and missing from here."));
}
} }

View File

@@ -3,6 +3,7 @@ package stirling.software.SPDF.config;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration @Configuration
@@ -15,4 +16,12 @@ public class WebMvcConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) { public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(endpointInterceptor); registry.addInterceptor(endpointInterceptor);
} }
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// Handler for external static resources
registry.addResourceHandler("/**")
.addResourceLocations("file:customFiles/static/", "classpath:/static/")
.setCachePeriod(0); // Optional: disable caching
}
} }

View File

@@ -0,0 +1,132 @@
package stirling.software.SPDF.controller.api;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
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.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.GeneralUtils;
import stirling.software.SPDF.utils.WebResponseUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.canvas.parser.EventType;
import com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor;
import com.itextpdf.kernel.pdf.canvas.parser.data.IEventData;
import com.itextpdf.kernel.pdf.canvas.parser.data.TextRenderInfo;
import com.itextpdf.kernel.pdf.canvas.parser.listener.IEventListener;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController
@Tag(name = "General", description = "General APIs")
public class CropController {
private static final Logger logger = LoggerFactory.getLogger(CropController.class);
@PostMapping(value = "/crop", consumes = "multipart/form-data")
@Operation(summary = "Crops a PDF document", description = "This operation takes an input PDF file and crops it according to the given coordinates. Input:PDF Output:PDF Type:SISO")
public ResponseEntity<byte[]> cropPdf(
@Parameter(description = "The input PDF file", required = true) @RequestParam("fileInput") MultipartFile file,
@Parameter(description = "The x-coordinate of the top-left corner of the crop area", required = true, schema = @Schema(type = "number")) @RequestParam("x") float x,
@Parameter(description = "The y-coordinate of the top-left corner of the crop area", required = true, schema = @Schema(type = "number")) @RequestParam("y") float y,
@Parameter(description = "The width of the crop area", required = true, schema = @Schema(type = "number")) @RequestParam("width") float width,
@Parameter(description = "The height of the crop area", required = true, schema = @Schema(type = "number")) @RequestParam("height") float height) throws IOException {
byte[] bytes = file.getBytes();
System.out.println("x=" + x + ", " + "y=" + y + ", " + "width=" + width + ", " +"height=" + height );
PdfReader reader = new PdfReader(new ByteArrayInputStream(bytes));
PdfDocument pdfDoc = new PdfDocument(reader);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(baos);
PdfDocument outputPdf = new PdfDocument(writer);
int totalPages = pdfDoc.getNumberOfPages();
for (int i = 1; i <= totalPages; i++) {
PdfPage page = outputPdf.addNewPage(new PageSize(width, height));
PdfCanvas pdfCanvas = new PdfCanvas(page);
PdfFormXObject formXObject = pdfDoc.getPage(i).copyAsFormXObject(outputPdf);
// Save the graphics state, apply the transformations, add the object, and then
// restore the graphics state
pdfCanvas.saveState();
pdfCanvas.rectangle(x, y, width, height);
pdfCanvas.clip();
pdfCanvas.addXObject(formXObject, -x, -y);
pdfCanvas.restoreState();
}
outputPdf.close();
byte[] pdfContent = baos.toByteArray();
pdfDoc.close();
return WebResponseUtils.bytesToWebResponse(pdfContent,
file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_cropped.pdf");
}
}

View File

@@ -17,9 +17,11 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import stirling.software.SPDF.utils.PdfUtils; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "General", description = "General APIs")
public class MergeController { public class MergeController {
private static final Logger logger = LoggerFactory.getLogger(MergeController.class); private static final Logger logger = LoggerFactory.getLogger(MergeController.class);
@@ -47,7 +49,7 @@ public class MergeController {
@PostMapping(consumes = "multipart/form-data", value = "/merge-pdfs") @PostMapping(consumes = "multipart/form-data", value = "/merge-pdfs")
@Operation( @Operation(
summary = "Merge multiple PDF files into one", summary = "Merge multiple PDF files into one",
description = "This endpoint merges multiple PDF files into a single PDF file. The merged file will contain all pages from the input files in the order they were provided." description = "This endpoint merges multiple PDF files into a single PDF file. The merged file will contain all pages from the input files in the order they were provided. Input:PDF Output:PDF Type:MISO"
) )
public ResponseEntity<byte[]> mergePdfs( public ResponseEntity<byte[]> mergePdfs(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@@ -65,7 +67,7 @@ public class MergeController {
// Return the merged PDF as a response // Return the merged PDF as a response
ResponseEntity<byte[]> response = PdfUtils.pdfDocToWebResponse(mergedDoc, files[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_merged.pdf"); ResponseEntity<byte[]> response = WebResponseUtils.pdfDocToWebResponse(mergedDoc, files[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_merged.pdf");
for (PDDocument doc : documents) { for (PDDocument doc : documents) {
// Close the document after processing // Close the document after processing

View File

@@ -0,0 +1,101 @@
package stirling.software.SPDF.controller.api;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController
@Tag(name = "General", description = "General APIs")
public class MultiPageLayoutController {
private static final Logger logger = LoggerFactory.getLogger(MultiPageLayoutController.class);
@PostMapping(value = "/multi-page-layout", consumes = "multipart/form-data")
@Operation(summary = "Merge multiple pages of a PDF document into a single page", description = "This operation takes an input PDF file and the number of pages to merge into a single sheet in the output PDF file. Input:PDF Output:PDF Type:SISO")
public ResponseEntity<byte[]> mergeMultiplePagesIntoOne(
@Parameter(description = "The input PDF file", required = true) @RequestParam("fileInput") MultipartFile file,
@Parameter(description = "The number of pages to fit onto a single sheet in the output PDF. Acceptable values are 2, 3, 4, 9, 16.", required = true, schema = @Schema(type = "integer", allowableValues = {
"2", "3", "4", "9", "16" })) @RequestParam("pagesPerSheet") int pagesPerSheet)
throws IOException {
if (pagesPerSheet != 2 && pagesPerSheet != 3
&& pagesPerSheet != (int) Math.sqrt(pagesPerSheet) * Math.sqrt(pagesPerSheet)) {
throw new IllegalArgumentException("pagesPerSheet must be 2, 3 or a perfect square");
}
int cols = pagesPerSheet == 2 || pagesPerSheet == 3 ? pagesPerSheet : (int) Math.sqrt(pagesPerSheet);
int rows = pagesPerSheet == 2 || pagesPerSheet == 3 ? 1 : (int) Math.sqrt(pagesPerSheet);
byte[] bytes = file.getBytes();
PdfReader reader = new PdfReader(new ByteArrayInputStream(bytes));
PdfDocument pdfDoc = new PdfDocument(reader);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(baos);
PdfDocument outputPdf = new PdfDocument(writer);
PageSize pageSize = new PageSize(PageSize.A4.rotate());
int totalPages = pdfDoc.getNumberOfPages();
float cellWidth = pageSize.getWidth() / cols;
float cellHeight = pageSize.getHeight() / rows;
for (int i = 1; i <= totalPages; i += pagesPerSheet) {
PdfPage page = outputPdf.addNewPage(pageSize);
PdfCanvas pdfCanvas = new PdfCanvas(page);
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
int index = i + row * cols + col;
if (index <= totalPages) {
// Get the page and calculate scaling factors
Rectangle rect = pdfDoc.getPage(index).getPageSize();
float scaleWidth = cellWidth / rect.getWidth();
float scaleHeight = cellHeight / rect.getHeight();
float scale = Math.min(scaleWidth, scaleHeight);
PdfFormXObject formXObject = pdfDoc.getPage(index).copyAsFormXObject(outputPdf);
float x = col * cellWidth + (cellWidth - rect.getWidth() * scale) / 2;
float y = (rows - 1 - row) * cellHeight + (cellHeight - rect.getHeight() * scale) / 2;
// Save the graphics state, apply the transformations, add the object, and then
// restore the graphics state
pdfCanvas.saveState();
pdfCanvas.concatMatrix(scale, 0, 0, scale, x, y);
pdfCanvas.addXObject(formXObject, 0, 0);
pdfCanvas.restoreState();
}
}
}
}
outputPdf.close();
byte[] pdfContent = baos.toByteArray();
pdfDoc.close();
return WebResponseUtils.bytesToWebResponse(pdfContent, file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_layoutChanged.pdf");
}
}

View File

@@ -17,111 +17,193 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import stirling.software.SPDF.utils.PdfUtils; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.GeneralUtils;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "General", description = "General APIs")
public class RearrangePagesPDFController { public class RearrangePagesPDFController {
private static final Logger logger = LoggerFactory.getLogger(RearrangePagesPDFController.class); private static final Logger logger = LoggerFactory.getLogger(RearrangePagesPDFController.class);
@PostMapping(consumes = "multipart/form-data", value = "/remove-pages")
@Operation(summary = "Remove pages from a PDF file", description = "This endpoint removes specified pages from a given PDF file. Users can provide a comma-separated list of page numbers or ranges to delete. Input:PDF Output:PDF Type:SISO")
public ResponseEntity<byte[]> deletePages(
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file from which pages will be removed") MultipartFile pdfFile,
@RequestParam("pagesToDelete") @Parameter(description = "Comma-separated list of pages or page ranges to delete, e.g., '1,3,5-8'") String pagesToDelete)
throws IOException {
PDDocument document = PDDocument.load(pdfFile.getBytes());
// Split the page order string into an array of page numbers or range of numbers
String[] pageOrderArr = pagesToDelete.split(",");
List<Integer> pagesToRemove = GeneralUtils.parsePageList(pageOrderArr, document.getNumberOfPages());
for (int i = pagesToRemove.size() - 1; i >= 0; i--) {
int pageIndex = pagesToRemove.get(i);
document.removePage(pageIndex);
}
return WebResponseUtils.pdfDocToWebResponse(document,
pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_removed_pages.pdf");
}
private enum CustomMode {
REVERSE_ORDER, DUPLEX_SORT, BOOKLET_SORT, ODD_EVEN_SPLIT, REMOVE_FIRST, REMOVE_LAST, REMOVE_FIRST_AND_LAST,
}
private List<Integer> removeFirst(int totalPages) {
if (totalPages <= 1)
return new ArrayList<>();
List<Integer> newPageOrder = new ArrayList<>();
for (int i = 2; i <= totalPages; i++) {
newPageOrder.add(i - 1);
}
return newPageOrder;
}
private List<Integer> removeLast(int totalPages) {
if (totalPages <= 1)
return new ArrayList<>();
List<Integer> newPageOrder = new ArrayList<>();
for (int i = 1; i < totalPages; i++) {
newPageOrder.add(i - 1);
}
return newPageOrder;
}
private List<Integer> removeFirstAndLast(int totalPages) {
if (totalPages <= 2)
return new ArrayList<>();
List<Integer> newPageOrder = new ArrayList<>();
for (int i = 2; i < totalPages; i++) {
newPageOrder.add(i - 1);
}
return newPageOrder;
}
private List<Integer> reverseOrder(int totalPages) {
List<Integer> newPageOrder = new ArrayList<>();
for (int i = totalPages; i >= 1; i--) {
newPageOrder.add(i - 1);
}
return newPageOrder;
}
private List<Integer> duplexSort(int totalPages) {
List<Integer> newPageOrder = new ArrayList<>();
int half = (totalPages + 1) / 2; // This ensures proper behavior with odd numbers of pages
for (int i = 1; i <= half; i++) {
newPageOrder.add(i - 1);
if (i <= totalPages - half) { // Avoid going out of bounds
newPageOrder.add(totalPages - i);
}
}
return newPageOrder;
}
private List<Integer> bookletSort(int totalPages) {
List<Integer> newPageOrder = new ArrayList<>();
for (int i = 0; i < totalPages / 2; i++) {
newPageOrder.add(i);
newPageOrder.add(totalPages - i - 1);
}
return newPageOrder;
}
private List<Integer> oddEvenSplit(int totalPages) {
List<Integer> newPageOrder = new ArrayList<>();
for (int i = 1; i <= totalPages; i += 2) {
newPageOrder.add(i - 1);
}
for (int i = 2; i <= totalPages; i += 2) {
newPageOrder.add(i - 1);
}
return newPageOrder;
}
private List<Integer> processCustomMode(String customMode, int totalPages) {
try {
CustomMode mode = CustomMode.valueOf(customMode.toUpperCase());
switch (mode) {
case REVERSE_ORDER:
return reverseOrder(totalPages);
case DUPLEX_SORT:
return duplexSort(totalPages);
case BOOKLET_SORT:
return bookletSort(totalPages);
case ODD_EVEN_SPLIT:
return oddEvenSplit(totalPages);
case REMOVE_FIRST:
return removeFirst(totalPages);
case REMOVE_LAST:
return removeLast(totalPages);
case REMOVE_FIRST_AND_LAST:
return removeFirstAndLast(totalPages);
default:
throw new IllegalArgumentException("Unsupported custom mode");
}
} catch (IllegalArgumentException e) {
logger.error("Unsupported custom mode", e);
return null;
}
}
@PostMapping(consumes = "multipart/form-data", value = "/rearrange-pages")
@Operation(summary = "Rearrange pages in a PDF file", description = "This endpoint rearranges pages in a given PDF file based on the specified page order or custom mode. Users can provide a page order as a comma-separated list of page numbers or page ranges, or a custom mode. Input:PDF Output:PDF")
public ResponseEntity<byte[]> rearrangePages(
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to rearrange pages") MultipartFile pdfFile,
@RequestParam(required = false, value = "pageOrder") @Parameter(description = "The new page order as a comma-separated list of page numbers, page ranges (e.g., '1,3,5-7'), or functions in the format 'an+b' where 'a' is the multiplier of the page number 'n', and 'b' is a constant (e.g., '2n+1', '3n', '6n-5')") String pageOrder,
@RequestParam(required = false, value = "customMode") @Parameter(schema = @Schema(implementation = CustomMode.class, description = "The custom mode for page rearrangement. "
+ "Valid values are:\n" + "REVERSE_ORDER: Reverses the order of all pages.\n"
+ "DUPLEX_SORT: Sorts pages as if all fronts were scanned then all backs in reverse (1, n, 2, n-1, ...). "
+ "BOOKLET_SORT: Arranges pages for booklet printing (last, first, second, second last, ...).\n"
+ "ODD_EVEN_SPLIT: Splits and arranges pages into odd and even numbered pages.\n"
+ "REMOVE_FIRST: Removes the first page.\n" + "REMOVE_LAST: Removes the last page.\n"
+ "REMOVE_FIRST_AND_LAST: Removes both the first and the last pages.\n")) String customMode) {
try {
// Load the input PDF
PDDocument document = PDDocument.load(pdfFile.getInputStream());
// Split the page order string into an array of page numbers or range of numbers
String[] pageOrderArr = pageOrder != null ? pageOrder.split(",") : new String[0];
int totalPages = document.getNumberOfPages();
System.out.println("pageOrder=" + pageOrder);
System.out.println("customMode length =" + customMode.length());
List<Integer> newPageOrder;
if (customMode != null && customMode.length() > 0) {
newPageOrder = processCustomMode(customMode, totalPages);
} else {
newPageOrder = GeneralUtils.parsePageList(pageOrderArr, totalPages);
}
// Create a new list to hold the pages in the new order
List<PDPage> newPages = new ArrayList<>();
for (int i = 0; i < newPageOrder.size(); i++) {
newPages.add(document.getPage(newPageOrder.get(i)));
}
// Remove all the pages from the original document
for (int i = document.getNumberOfPages() - 1; i >= 0; i--) {
document.removePage(i);
}
// Add the pages in the new order
for (PDPage page : newPages) {
document.addPage(page);
}
return WebResponseUtils.pdfDocToWebResponse(document,
pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_rearranged.pdf");
} catch (IOException e) {
logger.error("Failed rearranging documents", e);
return null;
}
}
@PostMapping(consumes = "multipart/form-data", value = "/remove-pages")
@Operation(summary = "Remove pages from a PDF file",
description = "This endpoint removes specified pages from a given PDF file. Users can provide a comma-separated list of page numbers or ranges to delete.")
public ResponseEntity<byte[]> deletePages(
@RequestPart(required = true, value = "fileInput")
@Parameter(description = "The input PDF file from which pages will be removed")
MultipartFile pdfFile,
@RequestParam("pagesToDelete")
@Parameter(description = "Comma-separated list of pages or page ranges to delete, e.g., '1,3,5-8'")
String pagesToDelete) throws IOException {
PDDocument document = PDDocument.load(pdfFile.getBytes());
// Split the page order string into an array of page numbers or range of numbers
String[] pageOrderArr = pagesToDelete.split(",");
List<Integer> pagesToRemove = pageOrderToString(pageOrderArr, document.getNumberOfPages());
for (int i = pagesToRemove.size() - 1; i >= 0; i--) {
int pageIndex = pagesToRemove.get(i);
document.removePage(pageIndex);
}
return PdfUtils.pdfDocToWebResponse(document, pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_removed_pages.pdf");
}
private List<Integer> pageOrderToString(String[] pageOrderArr, int totalPages) {
List<Integer> newPageOrder = new ArrayList<>();
// loop through the page order array
for (String element : pageOrderArr) {
// check if the element contains a range of pages
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 - 1);
}
} else {
// if the element is a single page
newPageOrder.add(Integer.parseInt(element) - 1);
}
}
return newPageOrder;
}
@PostMapping(consumes = "multipart/form-data", value = "/rearrange-pages")
@Operation(summary = "Rearrange pages in a PDF file",
description = "This endpoint rearranges pages in a given PDF file based on the specified page order. Users can provide a page order as a comma-separated list of page numbers or page ranges.")
public ResponseEntity<byte[]> rearrangePages(
@RequestPart(required = true, value = "fileInput")
@Parameter(description = "The input PDF file to rearrange pages")
MultipartFile pdfFile,
@RequestParam("pageOrder")
@Parameter(description = "The new page order as a comma-separated list of page numbers or page ranges (e.g., '1,3,5-7')")
String pageOrder) {
try {
// Load the input PDF
PDDocument document = PDDocument.load(pdfFile.getInputStream());
// Split the page order string into an array of page numbers or range of numbers
String[] pageOrderArr = pageOrder.split(",");
// int[] newPageOrder = new int[pageOrderArr.length];
int totalPages = document.getNumberOfPages();
List<Integer> newPageOrder = pageOrderToString(pageOrderArr, totalPages);
// Create a new list to hold the pages in the new order
List<PDPage> newPages = new ArrayList<>();
for (int i = 0; i < newPageOrder.size(); i++) {
newPages.add(document.getPage(newPageOrder.get(i)));
}
// Remove all the pages from the original document
for (int i = document.getNumberOfPages() - 1; i >= 0; i--) {
document.removePage(i);
}
// Add the pages in the new order
for (PDPage page : newPages) {
document.addPage(page);
}
return PdfUtils.pdfDocToWebResponse(document, pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_rearranged.pdf");
} catch (IOException e) {
logger.error("Failed rearranging documents", e);
return null;
}
}
} }

View File

@@ -16,9 +16,11 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import stirling.software.SPDF.utils.PdfUtils; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "General", description = "General APIs")
public class RotationController { public class RotationController {
private static final Logger logger = LoggerFactory.getLogger(RotationController.class); private static final Logger logger = LoggerFactory.getLogger(RotationController.class);
@@ -26,7 +28,7 @@ public class RotationController {
@PostMapping(consumes = "multipart/form-data", value = "/rotate-pdf") @PostMapping(consumes = "multipart/form-data", value = "/rotate-pdf")
@Operation( @Operation(
summary = "Rotate a PDF file", summary = "Rotate a PDF file",
description = "This endpoint rotates a given PDF file by a specified angle. The angle must be a multiple of 90." description = "This endpoint rotates a given PDF file by a specified angle. The angle must be a multiple of 90. Input:PDF Output:PDF Type:SISO"
) )
public ResponseEntity<byte[]> rotatePDF( public ResponseEntity<byte[]> rotatePDF(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@@ -46,7 +48,7 @@ public class RotationController {
page.setRotation(page.getRotation() + angle); page.setRotation(page.getRotation() + angle);
} }
return PdfUtils.pdfDocToWebResponse(document, pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_rotated.pdf"); return WebResponseUtils.pdfDocToWebResponse(document, pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_rotated.pdf");
} }

View File

@@ -0,0 +1,243 @@
package stirling.software.SPDF.controller.api;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.canvas.parser.EventType;
import com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor;
import com.itextpdf.kernel.pdf.canvas.parser.data.IEventData;
import com.itextpdf.kernel.pdf.canvas.parser.data.TextRenderInfo;
import com.itextpdf.kernel.pdf.canvas.parser.listener.IEventListener;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController
@Tag(name = "General", description = "General APIs")
public class ScalePagesController {
private static final Logger logger = LoggerFactory.getLogger(ScalePagesController.class);
@PostMapping(value = "/scale-pages", consumes = "multipart/form-data")
@Operation(summary = "Change the size of a PDF page/document", description = "This operation takes an input PDF file and the size to scale the pages to in the output PDF file. Input:PDF Output:PDF Type:SISO")
public ResponseEntity<byte[]> scalePages(
@Parameter(description = "The input PDF file", required = true) @RequestParam("fileInput") MultipartFile file,
@Parameter(description = "The scale of pages in the output PDF. Acceptable values are A0-A10, B0-B9, LETTER, TABLOID, LEDGER, LEGAL, EXECUTIVE.", required = true, schema = @Schema(type = "string", allowableValues = {
"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "B0", "B1", "B2", "B3", "B4",
"B5", "B6", "B7", "B8", "B9", "LETTER", "TABLOID", "LEDGER", "LEGAL",
"EXECUTIVE" })) @RequestParam("pageSize") String targetPageSize,
@Parameter(description = "The scale of the content on the pages of the output PDF. Acceptable values are floats.", required = true, schema = @Schema(type = "integer")) @RequestParam("scaleFactor") float scaleFactor)
throws IOException {
Map<String, PageSize> sizeMap = new HashMap<>();
// Add A0 - A10
sizeMap.put("A0", PageSize.A0);
sizeMap.put("A1", PageSize.A1);
sizeMap.put("A2", PageSize.A2);
sizeMap.put("A3", PageSize.A3);
sizeMap.put("A4", PageSize.A4);
sizeMap.put("A5", PageSize.A5);
sizeMap.put("A6", PageSize.A6);
sizeMap.put("A7", PageSize.A7);
sizeMap.put("A8", PageSize.A8);
sizeMap.put("A9", PageSize.A9);
sizeMap.put("A10", PageSize.A10);
// Add B0 - B9
sizeMap.put("B0", PageSize.B0);
sizeMap.put("B1", PageSize.B1);
sizeMap.put("B2", PageSize.B2);
sizeMap.put("B3", PageSize.B3);
sizeMap.put("B4", PageSize.B4);
sizeMap.put("B5", PageSize.B5);
sizeMap.put("B6", PageSize.B6);
sizeMap.put("B7", PageSize.B7);
sizeMap.put("B8", PageSize.B8);
sizeMap.put("B9", PageSize.B9);
// Add other sizes
sizeMap.put("LETTER", PageSize.LETTER);
sizeMap.put("TABLOID", PageSize.TABLOID);
sizeMap.put("LEDGER", PageSize.LEDGER);
sizeMap.put("LEGAL", PageSize.LEGAL);
sizeMap.put("EXECUTIVE", PageSize.EXECUTIVE);
if (!sizeMap.containsKey(targetPageSize)) {
throw new IllegalArgumentException(
"Invalid pageSize. It must be one of the following: A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10");
}
PageSize pageSize = sizeMap.get(targetPageSize);
byte[] bytes = file.getBytes();
PdfReader reader = new PdfReader(new ByteArrayInputStream(bytes));
PdfDocument pdfDoc = new PdfDocument(reader);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(baos);
PdfDocument outputPdf = new PdfDocument(writer);
int totalPages = pdfDoc.getNumberOfPages();
for (int i = 1; i <= totalPages; i++) {
PdfPage page = outputPdf.addNewPage(pageSize);
PdfCanvas pdfCanvas = new PdfCanvas(page);
// Get the page and calculate scaling factors
Rectangle rect = pdfDoc.getPage(i).getPageSize();
float scaleWidth = pageSize.getWidth() / rect.getWidth();
float scaleHeight = pageSize.getHeight() / rect.getHeight();
float scale = Math.min(scaleWidth, scaleHeight) * scaleFactor;
System.out.println("Scale: " + scale);
PdfFormXObject formXObject = pdfDoc.getPage(i).copyAsFormXObject(outputPdf);
float x = (pageSize.getWidth() - rect.getWidth() * scale) / 2; // Center Page
float y = (pageSize.getHeight() - rect.getHeight() * scale) / 2;
// Save the graphics state, apply the transformations, add the object, and then
// restore the graphics state
pdfCanvas.saveState();
pdfCanvas.concatMatrix(scale, 0, 0, scale, x, y);
pdfCanvas.addXObject(formXObject, 0, 0);
pdfCanvas.restoreState();
}
outputPdf.close();
byte[] pdfContent = baos.toByteArray();
pdfDoc.close();
return WebResponseUtils.bytesToWebResponse(pdfContent,
file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_scaled.pdf");
}
//TODO
@Hidden
@PostMapping(value = "/auto-crop", consumes = "multipart/form-data")
public ResponseEntity<byte[]> cropPdf(@RequestParam("fileInput") MultipartFile file) throws IOException {
byte[] bytes = file.getBytes();
PdfReader reader = new PdfReader(new ByteArrayInputStream(bytes));
PdfDocument pdfDoc = new PdfDocument(reader);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(baos);
PdfDocument outputPdf = new PdfDocument(writer);
int totalPages = pdfDoc.getNumberOfPages();
for (int i = 1; i <= totalPages; i++) {
PdfPage page = pdfDoc.getPage(i);
Rectangle originalMediaBox = page.getMediaBox();
Rectangle contentBox = determineContentBox(page);
// Make sure we don't go outside the original media box.
Rectangle intersection = originalMediaBox.getIntersection(contentBox);
page.setCropBox(intersection);
// Copy page to the new document
outputPdf.addPage(page.copyTo(outputPdf));
}
outputPdf.close();
byte[] pdfContent = baos.toByteArray();
pdfDoc.close();
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""
+ file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_cropped.pdf\"")
.contentType(MediaType.APPLICATION_PDF).body(pdfContent);
}
private Rectangle determineContentBox(PdfPage page) {
// Extract the text from the page and find the bounding box.
TextBoundingRectangleFinder finder = new TextBoundingRectangleFinder();
PdfCanvasProcessor processor = new PdfCanvasProcessor(finder);
processor.processPageContent(page);
return finder.getBoundingBox();
}
private static class TextBoundingRectangleFinder implements IEventListener {
private List<Rectangle> allTextBoxes = new ArrayList<>();
public Rectangle getBoundingBox() {
// Sort the text boxes based on their vertical position
allTextBoxes.sort(Comparator.comparingDouble(Rectangle::getTop));
// Consider a box an outlier if its top is more than 1.5 times the IQR above the
// third quartile.
int q1Index = allTextBoxes.size() / 4;
int q3Index = 3 * allTextBoxes.size() / 4;
double iqr = allTextBoxes.get(q3Index).getTop() - allTextBoxes.get(q1Index).getTop();
double threshold = allTextBoxes.get(q3Index).getTop() + 1.5 * iqr;
// Initialize boundingBox to the first non-outlier box
int i = 0;
while (i < allTextBoxes.size() && allTextBoxes.get(i).getTop() > threshold) {
i++;
}
if (i == allTextBoxes.size()) {
// If all boxes are outliers, just return the first one
return allTextBoxes.get(0);
}
Rectangle boundingBox = allTextBoxes.get(i);
// Extend the bounding box to include all non-outlier boxes
for (; i < allTextBoxes.size(); i++) {
Rectangle textBoundingBox = allTextBoxes.get(i);
if (textBoundingBox.getTop() > threshold) {
// This box is an outlier, skip it
continue;
}
float left = Math.min(boundingBox.getLeft(), textBoundingBox.getLeft());
float bottom = Math.min(boundingBox.getBottom(), textBoundingBox.getBottom());
float right = Math.max(boundingBox.getRight(), textBoundingBox.getRight());
float top = Math.max(boundingBox.getTop(), textBoundingBox.getTop());
// Add a small padding around the bounding box
float padding = 10;
boundingBox = new Rectangle(left - padding, bottom - padding, right - left + 2 * padding,
top - bottom + 2 * padding);
}
return boundingBox;
}
@Override
public void eventOccurred(IEventData data, EventType type) {
if (type == EventType.RENDER_TEXT) {
TextRenderInfo renderInfo = (TextRenderInfo) data;
allTextBoxes.add(renderInfo.getBaseline().getBoundingRectangle());
}
}
@Override
public Set<EventType> getSupportedEvents() {
return Collections.singleton(EventType.RENDER_TEXT);
}
}
}

View File

@@ -6,7 +6,6 @@ import java.io.InputStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
@@ -16,9 +15,6 @@ import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPage;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
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.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@@ -29,16 +25,20 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.GeneralUtils;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "General", description = "General APIs")
public class SplitPDFController { public class SplitPDFController {
private static final Logger logger = LoggerFactory.getLogger(SplitPDFController.class); private static final Logger logger = LoggerFactory.getLogger(SplitPDFController.class);
@PostMapping(consumes = "multipart/form-data", value = "/split-pages") @PostMapping(consumes = "multipart/form-data", value = "/split-pages")
@Operation(summary = "Split a PDF file into separate documents", @Operation(summary = "Split a PDF file into separate documents",
description = "This endpoint splits a given PDF file into separate documents based on the specified page numbers or ranges. Users can specify pages using individual numbers, ranges, or 'all' for every page.") description = "This endpoint splits a given PDF file into separate documents based on the specified page numbers or ranges. Users can specify pages using individual numbers, ranges, or 'all' for every page. Input:PDF Output:PDF Type:SIMO")
public ResponseEntity<Resource> splitPdf( public ResponseEntity<byte[]> splitPdf(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@Parameter(description = "The input PDF file to be split") @Parameter(description = "The input PDF file to be split")
MultipartFile file, MultipartFile file,
@@ -58,39 +58,28 @@ public class SplitPDFController {
pageNumbers.add(i); pageNumbers.add(i);
} }
} else { } else {
List<String> pageNumbersStr = new ArrayList<>(Arrays.asList(pages.split(","))); String[] splitPoints = pages.split(",");
if (!pageNumbersStr.contains(String.valueOf(document.getNumberOfPages()))) { for (String splitPoint : splitPoints) {
String lastpage = String.valueOf(document.getNumberOfPages()); List<Integer> orderedPages = GeneralUtils.parsePageList(new String[] {splitPoint}, document.getNumberOfPages());
pageNumbersStr.add(lastpage); pageNumbers.addAll(orderedPages);
}
for (String page : pageNumbersStr) {
if (page.contains("-")) {
String[] range = page.split("-");
int start = Integer.parseInt(range[0]);
int end = Integer.parseInt(range[1]);
for (int i = start; i <= end; i++) {
pageNumbers.add(i);
}
} else {
pageNumbers.add(Integer.parseInt(page));
}
} }
// Add the last page as a split point
pageNumbers.add(document.getNumberOfPages() - 1);
} }
logger.info("Splitting PDF into pages: {}", pageNumbers.stream().map(String::valueOf).collect(Collectors.joining(","))); logger.info("Splitting PDF into pages: {}", pageNumbers.stream().map(String::valueOf).collect(Collectors.joining(",")));
// split the document // split the document
List<ByteArrayOutputStream> splitDocumentsBoas = new ArrayList<>(); List<ByteArrayOutputStream> splitDocumentsBoas = new ArrayList<>();
int currentPage = 0; int previousPageNumber = 0;
for (int pageNumber : pageNumbers) { for (int splitPoint : pageNumbers) {
try (PDDocument splitDocument = new PDDocument()) { try (PDDocument splitDocument = new PDDocument()) {
for (int i = currentPage; i < pageNumber; 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.debug("Adding page {} to split document", i);
} }
currentPage = pageNumber; previousPageNumber = splitPoint + 1;
logger.debug("Setting current page to {}", currentPage);
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
splitDocument.save(baos); splitDocument.save(baos);
@@ -102,15 +91,17 @@ public class SplitPDFController {
} }
} }
// closing the original document // closing the original document
document.close(); document.close();
Path zipFile = Files.createTempFile("split_documents", ".zip"); Path zipFile = Files.createTempFile("split_documents", ".zip");
String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", "");
try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) {
// loop through the split documents and write them to the zip file // loop through the split documents and write them to the zip file
for (int i = 0; i < splitDocumentsBoas.size(); i++) { for (int i = 0; i < splitDocumentsBoas.size(); i++) {
String fileName = "split_document_" + (i + 1) + ".pdf"; String fileName = filename + "_" + (i + 1) + ".pdf";
ByteArrayOutputStream baos = splitDocumentsBoas.get(i); ByteArrayOutputStream baos = splitDocumentsBoas.get(i);
byte[] pdf = baos.toByteArray(); byte[] pdf = baos.toByteArray();
@@ -129,12 +120,11 @@ public class SplitPDFController {
logger.info("Successfully created zip file with split documents: {}", zipFile.toString()); logger.info("Successfully created zip file with split documents: {}", zipFile.toString());
byte[] data = Files.readAllBytes(zipFile); byte[] data = Files.readAllBytes(zipFile);
ByteArrayResource resource = new ByteArrayResource(data);
Files.delete(zipFile); Files.delete(zipFile);
// return the Resource in the response // return the Resource in the response
return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_split.zip") return WebResponseUtils.bytesToWebResponse(data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM);
.contentType(MediaType.APPLICATION_OCTET_STREAM).contentLength(resource.contentLength()).body(resource);
} }
} }

View File

@@ -0,0 +1,129 @@
package stirling.software.SPDF.controller.api.converters;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
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.utils.GeneralUtils;
import stirling.software.SPDF.utils.ProcessExecutor;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController
@Tag(name = "Convert", description = "Convert APIs")
public class ConvertHtmlToPDF {
@PostMapping(consumes = "multipart/form-data", value = "/html-to-pdf")
@Operation(
summary = "Convert an HTML or ZIP (containing HTML and CSS) to PDF",
description = "This endpoint takes an HTML or ZIP file input and converts it to a PDF format."
)
public ResponseEntity<byte[]> HtmlToPdf(
@RequestPart(required = true, value = "fileInput") MultipartFile fileInput) throws IOException, InterruptedException {
if (fileInput == null) {
throw new IllegalArgumentException("Please provide an HTML or ZIP file for conversion.");
}
String originalFilename = fileInput.getOriginalFilename();
if (originalFilename == null || (!originalFilename.endsWith(".html") && !originalFilename.endsWith(".zip"))) {
throw new IllegalArgumentException("File must be either .html or .zip format.");
}
Path tempOutputFile = Files.createTempFile("output_", ".pdf");
Path tempInputFile = null;
byte[] pdfBytes;
try {
if (originalFilename.endsWith(".html")) {
tempInputFile = Files.createTempFile("input_", ".html");
Files.write(tempInputFile, fileInput.getBytes());
} else {
tempInputFile = unzipAndGetMainHtml(fileInput);
}
List<String> command = new ArrayList<>();
command.add("weasyprint");
command.add(tempInputFile.toString());
command.add(tempOutputFile.toString());
int returnCode = 0;
if (originalFilename.endsWith(".zip")) {
returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.WEASYPRINT)
.runCommandWithOutputHandling(command, tempInputFile.getParent().toFile());
} else {
returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.WEASYPRINT)
.runCommandWithOutputHandling(command);
}
pdfBytes = Files.readAllBytes(tempOutputFile);
} finally {
// Clean up temporary files
Files.delete(tempOutputFile);
Files.delete(tempInputFile);
if (originalFilename.endsWith(".zip")) {
GeneralUtils.deleteDirectory(tempInputFile.getParent());
}
}
String outputFilename = originalFilename.replaceFirst("[.][^.]+$", "") + ".pdf"; // Remove file extension and append .pdf
return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename);
}
private Path unzipAndGetMainHtml(MultipartFile zipFile) throws IOException {
Path tempDirectory = Files.createTempDirectory("unzipped_");
try (ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(zipFile.getBytes()))) {
ZipEntry entry = zipIn.getNextEntry();
while (entry != null) {
Path filePath = tempDirectory.resolve(entry.getName());
if (entry.isDirectory()) {
Files.createDirectories(filePath); // Explicitly create the directory structure
} else {
Files.createDirectories(filePath.getParent()); // Create parent directories if they don't exist
Files.copy(zipIn, filePath);
}
zipIn.closeEntry();
entry = zipIn.getNextEntry();
}
}
//search for the main HTML file.
try (Stream<Path> walk = Files.walk(tempDirectory)) {
List<Path> htmlFiles = walk.filter(file -> file.toString().endsWith(".html"))
.collect(Collectors.toList());
if (htmlFiles.isEmpty()) {
throw new IOException("No HTML files found in the unzipped directory.");
}
// Prioritize 'index.html' if it exists, otherwise use the first .html file
for (Path htmlFile : htmlFiles) {
if (htmlFile.getFileName().toString().equals("index.html")) {
return htmlFile;
}
}
return htmlFiles.get(0);
}
}
}

View File

@@ -20,15 +20,18 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.PdfUtils; import stirling.software.SPDF.utils.PdfUtils;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "Convert", description = "Convert APIs")
public class ConvertImgPDFController { public class ConvertImgPDFController {
private static final Logger logger = LoggerFactory.getLogger(ConvertImgPDFController.class); private static final Logger logger = LoggerFactory.getLogger(ConvertImgPDFController.class);
@PostMapping(consumes = "multipart/form-data", value = "/pdf-to-img") @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-img")
@Operation(summary = "Convert PDF to image(s)", @Operation(summary = "Convert PDF to image(s)",
description = "This endpoint converts a PDF file to image(s) with the specified image format, color type, and DPI. Users can choose to get a single image or multiple images.") description = "This endpoint converts a PDF file to image(s) with the specified image format, color type, and DPI. Users can choose to get a single image or multiple images. Input:PDF Output:Image Type:SI-Conditional")
public ResponseEntity<Resource> convertToImage( public ResponseEntity<Resource> convertToImage(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@Parameter(description = "The input PDF file to be converted") @Parameter(description = "The input PDF file to be converted")
@@ -56,8 +59,9 @@ public class ConvertImgPDFController {
// returns bytes for image // returns bytes for image
boolean singleImage = singleOrMultiple.equals("single"); boolean singleImage = singleOrMultiple.equals("single");
byte[] result = null; byte[] result = null;
String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", "");
try { try {
result = PdfUtils.convertFromPdf(pdfBytes, imageFormat.toUpperCase(), colorTypeResult, singleImage, Integer.valueOf(dpi)); result = PdfUtils.convertFromPdf(pdfBytes, imageFormat.toUpperCase(), colorTypeResult, singleImage, Integer.valueOf(dpi), filename);
} catch (IOException e) { } catch (IOException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
@@ -74,14 +78,14 @@ public class ConvertImgPDFController {
ByteArrayResource resource = new ByteArrayResource(result); ByteArrayResource resource = new ByteArrayResource(result);
// return the Resource in the response // return the Resource in the response
return ResponseEntity.ok() return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_convertedToImages.zip") .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + filename + "_convertedToImages.zip")
.contentType(MediaType.APPLICATION_OCTET_STREAM).contentLength(resource.contentLength()).body(resource); .contentType(MediaType.APPLICATION_OCTET_STREAM).contentLength(resource.contentLength()).body(resource);
} }
} }
@PostMapping(consumes = "multipart/form-data", value = "/img-to-pdf") @PostMapping(consumes = "multipart/form-data", value = "/img-to-pdf")
@Operation(summary = "Convert images to a PDF file", @Operation(summary = "Convert images to a PDF file",
description = "This endpoint converts one or more images to a PDF file. Users can specify whether to stretch the images to fit the PDF page, and whether to automatically rotate the images.") description = "This endpoint converts one or more images to a PDF file. Users can specify whether to stretch the images to fit the PDF page, and whether to automatically rotate the images. Input:Image Output:PDF Type:SISO?")
public ResponseEntity<byte[]> convertToPdf( public ResponseEntity<byte[]> convertToPdf(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@Parameter(description = "The input images to be converted to a PDF file") @Parameter(description = "The input images to be converted to a PDF file")
@@ -97,7 +101,7 @@ public class ConvertImgPDFController {
boolean autoRotate) throws IOException { boolean autoRotate) throws IOException {
// Convert the file to PDF and get the resulting bytes // Convert the file to PDF and get the resulting bytes
byte[] bytes = PdfUtils.imageToPdf(file, stretchToFit, autoRotate, colorType); byte[] bytes = PdfUtils.imageToPdf(file, stretchToFit, autoRotate, colorType);
return PdfUtils.bytesToWebResponse(bytes, file[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_coverted.pdf"); return WebResponseUtils.bytesToWebResponse(bytes, file[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_converted.pdf");
} }
private String getMediaType(String imageFormat) { private String getMediaType(String imageFormat) {

View File

@@ -17,10 +17,12 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import stirling.software.SPDF.utils.PdfUtils; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "Convert", description = "Convert APIs")
public class ConvertOfficeController { public class ConvertOfficeController {
public byte[] convertToPdf(MultipartFile inputFile) throws IOException, InterruptedException { public byte[] convertToPdf(MultipartFile inputFile) throws IOException, InterruptedException {
@@ -57,8 +59,8 @@ public class ConvertOfficeController {
@PostMapping(consumes = "multipart/form-data", value = "/file-to-pdf") @PostMapping(consumes = "multipart/form-data", value = "/file-to-pdf")
@Operation( @Operation(
summary = "Convert a file to a PDF using OCR", summary = "Convert a file to a PDF using LibreOffice",
description = "This endpoint converts a given file to a PDF using Optical Character Recognition (OCR). The filename of the resulting PDF will be the original filename with '_convertedToPDF.pdf' appended." description = "This endpoint converts a given file to a PDF using LibreOffice API Input:Any Output:PDF Type:SISO"
) )
public ResponseEntity<byte[]> processPdfWithOCR( public ResponseEntity<byte[]> processPdfWithOCR(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@@ -72,7 +74,7 @@ public class ConvertOfficeController {
// LibreOfficeListener.getInstance().start(); // LibreOfficeListener.getInstance().start();
byte[] pdfByteArray = convertToPdf(inputFile); byte[] pdfByteArray = convertToPdf(inputFile);
return PdfUtils.bytesToWebResponse(pdfByteArray, inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_convertedToPDF.pdf"); return WebResponseUtils.bytesToWebResponse(pdfByteArray, inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_convertedToPDF.pdf");
} }
} }

View File

@@ -12,13 +12,15 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.PDFToFile; import stirling.software.SPDF.utils.PDFToFile;
@RestController @RestController
@Tag(name = "Convert", description = "Convert APIs")
public class ConvertPDFToOffice { public class ConvertPDFToOffice {
@PostMapping(consumes = "multipart/form-data", value = "/pdf-to-html") @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-html")
@Operation(summary = "Convert PDF to HTML", description = "This endpoint converts a PDF file to HTML format.") @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( public ResponseEntity<byte[]> processPdfToHTML(
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be converted to HTML format", required = true) MultipartFile inputFile) @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be converted to HTML format", required = true) MultipartFile inputFile)
throws IOException, InterruptedException { throws IOException, InterruptedException {
@@ -27,7 +29,7 @@ public class ConvertPDFToOffice {
} }
@PostMapping(consumes = "multipart/form-data", value = "/pdf-to-presentation") @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-presentation")
@Operation(summary = "Convert PDF to Presentation format", description = "This endpoint converts a given PDF file to a Presentation format.") @Operation(summary = "Convert PDF to Presentation format", description = "This endpoint converts a given PDF file to a Presentation format. Input:PDF Output:PPT Type:SISO")
public ResponseEntity<byte[]> processPdfToPresentation( public ResponseEntity<byte[]> processPdfToPresentation(
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file") MultipartFile inputFile, @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file") MultipartFile inputFile,
@RequestParam("outputFormat") @Parameter(description = "The output Presentation format", schema = @Schema(allowableValues = { @RequestParam("outputFormat") @Parameter(description = "The output Presentation format", schema = @Schema(allowableValues = {
@@ -38,7 +40,7 @@ public class ConvertPDFToOffice {
} }
@PostMapping(consumes = "multipart/form-data", value = "/pdf-to-text") @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-text")
@Operation(summary = "Convert PDF to Text or RTF format", description = "This endpoint converts a given PDF file to Text or RTF format.") @Operation(summary = "Convert PDF to Text or RTF format", description = "This endpoint converts a given PDF file to Text or RTF format. Input:PDF Output:TXT Type:SISO")
public ResponseEntity<byte[]> processPdfToRTForTXT( public ResponseEntity<byte[]> processPdfToRTForTXT(
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file") MultipartFile inputFile, @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file") MultipartFile inputFile,
@RequestParam("outputFormat") @Parameter(description = "The output Text or RTF format", schema = @Schema(allowableValues = { @RequestParam("outputFormat") @Parameter(description = "The output Text or RTF format", schema = @Schema(allowableValues = {
@@ -49,7 +51,7 @@ public class ConvertPDFToOffice {
} }
@PostMapping(consumes = "multipart/form-data", value = "/pdf-to-word") @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-word")
@Operation(summary = "Convert PDF to Word document", description = "This endpoint converts a given PDF file to a Word document format.") @Operation(summary = "Convert PDF to Word document", description = "This endpoint converts a given PDF file to a Word document format. Input:PDF Output:WORD Type:SISO")
public ResponseEntity<byte[]> processPdfToWord( public ResponseEntity<byte[]> processPdfToWord(
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file") MultipartFile inputFile, @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file") MultipartFile inputFile,
@RequestParam("outputFormat") @Parameter(description = "The output Word document format", schema = @Schema(allowableValues = { @RequestParam("outputFormat") @Parameter(description = "The output Word document format", schema = @Schema(allowableValues = {
@@ -60,7 +62,7 @@ public class ConvertPDFToOffice {
} }
@PostMapping(consumes = "multipart/form-data", value = "/pdf-to-xml") @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-xml")
@Operation(summary = "Convert PDF to XML", description = "This endpoint converts a PDF file to an XML file.") @Operation(summary = "Convert PDF to XML", description = "This endpoint converts a PDF file to an XML file. Input:PDF Output:XML Type:SISO")
public ResponseEntity<byte[]> processPdfToXML( public ResponseEntity<byte[]> processPdfToXML(
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be converted to an XML file", required = true) MultipartFile inputFile) @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be converted to an XML file", required = true) MultipartFile inputFile)
throws IOException, InterruptedException { throws IOException, InterruptedException {

View File

@@ -14,16 +14,18 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import stirling.software.SPDF.utils.PdfUtils; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "Convert", description = "Convert APIs")
public class ConvertPDFToPDFA { public class ConvertPDFToPDFA {
@PostMapping(consumes = "multipart/form-data", value = "/pdf-to-pdfa") @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-pdfa")
@Operation( @Operation(
summary = "Convert a PDF to a PDF/A", summary = "Convert a PDF to a PDF/A",
description = "This endpoint converts a PDF file to a PDF/A file. PDF/A is a format designed for long-term archiving of digital documents." description = "This endpoint converts a PDF file to a PDF/A file. PDF/A is a format designed for long-term archiving of digital documents. Input:PDF Output:PDF Type:SISO"
) )
public ResponseEntity<byte[]> pdfToPdfA( public ResponseEntity<byte[]> pdfToPdfA(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@@ -58,7 +60,7 @@ public class ConvertPDFToPDFA {
// Return the optimized PDF as a response // Return the optimized PDF as a response
String outputFilename = inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_PDFA.pdf"; String outputFilename = inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_PDFA.pdf";
return PdfUtils.bytesToWebResponse(pdfBytes, outputFilename); return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename);
} }
} }

View File

@@ -0,0 +1,76 @@
package stirling.software.SPDF.controller.api.converters;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
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.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.GeneralUtils;
import stirling.software.SPDF.utils.ProcessExecutor;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController
@Tag(name = "Convert", description = "Convert APIs")
public class ConvertWebsiteToPDF {
@PostMapping(consumes = "multipart/form-data", value = "/url-to-pdf")
@Operation(
summary = "Convert a URL to a PDF",
description = "This endpoint fetches content from a URL and converts it to a PDF format."
)
public ResponseEntity<byte[]> urlToPdf(
@RequestPart(required = true, value = "urlInput")
@Parameter(description = "The input URL to be converted to a PDF file", required = true)
String URL) throws IOException, InterruptedException {
// Validate the URL format
if(!URL.matches("^https?://.*") || !GeneralUtils.isValidURL(URL)) {
throw new IllegalArgumentException("Invalid URL format provided.");
}
Path tempOutputFile = null;
byte[] pdfBytes;
try {
// Prepare the output file path
tempOutputFile = Files.createTempFile("output_", ".pdf");
// Prepare the OCRmyPDF command
List<String> command = new ArrayList<>();
command.add("weasyprint");
command.add(URL);
command.add(tempOutputFile.toString());
int returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.WEASYPRINT).runCommandWithOutputHandling(command);
// Read the optimized PDF file
pdfBytes = Files.readAllBytes(tempOutputFile);
}
finally {
// Clean up the temporary files
Files.delete(tempOutputFile);
}
// Convert URL to a safe filename
String outputFilename = convertURLToFileName(URL);
return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename);
}
private String convertURLToFileName(String url) {
String safeName = url.replaceAll("[^a-zA-Z0-9]", "_");
if(safeName.length() > 50) {
safeName = safeName.substring(0, 50); // restrict to 50 characters
}
return safeName + ".pdf";
}
}

View File

@@ -0,0 +1,202 @@
package stirling.software.SPDF.controller.api.filters;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
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.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.PdfUtils;
import stirling.software.SPDF.utils.ProcessExecutor;
import stirling.software.SPDF.utils.WebResponseUtils;
import io.swagger.v3.oas.annotations.media.Schema;
@RestController
@Tag(name = "Filter", description = "Filter APIs")
public class FilterController {
@PostMapping(consumes = "multipart/form-data", value = "/filter-contains-text")
@Operation(summary = "Checks if a PDF contains set text, returns true if does", description = "Input:PDF Output:Boolean Type:SISO")
public ResponseEntity<byte[]> containsText(
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be converted to a PDF/A file", required = true) MultipartFile inputFile,
@Parameter(description = "The text to check for", required = true) String text,
@Parameter(description = "The page number to check for text on accepts 'All', ranges like '1-4'", required = false) String pageNumber)
throws IOException, InterruptedException {
PDDocument pdfDocument = PDDocument.load(inputFile.getInputStream());
if (PdfUtils.hasText(pdfDocument, pageNumber, text))
return WebResponseUtils.pdfDocToWebResponse(pdfDocument, inputFile.getOriginalFilename());
return null;
}
// TODO
@PostMapping(consumes = "multipart/form-data", value = "/filter-contains-image")
@Operation(summary = "Checks if a PDF contains an image", description = "Input:PDF Output:Boolean Type:SISO")
public ResponseEntity<byte[]> containsImage(
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be converted to a PDF/A file", required = true) MultipartFile inputFile,
@Parameter(description = "The page number to check for image on accepts 'All', ranges like '1-4'", required = false) String pageNumber)
throws IOException, InterruptedException {
PDDocument pdfDocument = PDDocument.load(inputFile.getInputStream());
if (PdfUtils.hasImages(pdfDocument, pageNumber))
return WebResponseUtils.pdfDocToWebResponse(pdfDocument, inputFile.getOriginalFilename());
return null;
}
@PostMapping(consumes = "multipart/form-data", value = "/filter-page-count")
@Operation(summary = "Checks if a PDF is greater, less or equal to a setPageCount", description = "Input:PDF Output:Boolean Type:SISO")
public ResponseEntity<byte[]> pageCount(
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file", required = true) MultipartFile inputFile,
@Parameter(description = "Page Count", required = true) String pageCount,
@Parameter(description = "Comparison type", schema = @Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = {
"Greater", "Equal", "Less" })) String comparator)
throws IOException, InterruptedException {
// Load the PDF
PDDocument document = PDDocument.load(inputFile.getInputStream());
int actualPageCount = document.getNumberOfPages();
boolean valid = false;
// Perform the comparison
switch (comparator) {
case "Greater":
valid = actualPageCount > Integer.parseInt(pageCount);
break;
case "Equal":
valid = actualPageCount == Integer.parseInt(pageCount);
break;
case "Less":
valid = actualPageCount < Integer.parseInt(pageCount);
break;
default:
throw new IllegalArgumentException("Invalid comparator: " + comparator);
}
if (valid)
return WebResponseUtils.multiPartFileToWebResponse(inputFile);
return null;
}
@PostMapping(consumes = "multipart/form-data", value = "/filter-page-size")
@Operation(summary = "Checks if a PDF is of a certain size", description = "Input:PDF Output:Boolean Type:SISO")
public ResponseEntity<byte[]> pageSize(
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file", required = true) MultipartFile inputFile,
@Parameter(description = "Standard Page Size", required = true) String standardPageSize,
@Parameter(description = "Comparison type", schema = @Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = {
"Greater", "Equal", "Less" })) String comparator)
throws IOException, InterruptedException {
// Load the PDF
PDDocument document = PDDocument.load(inputFile.getInputStream());
PDPage firstPage = document.getPage(0);
PDRectangle actualPageSize = firstPage.getMediaBox();
// Calculate the area of the actual page size
float actualArea = actualPageSize.getWidth() * actualPageSize.getHeight();
// Get the standard size and calculate its area
PDRectangle standardSize = PdfUtils.textToPageSize(standardPageSize);
float standardArea = standardSize.getWidth() * standardSize.getHeight();
boolean valid = false;
// Perform the comparison
switch (comparator) {
case "Greater":
valid = actualArea > standardArea;
break;
case "Equal":
valid = actualArea == standardArea;
break;
case "Less":
valid = actualArea < standardArea;
break;
default:
throw new IllegalArgumentException("Invalid comparator: " + comparator);
}
if (valid)
return WebResponseUtils.multiPartFileToWebResponse(inputFile);
return null;
}
@PostMapping(consumes = "multipart/form-data", value = "/filter-file-size")
@Operation(summary = "Checks if a PDF is a set file size", description = "Input:PDF Output:Boolean Type:SISO")
public ResponseEntity<byte[]> fileSize(
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file", required = true) MultipartFile inputFile,
@Parameter(description = "File Size", required = true) String fileSize,
@Parameter(description = "Comparison type", schema = @Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = {
"Greater", "Equal", "Less" })) String comparator)
throws IOException, InterruptedException {
// Get the file size
long actualFileSize = inputFile.getSize();
boolean valid = false;
// Perform the comparison
switch (comparator) {
case "Greater":
valid = actualFileSize > Long.parseLong(fileSize);
break;
case "Equal":
valid = actualFileSize == Long.parseLong(fileSize);
break;
case "Less":
valid = actualFileSize < Long.parseLong(fileSize);
break;
default:
throw new IllegalArgumentException("Invalid comparator: " + comparator);
}
if (valid)
return WebResponseUtils.multiPartFileToWebResponse(inputFile);
return null;
}
@PostMapping(consumes = "multipart/form-data", value = "/filter-page-rotation")
@Operation(summary = "Checks if a PDF is of a certain rotation", description = "Input:PDF Output:Boolean Type:SISO")
public ResponseEntity<byte[]> pageRotation(
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file", required = true) MultipartFile inputFile,
@Parameter(description = "Rotation in degrees", required = true) int rotation,
@Parameter(description = "Comparison type", schema = @Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = {
"Greater", "Equal", "Less" })) String comparator)
throws IOException, InterruptedException {
// Load the PDF
PDDocument document = PDDocument.load(inputFile.getInputStream());
// Get the rotation of the first page
PDPage firstPage = document.getPage(0);
int actualRotation = firstPage.getRotation();
boolean valid = false;
// Perform the comparison
switch (comparator) {
case "Greater":
valid = actualRotation > rotation;
break;
case "Equal":
valid = actualRotation == rotation;
break;
case "Less":
valid = actualRotation < rotation;
break;
default:
throw new IllegalArgumentException("Invalid comparator: " + comparator);
}
if (valid)
return WebResponseUtils.multiPartFileToWebResponse(inputFile);
return null;
}
}

View File

@@ -0,0 +1,177 @@
package stirling.software.SPDF.controller.api.other;
import java.io.IOException;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
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.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.GeneralUtils;
import stirling.software.SPDF.utils.PdfUtils;
import stirling.software.SPDF.utils.WebResponseUtils;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.common.*;
import org.apache.pdfbox.pdmodel.PDPageContentStream.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.*;
import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.*;
import io.swagger.v3.oas.annotations.media.*;
import io.swagger.v3.oas.annotations.parameters.*;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.text.TextPosition;
import org.apache.tomcat.util.http.ResponseUtil;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.ArrayList;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import com.itextpdf.io.font.constants.StandardFonts;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.properties.TextAlignment;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import java.io.*;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.text.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.*;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.http.ResponseEntity;
@RestController
@Tag(name = "Other", description = "Other APIs")
public class AutoRenameController {
private static final Logger logger = LoggerFactory.getLogger(AutoRenameController.class);
private static final float TITLE_FONT_SIZE_THRESHOLD = 20.0f;
private static final int LINE_LIMIT = 11;
@PostMapping(consumes = "multipart/form-data", value = "/auto-rename")
@Operation(summary = "Extract header from PDF file", description = "This endpoint accepts a PDF file and attempts to extract its title or header based on heuristics. Input:PDF Output:PDF Type:SISO")
public ResponseEntity<byte[]> extractHeader(
@RequestPart(value = "fileInput") @Parameter(description = "The input PDF file from which the header is to be extracted.", required = true) MultipartFile file,
@RequestParam(required = false, defaultValue = "false") @Parameter(description = "Flag indicating whether to use the first text as a fallback if no suitable title is found. Defaults to false.", required = false) Boolean useFirstTextAsFallback)
throws Exception {
PDDocument document = PDDocument.load(file.getInputStream());
PDFTextStripper reader = new PDFTextStripper() {
class LineInfo {
String text;
float fontSize;
LineInfo(String text, float fontSize) {
this.text = text;
this.fontSize = fontSize;
}
}
List<LineInfo> lineInfos = new ArrayList<>();
StringBuilder lineBuilder = new StringBuilder();
float lastY = -1;
float maxFontSizeInLine = 0.0f;
int lineCount = 0;
@Override
protected void processTextPosition(TextPosition text) {
if (lastY != text.getY() && lineCount < LINE_LIMIT) {
processLine();
lineBuilder = new StringBuilder(text.getUnicode());
maxFontSizeInLine = text.getFontSizeInPt();
lastY = text.getY();
lineCount++;
} else if (lineCount < LINE_LIMIT) {
lineBuilder.append(text.getUnicode());
if (text.getFontSizeInPt() > maxFontSizeInLine) {
maxFontSizeInLine = text.getFontSizeInPt();
}
}
}
private void processLine() {
if (lineBuilder.length() > 0 && lineCount < LINE_LIMIT) {
lineInfos.add(new LineInfo(lineBuilder.toString(), maxFontSizeInLine));
}
}
@Override
public String getText(PDDocument doc) throws IOException {
this.lineInfos.clear();
this.lineBuilder = new StringBuilder();
this.lastY = -1;
this.maxFontSizeInLine = 0.0f;
this.lineCount = 0;
super.getText(doc);
processLine(); // Process the last line
// Merge lines with same font size
List<LineInfo> mergedLineInfos = new ArrayList<>();
for (int i = 0; i < lineInfos.size(); i++) {
String mergedText = lineInfos.get(i).text;
float fontSize = lineInfos.get(i).fontSize;
while (i + 1 < lineInfos.size() && lineInfos.get(i + 1).fontSize == fontSize) {
mergedText += " " + lineInfos.get(i + 1).text;
i++;
}
mergedLineInfos.add(new LineInfo(mergedText, fontSize));
}
// Sort lines by font size in descending order and get the first one
mergedLineInfos.sort(Comparator.comparing((LineInfo li) -> li.fontSize).reversed());
String title = mergedLineInfos.isEmpty() ? null : mergedLineInfos.get(0).text;
return title != null ? title : (useFirstTextAsFallback ? (mergedLineInfos.isEmpty() ? null : mergedLineInfos.get(mergedLineInfos.size() - 1).text) : null);
}
};
String header = reader.getText(document);
// Sanitize the header string by removing characters not allowed in a filename.
if (header != null && header.length() < 255) {
header = header.replaceAll("[/\\\\?%*:|\"<>]", "");
return WebResponseUtils.pdfDocToWebResponse(document, header + ".pdf");
} else {
logger.info("File has no good title to be found");
return WebResponseUtils.pdfDocToWebResponse(document, file.getOriginalFilename());
}
}
}

View File

@@ -0,0 +1,137 @@
package stirling.software.SPDF.controller.api.other;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.DataBufferInt;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.PlanarYUVLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import stirling.software.SPDF.utils.WebResponseUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@RestController
public class AutoSplitPdfController {
private static final String QR_CONTENT = "https://github.com/Frooodle/Stirling-PDF";
@PostMapping(value = "/auto-split-pdf", consumes = "multipart/form-data")
@Operation(summary = "Auto split PDF pages into separate documents", description = "This endpoint accepts a PDF file, scans each page for a specific QR code, and splits the document at the QR code boundaries. The output is a zip file containing each separate PDF document. Input:PDF Output:ZIP Type:SISO")
public ResponseEntity<byte[]> autoSplitPdf(
@RequestParam("fileInput") @Parameter(description = "The input PDF file which needs to be split into separate documents based on QR code boundaries.", required = true) MultipartFile file)
throws IOException {
InputStream inputStream = file.getInputStream();
PDDocument document = PDDocument.load(inputStream);
PDFRenderer pdfRenderer = new PDFRenderer(document);
List<PDDocument> splitDocuments = new ArrayList<>();
List<ByteArrayOutputStream> splitDocumentsBoas = new ArrayList<>(); // create this list to store ByteArrayOutputStreams for zipping
for (int page = 0; page < document.getNumberOfPages(); ++page) {
BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 150);
String result = decodeQRCode(bim);
if(QR_CONTENT.equals(result) && page != 0) {
splitDocuments.add(new PDDocument());
}
if (!splitDocuments.isEmpty() && !QR_CONTENT.equals(result)) {
splitDocuments.get(splitDocuments.size() - 1).addPage(document.getPage(page));
} else if (page == 0) {
PDDocument firstDocument = new PDDocument();
firstDocument.addPage(document.getPage(page));
splitDocuments.add(firstDocument);
}
}
// After all pages are added to splitDocuments, convert each to ByteArrayOutputStream and add to splitDocumentsBoas
for (PDDocument splitDocument : splitDocuments) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
splitDocument.save(baos);
splitDocumentsBoas.add(baos);
splitDocument.close();
}
document.close();
// After this line, you can find your zip logic integrated
Path zipFile = Files.createTempFile("split_documents", ".zip");
String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", "");
byte[] data;
try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) {
// loop through the split documents and write them to the zip file
for (int i = 0; i < splitDocumentsBoas.size(); i++) {
String fileName = filename + "_" + (i + 1) + ".pdf"; // You should replace "originalFileName" with the real file name
ByteArrayOutputStream baos = splitDocumentsBoas.get(i);
byte[] pdf = baos.toByteArray();
// Add PDF file to the zip
ZipEntry pdfEntry = new ZipEntry(fileName);
zipOut.putNextEntry(pdfEntry);
zipOut.write(pdf);
zipOut.closeEntry();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
data = Files.readAllBytes(zipFile);
Files.delete(zipFile);
}
// return the Resource in the response
return WebResponseUtils.bytesToWebResponse(data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM);
}
private static String decodeQRCode(BufferedImage bufferedImage) {
LuminanceSource source;
if (bufferedImage.getRaster().getDataBuffer() instanceof DataBufferByte) {
byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();
source = new PlanarYUVLuminanceSource(pixels, bufferedImage.getWidth(), bufferedImage.getHeight(), 0, 0, bufferedImage.getWidth(), bufferedImage.getHeight(), false);
} else if (bufferedImage.getRaster().getDataBuffer() instanceof DataBufferInt) {
int[] pixels = ((DataBufferInt) bufferedImage.getRaster().getDataBuffer()).getData();
byte[] newPixels = new byte[pixels.length];
for (int i = 0; i < pixels.length; i++) {
newPixels[i] = (byte) (pixels[i] & 0xff);
}
source = new PlanarYUVLuminanceSource(newPixels, bufferedImage.getWidth(), bufferedImage.getHeight(), 0, 0, bufferedImage.getWidth(), bufferedImage.getHeight(), false);
} else {
throw new IllegalArgumentException("BufferedImage must have 8-bit gray scale, 24-bit RGB, 32-bit ARGB (packed int), byte gray, or 3-byte/4-byte RGB image data");
}
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
try {
Result result = new MultiFormatReader().decode(bitmap);
return result.getText();
} catch (NotFoundException e) {
return null; // there is no QR code in the image
}
}
}

View File

@@ -28,17 +28,19 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import stirling.software.SPDF.utils.ImageFinder; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.PdfUtils; import stirling.software.SPDF.utils.PdfUtils;
import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "Other", description = "Other APIs")
public class BlankPageController { public class BlankPageController {
@PostMapping(consumes = "multipart/form-data", value = "/remove-blanks") @PostMapping(consumes = "multipart/form-data", value = "/remove-blanks")
@Operation( @Operation(
summary = "Remove blank pages from a PDF file", summary = "Remove blank pages from a PDF file",
description = "This endpoint removes blank pages from a given PDF file. Users can specify the threshold and white percentage to tune the detection of blank pages." description = "This endpoint removes blank pages from a given PDF file. Users can specify the threshold and white percentage to tune the detection of blank pages. Input:PDF Output:PDF Type:SISO"
) )
public ResponseEntity<byte[]> removeBlankPages( public ResponseEntity<byte[]> removeBlankPages(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@@ -71,7 +73,7 @@ public class BlankPageController {
pagesToKeepIndex.add(pageIndex); pagesToKeepIndex.add(pageIndex);
System.out.println("page " + pageIndex + " has text"); System.out.println("page " + pageIndex + " has text");
} else { } else {
boolean hasImages = hasImagesOnPage(page); boolean hasImages = PdfUtils.hasImagesOnPage(page);
if (hasImages) { if (hasImages) {
System.out.println("page " + pageIndex + " has image"); System.out.println("page " + pageIndex + " has image");
@@ -81,7 +83,7 @@ public class BlankPageController {
BufferedImage image = pdfRenderer.renderImageWithDPI(pageIndex, 300); BufferedImage image = pdfRenderer.renderImageWithDPI(pageIndex, 300);
ImageIO.write(image, "png", tempFile.toFile()); ImageIO.write(image, "png", tempFile.toFile());
List<String> command = new ArrayList<>(Arrays.asList("python3", System.getProperty("user.dir") + "scripts/detect-blank-pages.py", tempFile.toString() ,"--threshold", String.valueOf(threshold), "--white_percent", String.valueOf(whitePercent))); List<String> command = new ArrayList<>(Arrays.asList("python3", System.getProperty("user.dir") + "/scripts/detect-blank-pages.py", tempFile.toString() ,"--threshold", String.valueOf(threshold), "--white_percent", String.valueOf(whitePercent)));
// Run CLI command // Run CLI command
int returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.PYTHON_OPENCV).runCommandWithOutputHandling(command); int returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.PYTHON_OPENCV).runCommandWithOutputHandling(command);
@@ -109,7 +111,7 @@ public class BlankPageController {
} }
} }
return PdfUtils.pdfDocToWebResponse(document, inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_blanksRemoved.pdf"); return WebResponseUtils.pdfDocToWebResponse(document, inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_blanksRemoved.pdf");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
@@ -120,9 +122,5 @@ public class BlankPageController {
} }
private static boolean hasImagesOnPage(PDPage page) throws IOException {
ImageFinder imageFinder = new ImageFinder(page);
imageFinder.processPage(page);
return imageFinder.hasImages();
}
} }

View File

@@ -1,11 +1,24 @@
package stirling.software.SPDF.controller.api.other; package stirling.software.SPDF.controller.api.other;
import java.io.IOException; import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
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;
import java.util.List; import java.util.List;
import javax.imageio.ImageIO;
import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -17,78 +30,213 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import stirling.software.SPDF.utils.PdfUtils;
import stirling.software.SPDF.utils.ProcessExecutor;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.GeneralUtils;
import stirling.software.SPDF.utils.ProcessExecutor;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "Other", description = "Other APIs")
public class CompressController { public class CompressController {
private static final Logger logger = LoggerFactory.getLogger(CompressController.class); private static final Logger logger = LoggerFactory.getLogger(CompressController.class);
@PostMapping(consumes = "multipart/form-data", value = "/compress-pdf") @PostMapping(consumes = "multipart/form-data", value = "/compress-pdf")
@Operation( @Operation(summary = "Optimize PDF file", description = "This endpoint accepts a PDF file and optimizes it based on the provided parameters. Input:PDF Output:PDF Type:SISO")
summary = "Optimize PDF file",
description = "This endpoint accepts a PDF file and optimizes it based on the provided parameters."
)
public ResponseEntity<byte[]> optimizePdf( public ResponseEntity<byte[]> optimizePdf(
@RequestPart(required = true, value = "fileInput") @RequestPart(value = "fileInput") @Parameter(description = "The input PDF file to be optimized.", required = true) MultipartFile inputFile,
@Parameter(description = "The input PDF file to be optimized.", required = true) @RequestParam(required = false, value = "optimizeLevel") @Parameter(description = "The level of optimization to apply to the PDF file. Higher values indicate greater compression but may reduce quality.", schema = @Schema(allowableValues = {
MultipartFile inputFile, "1", "2", "3", "4", "5" })) Integer optimizeLevel,
@RequestParam("optimizeLevel") @RequestParam(value = "expectedOutputSize", required = false) @Parameter(description = "The expected output size, e.g. '100MB', '25KB', etc.", required = false) String expectedOutputSizeString)
@Parameter(description = "The level of optimization to apply to the PDF file. Higher values indicate greater compression but may reduce quality.", throws Exception {
schema = @Schema(allowableValues = {"0", "1", "2", "3"}), example = "1")
int optimizeLevel, if(expectedOutputSizeString == null && optimizeLevel == null) {
@RequestParam(name = "fastWebView", required = false) throw new Exception("Both expected output size and optimize level are not specified");
@Parameter(description = "If true, optimize the PDF for fast web view. This increases the file size by about 25%.", example = "false") }
Boolean fastWebView,
@RequestParam(name = "jbig2Lossy", required = false) Long expectedOutputSize = 0L;
@Parameter(description = "If true, apply lossy JB2 compression to the PDF file.", example = "false") boolean autoMode = false;
Boolean jbig2Lossy) if (expectedOutputSizeString != null && expectedOutputSizeString.length() > 1 ) {
throws IOException, InterruptedException { expectedOutputSize = GeneralUtils.convertSizeToBytes(expectedOutputSizeString);
autoMode = true;
}
// 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");
inputFile.transferTo(tempInputFile.toFile()); inputFile.transferTo(tempInputFile.toFile());
long inputFileSize = Files.size(tempInputFile);
// Prepare the output file path // Prepare the output file path
Path tempOutputFile = Files.createTempFile("output_", ".pdf"); Path tempOutputFile = Files.createTempFile("output_", ".pdf");
// Prepare the OCRmyPDF command // Determine initial optimization level based on expected size reduction, only if in autoMode
List<String> command = new ArrayList<>(); if(autoMode) {
command.add("ocrmypdf"); double sizeReductionRatio = expectedOutputSize / (double) inputFileSize;
command.add("--skip-text"); if (sizeReductionRatio > 0.7) {
command.add("--tesseract-timeout=0"); optimizeLevel = 1;
command.add("--optimize"); } else if (sizeReductionRatio > 0.5) {
command.add(String.valueOf(optimizeLevel)); optimizeLevel = 2;
command.add("--output-type"); } else if (sizeReductionRatio > 0.35) {
command.add("pdf"); optimizeLevel = 3;
} else {
if (fastWebView != null && fastWebView) { optimizeLevel = 3;
long fileSize = inputFile.getSize(); }
long fastWebViewSize = (long) (fileSize * 1.25); // 25% higher than file size
command.add("--fast-web-view");
command.add(String.valueOf(fastWebViewSize));
} }
if (jbig2Lossy != null && jbig2Lossy) { boolean sizeMet = false;
command.add("--jbig2-lossy"); 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());
int 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) {
} else {
System.out.println("Increasing ghostscript optimisation level to " + optimizeLevel);
}
}
} }
command.add(tempInputFile.toString());
command.add(tempOutputFile.toString());
int returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.OCR_MY_PDF).runCommandWithOutputHandling(command);
if (expectedOutputSize != null && autoMode) {
long outputFileSize = Files.size(tempOutputFile);
if (outputFileSize > expectedOutputSize) {
try (PDDocument doc = PDDocument.load(new File(tempOutputFile.toString()))) {
long previousFileSize = 0;
double scaleFactor = 1.0;
while (true) {
for (PDPage page : doc.getPages()) {
PDResources res = page.getResources();
for (COSName name : res.getXObjectNames()) {
PDXObject xobj = res.getXObject(name);
if (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() * scaleFactor);
int newHeight = (int)(bufferedImage.getHeight() * scaleFactor);
// 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();
// 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
doc.save(tempOutputFile.toString());
long currentSize = Files.size(tempOutputFile);
// Check if the overall PDF size is still larger than expectedOutputSize
if (currentSize > expectedOutputSize) {
// Log the current file size and scaleFactor
System.out.println("Current file size: " + FileUtils.byteCountToDisplaySize(currentSize));
System.out.println("Current scale factor: " + scaleFactor);
// The file is still too large, reduce scaleFactor and try again
scaleFactor *= 0.9; // reduce scaleFactor by 10%
// Avoid scaleFactor being too small, causing the image to shrink to 0
if(scaleFactor < 0.2 || previousFileSize == currentSize){
throw new RuntimeException("Could not reach the desired size without excessively degrading image quality, lowest size recommended is " + FileUtils.byteCountToDisplaySize(currentSize) + ", " + currentSize + " bytes");
}
previousFileSize = currentSize;
} else {
// The file is small enough, break the loop
break;
}
}
}
}
}
// Read the optimized PDF file // Read the optimized PDF file
byte[] pdfBytes = Files.readAllBytes(tempOutputFile); 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 // Clean up the temporary files
Files.delete(tempInputFile); Files.delete(tempInputFile);
Files.delete(tempOutputFile); Files.delete(tempOutputFile);
// Return the optimized PDF as a response // Return the optimized PDF as a response
String outputFilename = inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_Optimized.pdf"; String outputFilename = inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_Optimized.pdf";
return PdfUtils.bytesToWebResponse(pdfBytes, outputFilename); return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename);
} }
} }

View File

@@ -31,17 +31,19 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import stirling.software.SPDF.utils.PdfUtils; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "Other", description = "Other APIs")
public class ExtractImageScansController { public class ExtractImageScansController {
private static final Logger logger = LoggerFactory.getLogger(ExtractImageScansController.class); private static final Logger logger = LoggerFactory.getLogger(ExtractImageScansController.class);
@PostMapping(consumes = "multipart/form-data", value = "/extract-image-scans") @PostMapping(consumes = "multipart/form-data", value = "/extract-image-scans")
@Operation(summary = "Extract image scans from an input file", @Operation(summary = "Extract image scans from an input file",
description = "This endpoint extracts image scans from a given file based on certain parameters. Users can specify angle threshold, tolerance, minimum area, minimum contour area, and border size.") description = "This endpoint extracts image scans from a given file based on certain parameters. Users can specify angle threshold, tolerance, minimum area, minimum contour area, and border size. Input:PDF Output:IMAGE/ZIP Type:SIMO")
public ResponseEntity<byte[]> extractImageScans( public ResponseEntity<byte[]> extractImageScans(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@Parameter(description = "The input file containing image scans") @Parameter(description = "The input file containing image scans")
@@ -147,11 +149,11 @@ public class ExtractImageScansController {
// Clean up the temporary zip file // Clean up the temporary zip file
Files.delete(tempZipFile); Files.delete(tempZipFile);
return PdfUtils.bytesToWebResponse(zipBytes, outputZipFilename, MediaType.APPLICATION_OCTET_STREAM); return WebResponseUtils.bytesToWebResponse(zipBytes, outputZipFilename, MediaType.APPLICATION_OCTET_STREAM);
} else { } else {
// Return the processed image as a response // Return the processed image as a response
byte[] imageBytes = processedImageBytes.get(0); byte[] imageBytes = processedImageBytes.get(0);
return PdfUtils.bytesToWebResponse(imageBytes, fileName.replaceFirst("[.][^.]+$", "") + ".png", MediaType.IMAGE_PNG); return WebResponseUtils.bytesToWebResponse(imageBytes, fileName.replaceFirst("[.][^.]+$", "") + ".png", MediaType.IMAGE_PNG);
} }
} }

View File

@@ -29,15 +29,17 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import stirling.software.SPDF.utils.PdfUtils; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "Other", description = "Other APIs")
public class ExtractImagesController { public class ExtractImagesController {
private static final Logger logger = LoggerFactory.getLogger(ExtractImagesController.class); private static final Logger logger = LoggerFactory.getLogger(ExtractImagesController.class);
@PostMapping(consumes = "multipart/form-data", value = "/extract-images") @PostMapping(consumes = "multipart/form-data", value = "/extract-images")
@Operation(summary = "Extract images from a PDF file", @Operation(summary = "Extract images from a PDF file",
description = "This endpoint extracts images from a given PDF file and returns them in a zip file. Users can specify the output image format.") description = "This endpoint extracts images from a given PDF file and returns them in a zip file. Users can specify the output image format. Input:PDF Output:IMAGE/ZIP Type:SIMO")
public ResponseEntity<byte[]> extractImages( public ResponseEntity<byte[]> extractImages(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@Parameter(description = "The input PDF file containing images") @Parameter(description = "The input PDF file containing images")
@@ -59,7 +61,7 @@ public class ExtractImagesController {
zos.setLevel(Deflater.BEST_COMPRESSION); zos.setLevel(Deflater.BEST_COMPRESSION);
int imageIndex = 1; int imageIndex = 1;
String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", "");
int pageNum = 1; int pageNum = 1;
// Iterate over each page // Iterate over each page
for (PDPage page : document.getPages()) { for (PDPage page : document.getPages()) {
@@ -81,7 +83,7 @@ public class ExtractImagesController {
} }
// Write image to zip file // Write image to zip file
String imageName = "Image " + imageIndex + " (Page " + pageNum + ")." + format; String imageName = filename + "_" + imageIndex + " (Page " + pageNum + ")." + format;
ZipEntry zipEntry = new ZipEntry(imageName); ZipEntry zipEntry = new ZipEntry(imageName);
zos.putNextEntry(zipEntry); zos.putNextEntry(zipEntry);
@@ -106,7 +108,7 @@ public class ExtractImagesController {
// Create ByteArrayResource from byte array // Create ByteArrayResource from byte array
byte[] zipContents = baos.toByteArray(); byte[] zipContents = baos.toByteArray();
return PdfUtils.boasToWebResponse(baos, file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_extracted-images.zip", MediaType.APPLICATION_OCTET_STREAM); return WebResponseUtils.boasToWebResponse(baos, filename + "_extracted-images.zip", MediaType.APPLICATION_OCTET_STREAM);
} }
} }

View File

@@ -0,0 +1,151 @@
package stirling.software.SPDF.controller.api.other;
import java.awt.Color;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
//Required for image manipulation
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.awt.image.RescaleOp;
//Required for file input/output
import java.io.File;
import java.io.IOException;
//Other required classes
import java.util.Random;
//Required for image input/output
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.itextpdf.io.source.ByteArrayOutputStream;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController
@Tag(name = "Other", description = "Other APIs")
public class FakeScanControllerWIP {
private static final Logger logger = LoggerFactory.getLogger(FakeScanControllerWIP.class);
//TODO
@Hidden
@PostMapping(consumes = "multipart/form-data", value = "/fakeScan")
@Operation(
summary = "Repair a PDF file",
description = "This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response."
)
public ResponseEntity<byte[]> repairPdf(
@RequestPart(required = true, value = "fileInput")
@Parameter(description = "The input PDF file to be repaired", required = true)
MultipartFile inputFile) throws IOException, InterruptedException {
PDDocument document = PDDocument.load(inputFile.getBytes());
PDFRenderer pdfRenderer = new PDFRenderer(document);
for (int page = 0; page < document.getNumberOfPages(); ++page)
{
BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
ImageIO.write(image, "png", new File("scanned-" + (page+1) + ".png"));
}
document.close();
// Constants
int scannedness = 90; // Value between 0 and 100
int dirtiness = 0; // Value between 0 and 100
// Load the source image
BufferedImage sourceImage = ImageIO.read(new File("scanned-1.png"));
// Create the destination image
BufferedImage destinationImage = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), sourceImage.getType());
// Apply a brightness and contrast effect based on the "scanned-ness"
float scaleFactor = 1.0f + (scannedness / 100.0f) * 0.5f; // Between 1.0 and 1.5
float offset = scannedness * 1.5f; // Between 0 and 150
BufferedImageOp op = new RescaleOp(scaleFactor, offset, null);
op.filter(sourceImage, destinationImage);
// Apply a rotation effect
double rotationRequired = Math.toRadians((new Random().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 Random();
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();
documentOut.save(baos);
documentOut.close();
// Return the optimized PDF as a response
String outputFilename = inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_scanned.pdf";
return WebResponseUtils.boasToWebResponse(baos, outputFilename);
}
}

View File

@@ -19,9 +19,11 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import stirling.software.SPDF.utils.PdfUtils; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "Other", description = "Other APIs")
public class MetadataController { public class MetadataController {
@@ -38,7 +40,7 @@ public class MetadataController {
@PostMapping(consumes = "multipart/form-data", value = "/update-metadata") @PostMapping(consumes = "multipart/form-data", value = "/update-metadata")
@Operation(summary = "Update metadata of a PDF file", @Operation(summary = "Update metadata of a PDF file",
description = "This endpoint allows you to update the metadata of a given PDF file. You can add, modify, or delete standard and custom metadata fields.") description = "This endpoint allows you to update the metadata of a given PDF file. You can add, modify, or delete standard and custom metadata fields. Input:PDF Output:PDF Type:SISO")
public ResponseEntity<byte[]> metadata( public ResponseEntity<byte[]> metadata(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@Parameter(description = "The input PDF file to update metadata") @Parameter(description = "The input PDF file to update metadata")
@@ -73,6 +75,7 @@ public class MetadataController {
@RequestParam(value = "trapped", required = false) @RequestParam(value = "trapped", required = false)
@Parameter(description = "The trapped status of the document") @Parameter(description = "The trapped status of the document")
String trapped, String trapped,
@Parameter(description = "Map list of key and value of custom parameters, note these must start with customKey and customValue if they are non standard")
@RequestParam Map<String, String> allRequestParams) @RequestParam Map<String, String> allRequestParams)
throws IOException { throws IOException {
@@ -159,7 +162,7 @@ public class MetadataController {
info.setTrapped(trapped); info.setTrapped(trapped);
document.setDocumentInformation(info); document.setDocumentInformation(info);
return PdfUtils.pdfDocToWebResponse(document, pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_metadata.pdf"); return WebResponseUtils.pdfDocToWebResponse(document, pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_metadata.pdf");
} }
} }

View File

@@ -27,10 +27,12 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import stirling.software.SPDF.utils.PdfUtils; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "Other", description = "Other APIs")
public class OCRController { public class OCRController {
private static final Logger logger = LoggerFactory.getLogger(OCRController.class); private static final Logger logger = LoggerFactory.getLogger(OCRController.class);
@@ -47,7 +49,7 @@ public class OCRController {
@PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf") @PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf")
@Operation(summary = "Process a PDF file with OCR", @Operation(summary = "Process a PDF file with OCR",
description = "This endpoint processes a PDF file using OCR (Optical Character Recognition). Users can specify languages, sidecar, deskew, clean, cleanFinal, ocrType, ocrRenderType, and removeImagesAfter options.") description = "This endpoint processes a PDF file using OCR (Optical Character Recognition). Users can specify languages, sidecar, deskew, clean, cleanFinal, ocrType, ocrRenderType, and removeImagesAfter options. Input:PDF Output:PDF Type:SI-Conditional")
public ResponseEntity<byte[]> processPdfWithOCR( public ResponseEntity<byte[]> processPdfWithOCR(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@Parameter(description = "The input PDF file to be processed with OCR") @Parameter(description = "The input PDF file to be processed with OCR")
@@ -189,11 +191,11 @@ public class OCRController {
Files.delete(sidecarTextPath); Files.delete(sidecarTextPath);
// Return the zip file containing both the PDF and the text file // Return the zip file containing both the PDF and the text file
return PdfUtils.bytesToWebResponse(pdfBytes, outputZipFilename, MediaType.APPLICATION_OCTET_STREAM); return WebResponseUtils.bytesToWebResponse(zipBytes, outputZipFilename, MediaType.APPLICATION_OCTET_STREAM);
} else { } else {
// Return the OCR processed PDF as a response // Return the OCR processed PDF as a response
Files.delete(tempOutputFile); Files.delete(tempOutputFile);
return PdfUtils.bytesToWebResponse(pdfBytes, outputFilename); return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename);
} }
} }

View File

@@ -14,9 +14,12 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.PdfUtils; import stirling.software.SPDF.utils.PdfUtils;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "Other", description = "Other APIs")
public class OverlayImageController { public class OverlayImageController {
private static final Logger logger = LoggerFactory.getLogger(OverlayImageController.class); private static final Logger logger = LoggerFactory.getLogger(OverlayImageController.class);
@@ -24,7 +27,7 @@ public class OverlayImageController {
@PostMapping(consumes = "multipart/form-data", value = "/add-image") @PostMapping(consumes = "multipart/form-data", value = "/add-image")
@Operation( @Operation(
summary = "Overlay image onto a PDF file", summary = "Overlay image onto a PDF file",
description = "This endpoint overlays an image onto a PDF file at the specified coordinates. The image can be overlaid on every page of the PDF if specified." description = "This endpoint overlays an image onto a PDF file at the specified coordinates. The image can be overlaid on every page of the PDF if specified. Input:PDF/IMAGE Output:PDF Type:MF-SISO"
) )
public ResponseEntity<byte[]> overlayImage( public ResponseEntity<byte[]> overlayImage(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@@ -47,7 +50,7 @@ public class OverlayImageController {
byte[] imageBytes = imageFile.getBytes(); byte[] imageBytes = imageFile.getBytes();
byte[] result = PdfUtils.overlayImage(pdfBytes, imageBytes, x, y, everyPage); byte[] result = PdfUtils.overlayImage(pdfBytes, imageBytes, x, y, everyPage);
return PdfUtils.bytesToWebResponse(result, pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_overlayed.pdf"); return WebResponseUtils.bytesToWebResponse(result, pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_overlayed.pdf");
} catch (IOException e) { } catch (IOException e) {
logger.error("Failed to add image to PDF", e); logger.error("Failed to add image to PDF", e);
return new ResponseEntity<>(HttpStatus.BAD_REQUEST); return new ResponseEntity<>(HttpStatus.BAD_REQUEST);

View File

@@ -0,0 +1,174 @@
package stirling.software.SPDF.controller.api.other;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
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.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.GeneralUtils;
import stirling.software.SPDF.utils.PdfUtils;
import stirling.software.SPDF.utils.WebResponseUtils;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.common.*;
import org.apache.pdfbox.pdmodel.PDPageContentStream.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.*;
import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.*;
import io.swagger.v3.oas.annotations.media.*;
import io.swagger.v3.oas.annotations.parameters.*;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.tomcat.util.http.ResponseUtil;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import com.itextpdf.io.font.constants.StandardFonts;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.properties.TextAlignment;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import java.io.*;
@RestController
@Tag(name = "Other", description = "Other APIs")
public class PageNumbersController {
private static final Logger logger = LoggerFactory.getLogger(PageNumbersController.class);
@PostMapping(value = "/add-page-numbers", consumes = "multipart/form-data")
@Operation(summary = "Add page numbers to a PDF document", description = "This operation takes an input PDF file and adds page numbers to it. Input:PDF Output:PDF Type:SISO")
public ResponseEntity<byte[]> addPageNumbers(
@Parameter(description = "The input PDF file", required = true) @RequestParam("fileInput") MultipartFile file,
@Parameter(description = "Custom margin: small/medium/large", required = true, schema = @Schema(type = "string", allowableValues = {"small", "medium", "large"})) @RequestParam("customMargin") String customMargin,
@Parameter(description = "Position: 1 of 9 positions", required = true, schema = @Schema(type = "integer", minimum = "1", maximum = "9")) @RequestParam("position") int position,
@Parameter(description = "Starting number", required = true, schema = @Schema(type = "integer", minimum = "1")) @RequestParam("startingNumber") int startingNumber,
@Parameter(description = "Which pages to number, default all", required = false, schema = @Schema(type = "string")) @RequestParam(value = "pagesToNumber", required = false) String pagesToNumber,
@Parameter(description = "Custom text: defaults to just number but can have things like \"Page {n} of {p}\"", required = false, schema = @Schema(type = "string")) @RequestParam(value = "customText", required = false) String customText)
throws IOException {
byte[] fileBytes = file.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(fileBytes);
int pageNumber = startingNumber;
float marginFactor;
switch (customMargin.toLowerCase()) {
case "small":
marginFactor = 0.02f;
break;
case "medium":
marginFactor = 0.035f;
break;
case "large":
marginFactor = 0.05f;
break;
case "x-large":
marginFactor = 0.1f;
break;
default:
marginFactor = 0.035f;
break;
}
float fontSize = 12.0f;
PdfReader reader = new PdfReader(bais);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(baos);
PdfDocument pdfDoc = new PdfDocument(reader, writer);
List<Integer> pagesToNumberList = GeneralUtils.parsePageList(pagesToNumber.split(","), pdfDoc.getNumberOfPages());
for (int i : pagesToNumberList) {
PdfPage page = pdfDoc.getPage(i+1);
Rectangle pageSize = page.getPageSize();
PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), pdfDoc);
String text = customText != null ? customText.replace("{n}", String.valueOf(pageNumber)).replace("{total}", String.valueOf(pdfDoc.getNumberOfPages())) : String.valueOf(pageNumber);
PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA);
float textWidth = font.getWidth(text, fontSize);
float textHeight = font.getAscent(text, fontSize) - font.getDescent(text, fontSize);
float x, y;
TextAlignment alignment;
int xGroup = (position - 1) % 3;
int yGroup = 2 - (position - 1) / 3;
switch (xGroup) {
case 0: // left
x = pageSize.getLeft() + marginFactor * pageSize.getWidth();
alignment = TextAlignment.LEFT;
break;
case 1: // center
x = pageSize.getLeft() + (pageSize.getWidth()) / 2;
alignment = TextAlignment.CENTER;
break;
default: // right
x = pageSize.getRight() - marginFactor * pageSize.getWidth();
alignment = TextAlignment.RIGHT;
break;
}
switch (yGroup) {
case 0: // bottom
y = pageSize.getBottom() + marginFactor * pageSize.getHeight();
break;
case 1: // middle
y = pageSize.getBottom() + (pageSize.getHeight() ) / 2;
break;
default: // top
y = pageSize.getTop() - marginFactor * pageSize.getHeight();
break;
}
new Canvas(pdfCanvas, page.getPageSize())
.showTextAligned(new Paragraph(text).setFont(font).setFontSize(fontSize), x, y, alignment);
pageNumber++;
}
pdfDoc.close();
byte[] resultBytes = baos.toByteArray();
return WebResponseUtils.bytesToWebResponse(resultBytes, URLEncoder.encode(file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_numbersAdded.pdf", "UTF-8"), MediaType.APPLICATION_PDF);
}
}

View File

@@ -16,10 +16,12 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import stirling.software.SPDF.utils.PdfUtils; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "Other", description = "Other APIs")
public class RepairController { public class RepairController {
private static final Logger logger = LoggerFactory.getLogger(RepairController.class); private static final Logger logger = LoggerFactory.getLogger(RepairController.class);
@@ -27,7 +29,7 @@ public class RepairController {
@PostMapping(consumes = "multipart/form-data", value = "/repair") @PostMapping(consumes = "multipart/form-data", value = "/repair")
@Operation( @Operation(
summary = "Repair a PDF file", summary = "Repair a PDF file",
description = "This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response." 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. Input:PDF Output:PDF Type:SISO"
) )
public ResponseEntity<byte[]> repairPdf( public ResponseEntity<byte[]> repairPdf(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@@ -60,7 +62,7 @@ public class RepairController {
// Return the optimized PDF as a response // Return the optimized PDF as a response
String outputFilename = inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_repaired.pdf"; String outputFilename = inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_repaired.pdf";
return PdfUtils.bytesToWebResponse(pdfBytes, outputFilename); return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename);
} }
} }

View File

@@ -0,0 +1,516 @@
package stirling.software.SPDF.controller.api.pipeline;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.model.PipelineConfig;
import stirling.software.SPDF.model.PipelineOperation;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController
@Tag(name = "Pipeline", description = "Pipeline APIs")
public class PipelineController {
private static final Logger logger = LoggerFactory.getLogger(PipelineController.class);
@Autowired
private ObjectMapper objectMapper;
final String jsonFileName = "pipelineConfig.json";
final String watchedFoldersDir = "./pipeline/watchedFolders/";
final String finishedFoldersDir = "./pipeline/finishedFolders/";
@Scheduled(fixedRate = 25000)
public void scanFolders() {
logger.info("Scanning folders...");
Path watchedFolderPath = Paths.get(watchedFoldersDir);
if (!Files.exists(watchedFolderPath)) {
try {
Files.createDirectories(watchedFolderPath);
logger.info("Created directory: {}", watchedFolderPath);
} catch (IOException e) {
logger.error("Error creating directory: {}", watchedFolderPath, e);
return;
}
}
try (Stream<Path> paths = Files.walk(watchedFolderPath)) {
paths.filter(Files::isDirectory).forEach(t -> {
try {
if (!t.equals(watchedFolderPath) && !t.endsWith("processing")) {
handleDirectory(t);
}
} catch (Exception e) {
logger.error("Error handling directory: {}", t, e);
}
});
} catch (Exception e) {
logger.error("Error walking through directory: {}", watchedFolderPath, e);
}
}
private void handleDirectory(Path dir) throws Exception {
logger.info("Handling directory: {}", dir);
Path jsonFile = dir.resolve(jsonFileName);
Path processingDir = dir.resolve("processing"); // Directory to move files during processing
if (!Files.exists(processingDir)) {
Files.createDirectory(processingDir);
logger.info("Created processing directory: {}", processingDir);
}
if (Files.exists(jsonFile)) {
// Read JSON file
String jsonString;
try {
jsonString = new String(Files.readAllBytes(jsonFile));
logger.info("Read JSON file: {}", jsonFile);
} catch (IOException e) {
logger.error("Error reading JSON file: {}", jsonFile, e);
return;
}
// Decode JSON to PipelineConfig
PipelineConfig config;
try {
config = objectMapper.readValue(jsonString, PipelineConfig.class);
// Assuming your PipelineConfig class has getters for all necessary fields, you
// can perform checks here
if (config.getOperations() == null || config.getOutputDir() == null || config.getName() == null) {
throw new IOException("Invalid JSON format");
}
} catch (IOException e) {
logger.error("Error parsing PipelineConfig: {}", jsonString, e);
return;
}
// For each operation in the pipeline
for (PipelineOperation operation : config.getOperations()) {
// Collect all files based on fileInput
File[] files;
String fileInput = (String) operation.getParameters().get("fileInput");
if ("automated".equals(fileInput)) {
// If fileInput is "automated", process all files in the directory
try (Stream<Path> paths = Files.list(dir)) {
files = paths
.filter(path -> !Files.isDirectory(path)) // exclude directories
.filter(path -> !path.equals(jsonFile)) // exclude jsonFile
.map(Path::toFile)
.toArray(File[]::new);
} catch (IOException e) {
e.printStackTrace();
return;
}
} else {
// If fileInput contains a path, process only this file
files = new File[] { new File(fileInput) };
}
// Prepare the files for processing
List<File> filesToProcess = new ArrayList<>();
for (File file : files) {
logger.info(file.getName());
logger.info("{} to {}",file.toPath(), processingDir.resolve(file.getName()));
Files.move(file.toPath(), processingDir.resolve(file.getName()));
filesToProcess.add(processingDir.resolve(file.getName()).toFile());
}
// Process the files
try {
List<Resource> resources = handleFiles(filesToProcess.toArray(new File[0]), jsonString);
if(resources == null) {
return;
}
// Move resultant files and rename them as per config in JSON file
for (Resource resource : resources) {
String resourceName = resource.getFilename();
String baseName = resourceName.substring(0, resourceName.lastIndexOf("."));
String extension = resourceName.substring(resourceName.lastIndexOf(".")+1);
String outputFileName = config.getOutputPattern().replace("{filename}", baseName);
outputFileName = outputFileName.replace("{pipelineName}", config.getName());
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
outputFileName = outputFileName.replace("{date}", LocalDate.now().format(dateFormatter));
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HHmmss");
outputFileName = outputFileName.replace("{time}", LocalTime.now().format(timeFormatter));
outputFileName += "." + extension;
// {filename} {folder} {date} {tmime} {pipeline}
String outputDir = config.getOutputDir();
// Check if the environment variable 'automatedOutputFolder' is set
String outputFolder = System.getenv("automatedOutputFolder");
if (outputFolder == null || outputFolder.isEmpty()) {
// If the environment variable is not set, use the default value
outputFolder = finishedFoldersDir;
}
logger.info("outputDir 0={}", outputDir);
// Replace the placeholders in the outputDir string
outputDir = outputDir.replace("{outputFolder}", outputFolder);
outputDir = outputDir.replace("{folderName}", dir.toString());
logger.info("outputDir 1={}", outputDir);
outputDir = outputDir.replace("\\watchedFolders", "");
outputDir = outputDir.replace("//watchedFolders", "");
outputDir = outputDir.replace("\\\\watchedFolders", "");
outputDir = outputDir.replace("/watchedFolders", "");
Path outputPath;
logger.info("outputDir 2={}", outputDir);
if (Paths.get(outputDir).isAbsolute()) {
// If it's an absolute path, use it directly
outputPath = Paths.get(outputDir);
} else {
// If it's a relative path, make it relative to the current working directory
outputPath = Paths.get(".", outputDir);
}
logger.info("outputPath={}", outputPath);
if (!Files.exists(outputPath)) {
try {
Files.createDirectories(outputPath);
logger.info("Created directory: {}", outputPath);
} catch (IOException e) {
logger.error("Error creating directory: {}", outputPath, e);
return;
}
}
logger.info("outputPath {}", outputPath);
logger.info("outputPath.resolve(outputFileName).toString() {}", outputPath.resolve(outputFileName).toString());
File newFile = new File(outputPath.resolve(outputFileName).toString());
OutputStream os = new FileOutputStream(newFile);
os.write(((ByteArrayResource)resource).getByteArray());
os.close();
logger.info("made {}", outputPath.resolve(outputFileName));
}
// If successful, delete the original files
for (File file : filesToProcess) {
Files.deleteIfExists(processingDir.resolve(file.getName()));
}
} catch (Exception e) {
// If an error occurs, move the original files back
for (File file : filesToProcess) {
Files.move(processingDir.resolve(file.getName()), file.toPath());
}
throw e;
}
}
}
}
List<Resource> processFiles(List<Resource> outputFiles, String jsonString) throws Exception {
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(jsonString);
JsonNode pipelineNode = jsonNode.get("pipeline");
logger.info("Running pipelineNode: {}", pipelineNode);
ByteArrayOutputStream logStream = new ByteArrayOutputStream();
PrintStream logPrintStream = new PrintStream(logStream);
boolean hasErrors = false;
for (JsonNode operationNode : pipelineNode) {
String operation = operationNode.get("operation").asText();
logger.info("Running operation: {}", operation);
JsonNode parametersNode = operationNode.get("parameters");
String inputFileExtension = "";
if (operationNode.has("inputFileType")) {
inputFileExtension = operationNode.get("inputFileType").asText();
} else {
inputFileExtension = ".pdf";
}
List<Resource> newOutputFiles = new ArrayList<>();
boolean hasInputFileType = false;
for (Resource file : outputFiles) {
if (file.getFilename().endsWith(inputFileExtension)) {
hasInputFileType = true;
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("fileInput", file);
Iterator<Map.Entry<String, JsonNode>> parameters = parametersNode.fields();
while (parameters.hasNext()) {
Map.Entry<String, JsonNode> parameter = parameters.next();
body.add(parameter.getKey(), parameter.getValue().asText());
}
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(body, headers);
RestTemplate restTemplate = new RestTemplate();
String url = "http://localhost:8080/" + operation;
ResponseEntity<byte[]> response = restTemplate.exchange(url, HttpMethod.POST, entity, byte[].class);
// If the operation is filter and the response body is null or empty, skip this file
if (operation.startsWith("filter-") && (response.getBody() == null || response.getBody().length == 0)) {
logger.info("Skipping file due to failing {}", operation);
continue;
}
if (!response.getStatusCode().equals(HttpStatus.OK)) {
logPrintStream.println("Error: " + response.getBody());
hasErrors = true;
continue;
}
// Define filename
String filename;
if ("auto-rename".equals(operation)) {
// If the operation is "auto-rename", generate a new filename.
// This is a simple example of generating a filename using current timestamp.
// Modify as per your needs.
filename = "file_" + System.currentTimeMillis();
} else {
// Otherwise, keep the original filename.
filename = file.getFilename();
}
// Check if the response body is a zip file
if (isZip(response.getBody())) {
// Unzip the file and add all the files to the new output files
newOutputFiles.addAll(unzip(response.getBody()));
} else {
Resource outputResource = new ByteArrayResource(response.getBody()) {
@Override
public String getFilename() {
return filename;
}
};
newOutputFiles.add(outputResource);
}
}
if (!hasInputFileType) {
logPrintStream.println(
"No files with extension " + inputFileExtension + " found for operation " + operation);
hasErrors = true;
}
outputFiles = newOutputFiles;
}
logPrintStream.close();
}
if (hasErrors) {
logger.error("Errors occurred during processing. Log: {}", logStream.toString());
}
return outputFiles;
}
List<Resource> handleFiles(File[] files, String jsonString) throws Exception {
if(files == null || files.length == 0) {
logger.info("No files");
return null;
}
logger.info("Handling files: {} files, with JSON string of length: {}", files.length, jsonString.length());
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(jsonString);
JsonNode pipelineNode = jsonNode.get("pipeline");
boolean hasErrors = false;
List<Resource> outputFiles = new ArrayList<>();
for (File file : files) {
Path path = Paths.get(file.getAbsolutePath());
System.out.println("Reading file: " + path); // debug statement
if (Files.exists(path)) {
Resource fileResource = new ByteArrayResource(Files.readAllBytes(path)) {
@Override
public String getFilename() {
return file.getName();
}
};
outputFiles.add(fileResource);
} else {
System.out.println("File not found: " + path); // debug statement
}
}
logger.info("Files successfully loaded. Starting processing...");
return processFiles(outputFiles, jsonString);
}
List<Resource> handleFiles(MultipartFile[] files, String jsonString) throws Exception {
if(files == null || files.length == 0) {
logger.info("No files");
return null;
}
logger.info("Handling files: {} files, with JSON string of length: {}", files.length, jsonString.length());
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(jsonString);
JsonNode pipelineNode = jsonNode.get("pipeline");
boolean hasErrors = false;
List<Resource> outputFiles = new ArrayList<>();
for (MultipartFile file : files) {
Resource fileResource = new ByteArrayResource(file.getBytes()) {
@Override
public String getFilename() {
return file.getOriginalFilename();
}
};
outputFiles.add(fileResource);
}
logger.info("Files successfully loaded. Starting processing...");
return processFiles(outputFiles, jsonString);
}
@PostMapping("/handleData")
public ResponseEntity<byte[]> handleData(@RequestPart("fileInput") MultipartFile[] files,
@RequestParam("json") String jsonString) {
logger.info("Received POST request to /handleData with {} files", files.length);
try {
List<Resource> outputFiles = handleFiles(files, jsonString);
if (outputFiles != null && outputFiles.size() == 1) {
// If there is only one file, return it directly
Resource singleFile = outputFiles.get(0);
InputStream is = singleFile.getInputStream();
byte[] bytes = new byte[(int) singleFile.contentLength()];
is.read(bytes);
is.close();
logger.info("Returning single file response...");
return WebResponseUtils.bytesToWebResponse(bytes, singleFile.getFilename(),
MediaType.APPLICATION_OCTET_STREAM);
} else if (outputFiles == null) {
return null;
}
// Create a ByteArrayOutputStream to hold the zip
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zipOut = new ZipOutputStream(baos);
// Loop through each file and add it to the zip
for (Resource file : outputFiles) {
ZipEntry zipEntry = new ZipEntry(file.getFilename());
zipOut.putNextEntry(zipEntry);
// Read the file into a byte array
InputStream is = file.getInputStream();
byte[] bytes = new byte[(int) file.contentLength()];
is.read(bytes);
// Write the bytes of the file to the zip
zipOut.write(bytes, 0, bytes.length);
zipOut.closeEntry();
is.close();
}
zipOut.close();
logger.info("Returning zipped file response...");
return WebResponseUtils.boasToWebResponse(baos, "output.zip", MediaType.APPLICATION_OCTET_STREAM);
} catch (Exception e) {
logger.error("Error handling data: ", e);
return null;
}
}
private boolean isZip(byte[] data) {
if (data == null || data.length < 4) {
return false;
}
// Check the first four bytes of the data against the standard zip magic number
return data[0] == 0x50 && data[1] == 0x4B && data[2] == 0x03 && data[3] == 0x04;
}
private List<Resource> unzip(byte[] data) throws IOException {
logger.info("Unzipping data of length: {}", data.length);
List<Resource> unzippedFiles = new ArrayList<>();
try (ByteArrayInputStream bais = new ByteArrayInputStream(data);
ZipInputStream zis = new ZipInputStream(bais)) {
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count;
while ((count = zis.read(buffer)) != -1) {
baos.write(buffer, 0, count);
}
final String filename = entry.getName();
Resource fileResource = new ByteArrayResource(baos.toByteArray()) {
@Override
public String getFilename() {
return filename;
}
};
// If the unzipped file is a zip file, unzip it
if (isZip(baos.toByteArray())) {
logger.info("File {} is a zip file. Unzipping...", filename);
unzippedFiles.addAll(unzip(baos.toByteArray()));
} else {
unzippedFiles.add(fileResource);
}
}
}
logger.info("Unzipping completed. {} files were unzipped.", unzippedFiles.size());
return unzippedFiles;
}
}

View File

@@ -0,0 +1,296 @@
package stirling.software.SPDF.controller.api.security;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyFactory;
import java.security.KeyStore;
import java.security.Principal;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.spec.PKCS8EncodedKeySpec;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.io.pem.PemReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.itextpdf.io.font.constants.StandardFonts;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.StampingProperties;
import com.itextpdf.signatures.BouncyCastleDigest;
import com.itextpdf.signatures.DigestAlgorithms;
import com.itextpdf.signatures.IExternalDigest;
import com.itextpdf.signatures.IExternalSignature;
import com.itextpdf.signatures.PdfPKCS7;
import com.itextpdf.signatures.PdfSignatureAppearance;
import com.itextpdf.signatures.PdfSigner;
import com.itextpdf.signatures.PrivateKeySignature;
import com.itextpdf.signatures.SignatureUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController
@Tag(name = "Security", description = "Security APIs")
public class CertSignController {
private static final Logger logger = LoggerFactory.getLogger(CertSignController.class);
static {
Security.addProvider(new BouncyCastleProvider());
}
@PostMapping(consumes = "multipart/form-data", value = "/cert-sign")
@Operation(summary = "Sign PDF with a Digital Certificate",
description = "This endpoint accepts a PDF file, a digital certificate and related information to sign the PDF. It then returns the digitally signed PDF file. Input:PDF Output:PDF Type:MF-SISO")
public ResponseEntity<byte[]> signPDF(
@RequestPart(required = true, value = "fileInput")
@Parameter(description = "The input PDF file to be signed")
MultipartFile pdf,
@RequestParam(value = "certType", required = false)
@Parameter(description = "The type of the digital certificate", schema = @Schema(allowableValues = {"PKCS12", "PEM"}))
String certType,
@RequestParam(value = "key", required = false)
@Parameter(description = "The private key for the digital certificate (required for PEM type certificates)")
MultipartFile privateKeyFile,
@RequestParam(value = "cert", required = false)
@Parameter(description = "The digital certificate (required for PEM type certificates)")
MultipartFile certFile,
@RequestParam(value = "p12", required = false)
@Parameter(description = "The PKCS12 keystore file (required for PKCS12 type certificates)")
MultipartFile p12File,
@RequestParam(value = "password", required = false)
@Parameter(description = "The password for the keystore or the private key")
String password,
@RequestParam(value = "showSignature", required = false)
@Parameter(description = "Whether to visually show the signature in the PDF file")
Boolean showSignature,
@RequestParam(value = "reason", required = false)
@Parameter(description = "The reason for signing the PDF")
String reason,
@RequestParam(value = "location", required = false)
@Parameter(description = "The location where the PDF is signed")
String location,
@RequestParam(value = "name", required = false)
@Parameter(description = "The name of the signer")
String name,
@RequestParam(value = "pageNumber", required = false)
@Parameter(description = "The page number where the signature should be visible. This is required if showSignature is set to true")
Integer pageNumber) throws Exception {
BouncyCastleProvider provider = new BouncyCastleProvider();
Security.addProvider(provider);
PrivateKey privateKey = null;
X509Certificate cert = null;
if (certType != null) {
switch (certType) {
case "PKCS12":
if (p12File != null) {
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new ByteArrayInputStream(p12File.getBytes()), password.toCharArray());
String alias = ks.aliases().nextElement();
privateKey = (PrivateKey) ks.getKey(alias, password.toCharArray());
cert = (X509Certificate) ks.getCertificate(alias);
}
break;
case "PEM":
if (privateKeyFile != null && certFile != null) {
// Load private key
KeyFactory keyFactory = KeyFactory.getInstance("RSA", provider);
if (isPEM(privateKeyFile.getBytes())) {
privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(parsePEM(privateKeyFile.getBytes())));
} else {
privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyFile.getBytes()));
}
// Load certificate
CertificateFactory certFactory = CertificateFactory.getInstance("X.509", provider);
if (isPEM(certFile.getBytes())) {
cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(parsePEM(certFile.getBytes())));
} else {
cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(certFile.getBytes()));
}
}
break;
}
}
Principal principal = cert.getSubjectDN();
String dn = principal.getName();
// Extract the "CN" (Common Name) field from the distinguished name (if it's present)
String cn = null;
for (String part : dn.split(",")) {
if (part.trim().startsWith("CN=")) {
cn = part.trim().substring("CN=".length());
break;
}
}
// Set up the PDF reader and stamper
PdfReader reader = new PdfReader(new ByteArrayInputStream(pdf.getBytes()));
ByteArrayOutputStream signedPdf = new ByteArrayOutputStream();
PdfSigner signer = new PdfSigner(reader, signedPdf, new StampingProperties());
// Set up the signing appearance
PdfSignatureAppearance appearance = signer.getSignatureAppearance()
.setReason("Test")
.setLocation("TestLocation");
if (showSignature != null && showSignature) {
float fontSize = 4; // the font size of the signature
float marginRight = 36; // Margin from the right
float marginBottom = 36; // Margin from the bottom
String signingDate = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z").format(new Date());
// Prepare the text for the digital signature
StringBuilder layer2TextBuilder = new StringBuilder(String.format("Digitally signed by: %s\nDate: %s",
name != null ? name : "Unknown", signingDate));
if (reason != null && !reason.isEmpty()) {
layer2TextBuilder.append("\nReason: ").append(reason);
}
if (location != null && !location.isEmpty()) {
layer2TextBuilder.append("\nLocation: ").append(location);
}
String layer2Text = layer2TextBuilder.toString();
// Get the PDF font and measure the width and height of the text block
PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA_BOLD);
float textWidth = Arrays.stream(layer2Text.split("\n"))
.map(line -> font.getWidth(line, fontSize))
.max(Float::compare)
.orElse(0f);
int numLines = layer2Text.split("\n").length;
float textHeight = numLines * fontSize;
// Calculate the signature rectangle size
float sigWidth = textWidth + marginRight * 2;
float sigHeight = textHeight + marginBottom * 2;
// Get the page size
PdfPage page = signer.getDocument().getPage(1);
Rectangle pageSize = page.getPageSize();
// Define the position and dimension of the signature field
Rectangle rect = new Rectangle(
pageSize.getRight() - sigWidth - marginRight,
pageSize.getBottom() + marginBottom,
sigWidth,
sigHeight
);
// Configure the appearance of the digital signature
appearance.setPageRect(rect)
.setContact(name != null ? name : "")
.setPageNumber(pageNumber)
.setReason(reason != null ? reason : "")
.setLocation(location != null ? location : "")
.setReuseAppearance(false)
.setLayer2Text(layer2Text.toString());
signer.setFieldName("sig");
} else {
appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.DESCRIPTION);
}
// Set up the signer
PrivateKeySignature pks = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256, provider.getName());
IExternalSignature pss = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256, provider.getName());
IExternalDigest digest = new BouncyCastleDigest();
// Call iTex7 to sign the PDF
signer.signDetached(digest, pks, new Certificate[] {cert}, null, null, null, 0, PdfSigner.CryptoStandard.CMS);
System.out.println("Signed PDF size: " + signedPdf.size());
System.out.println("PDF signed = " + isPdfSigned(signedPdf.toByteArray()));
return WebResponseUtils.bytesToWebResponse(signedPdf.toByteArray(), "example.pdf");
}
public boolean isPdfSigned(byte[] pdfData) throws IOException {
InputStream pdfStream = new ByteArrayInputStream(pdfData);
PdfDocument pdfDoc = new PdfDocument(new PdfReader(pdfStream));
SignatureUtil signatureUtil = new SignatureUtil(pdfDoc);
List<String> names = signatureUtil.getSignatureNames();
boolean isSigned = false;
for (String name : names) {
PdfPKCS7 pkcs7 = signatureUtil.readSignatureData(name);
if (pkcs7 != null) {
System.out.println("Signature found.");
// Log certificate details
Certificate[] signChain = pkcs7.getSignCertificateChain();
for (Certificate cert : signChain) {
if (cert instanceof X509Certificate) {
X509Certificate x509 = (X509Certificate) cert;
System.out.println("Certificate Details:");
System.out.println("Subject: " + x509.getSubjectDN());
System.out.println("Issuer: " + x509.getIssuerDN());
System.out.println("Serial: " + x509.getSerialNumber());
System.out.println("Not Before: " + x509.getNotBefore());
System.out.println("Not After: " + x509.getNotAfter());
}
}
isSigned = true;
}
}
pdfDoc.close();
return isSigned;
}
private byte[] parsePEM(byte[] content) throws IOException {
PemReader pemReader = new PemReader(new InputStreamReader(new ByteArrayInputStream(content)));
return pemReader.readPemObject().getContent();
}
private boolean isPEM(byte[] content) {
String contentStr = new String(content);
return contentStr.contains("-----BEGIN") && contentStr.contains("-----END");
}
}

View File

@@ -16,9 +16,11 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import stirling.software.SPDF.utils.PdfUtils;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@Tag(name = "Security", description = "Security APIs")
public class PasswordController { public class PasswordController {
private static final Logger logger = LoggerFactory.getLogger(PasswordController.class); private static final Logger logger = LoggerFactory.getLogger(PasswordController.class);
@@ -27,7 +29,7 @@ public class PasswordController {
@PostMapping(consumes = "multipart/form-data", value = "/remove-password") @PostMapping(consumes = "multipart/form-data", value = "/remove-password")
@Operation( @Operation(
summary = "Remove password from a PDF file", summary = "Remove password from a PDF file",
description = "This endpoint removes the password from a protected PDF file. Users need to provide the existing password." description = "This endpoint removes the password from a protected PDF file. Users need to provide the existing password. Input:PDF Output:PDF Type:SISO"
) )
public ResponseEntity<byte[]> removePassword( public ResponseEntity<byte[]> removePassword(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@@ -38,20 +40,23 @@ public class PasswordController {
String password) throws IOException { String password) throws IOException {
PDDocument document = PDDocument.load(fileInput.getBytes(), password); PDDocument document = PDDocument.load(fileInput.getBytes(), password);
document.setAllSecurityToBeRemoved(true); document.setAllSecurityToBeRemoved(true);
return PdfUtils.pdfDocToWebResponse(document, fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_password_removed.pdf"); return WebResponseUtils.pdfDocToWebResponse(document, fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_password_removed.pdf");
} }
@PostMapping(consumes = "multipart/form-data", value = "/add-password") @PostMapping(consumes = "multipart/form-data", value = "/add-password")
@Operation( @Operation(
summary = "Add password to a PDF file", summary = "Add password to a PDF file",
description = "This endpoint adds password protection to a PDF file. Users can specify a set of permissions that should be applied to the file." description = "This endpoint adds password protection to a PDF file. Users can specify a set of permissions that should be applied to the file. Input:PDF Output:PDF"
) )
public ResponseEntity<byte[]> addPassword( public ResponseEntity<byte[]> addPassword(
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true, value = "fileInput")
@Parameter(description = "The input PDF file to which the password should be added", required = true) @Parameter(description = "The input PDF file to which the password should be added", required = true)
MultipartFile fileInput, MultipartFile fileInput,
@RequestParam(defaultValue = "", name = "ownerPassword")
@Parameter(description = "The owner password to be added to the PDF file (Restricts what can be done with the document once it is opened)")
String ownerPassword,
@RequestParam(defaultValue = "", name = "password") @RequestParam(defaultValue = "", name = "password")
@Parameter(description = "The password to be added to the PDF file") @Parameter(description = "The password to be added to the PDF file (Restricts the opening of the document itself.)")
String password, String password,
@RequestParam(defaultValue = "128", name = "keyLength") @RequestParam(defaultValue = "128", name = "keyLength")
@Parameter(description = "The length of the encryption key", schema = @Schema(allowableValues = {"40", "128", "256"})) @Parameter(description = "The length of the encryption key", schema = @Schema(allowableValues = {"40", "128", "256"}))
@@ -84,7 +89,6 @@ public class PasswordController {
PDDocument document = PDDocument.load(fileInput.getBytes()); PDDocument document = PDDocument.load(fileInput.getBytes());
AccessPermission ap = new AccessPermission(); AccessPermission ap = new AccessPermission();
ap.setCanAssembleDocument(!canAssembleDocument); ap.setCanAssembleDocument(!canAssembleDocument);
ap.setCanExtractContent(!canExtractContent); ap.setCanExtractContent(!canExtractContent);
ap.setCanExtractForAccessibility(!canExtractForAccessibility); ap.setCanExtractForAccessibility(!canExtractForAccessibility);
@@ -93,14 +97,17 @@ public class PasswordController {
ap.setCanModifyAnnotations(!canModifyAnnotations); ap.setCanModifyAnnotations(!canModifyAnnotations);
ap.setCanPrint(!canPrint); ap.setCanPrint(!canPrint);
ap.setCanPrintFaithful(!canPrintFaithful); ap.setCanPrintFaithful(!canPrintFaithful);
StandardProtectionPolicy spp = new StandardProtectionPolicy(password, password, ap); StandardProtectionPolicy spp = new StandardProtectionPolicy(ownerPassword, password, ap);
spp.setEncryptionKeyLength(keyLength); spp.setEncryptionKeyLength(keyLength);
spp.setPermissions(ap); spp.setPermissions(ap);
document.protect(spp); document.protect(spp);
return PdfUtils.pdfDocToWebResponse(document, fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_passworded.pdf"); return WebResponseUtils.pdfDocToWebResponse(document, fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_passworded.pdf");
} }

View File

@@ -0,0 +1,140 @@
package stirling.software.SPDF.controller.api.security;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.PDPageTree;
import org.apache.pdfbox.pdmodel.common.PDMetadata;
import org.apache.pdfbox.pdmodel.common.PDStream;
import org.apache.pdfbox.pdmodel.interactive.action.*;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDField;
import org.apache.pdfbox.pdmodel.interactive.form.PDNonTerminalField;
import org.apache.pdfbox.pdmodel.interactive.form.PDTerminalField;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import stirling.software.SPDF.utils.WebResponseUtils;
import java.io.IOException;
import java.io.InputStream;
@RestController
public class SanitizeController {
@PostMapping(consumes = "multipart/form-data", value = "/sanitize-pdf")
@Operation(summary = "Sanitize a PDF file",
description = "This endpoint processes a PDF file and removes specific elements based on the provided options. Input:PDF Output:PDF Type:SISO")
public ResponseEntity<byte[]> sanitizePDF(
@RequestPart(required = true, value = "fileInput")
@Parameter(description = "The input PDF file to be sanitized")
MultipartFile inputFile,
@RequestParam(name = "removeJavaScript", required = false, defaultValue = "true")
@Parameter(description = "Remove JavaScript actions from the PDF if set to true")
Boolean removeJavaScript,
@RequestParam(name = "removeEmbeddedFiles", required = false, defaultValue = "true")
@Parameter(description = "Remove embedded files from the PDF if set to true")
Boolean removeEmbeddedFiles,
@RequestParam(name = "removeMetadata", required = false, defaultValue = "true")
@Parameter(description = "Remove metadata from the PDF if set to true")
Boolean removeMetadata,
@RequestParam(name = "removeLinks", required = false, defaultValue = "true")
@Parameter(description = "Remove links from the PDF if set to true")
Boolean removeLinks,
@RequestParam(name = "removeFonts", required = false, defaultValue = "true")
@Parameter(description = "Remove fonts from the PDF if set to true")
Boolean removeFonts) throws IOException {
try (PDDocument document = PDDocument.load(inputFile.getInputStream())) {
if (removeJavaScript) {
sanitizeJavaScript(document);
}
if (removeEmbeddedFiles) {
sanitizeEmbeddedFiles(document);
}
if (removeMetadata) {
sanitizeMetadata(document);
}
if (removeLinks) {
sanitizeLinks(document);
}
if (removeFonts) {
sanitizeFonts(document);
}
return WebResponseUtils.pdfDocToWebResponse(document, inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_sanitized.pdf");
}
}
private void sanitizeJavaScript(PDDocument document) throws IOException {
for (PDPage page : document.getPages()) {
for (PDAnnotation annotation : page.getAnnotations()) {
if (annotation instanceof PDAnnotationWidget) {
PDAnnotationWidget widget = (PDAnnotationWidget) annotation;
PDAction action = widget.getAction();
if (action instanceof PDActionJavaScript) {
widget.setAction(null);
}
}
}
PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm();
if (acroForm != null) {
for (PDField field : acroForm.getFields()) {
if (field.getActions().getF() instanceof PDActionJavaScript) {
field.getActions().setF(null);
}
}
}
}
}
private void sanitizeEmbeddedFiles(PDDocument document) {
PDPageTree allPages = document.getPages();
for (PDPage page : allPages) {
PDResources res = page.getResources();
// Remove embedded files from the PDF
res.getCOSObject().removeItem(COSName.getPDFName("EmbeddedFiles"));
}
}
private void sanitizeMetadata(PDDocument document) {
PDMetadata metadata = document.getDocumentCatalog().getMetadata();
if (metadata != null) {
document.getDocumentCatalog().setMetadata(null);
}
}
private void sanitizeLinks(PDDocument document) throws IOException {
for (PDPage page : document.getPages()) {
for (PDAnnotation annotation : page.getAnnotations()) {
if (annotation instanceof PDAnnotationLink) {
PDAction action = ((PDAnnotationLink) annotation).getAction();
if (action instanceof PDActionLaunch || action instanceof PDActionURI) {
((PDAnnotationLink) annotation).setAction(null);
}
}
}
}
}
private void sanitizeFonts(PDDocument document) {
for (PDPage page : document.getPages()) {
page.getResources().getCOSObject().removeItem(COSName.getPDFName("Font"));
}
}
}

View File

@@ -1,15 +1,28 @@
package stirling.software.SPDF.controller.api.security; package stirling.software.SPDF.controller.api.security;
import java.awt.Color; import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import org.apache.commons.io.IOUtils;
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font; import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState; import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.util.Matrix; import org.apache.pdfbox.util.Matrix;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
@@ -19,79 +32,167 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import stirling.software.SPDF.utils.PdfUtils; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.utils.WebResponseUtils;
import io.swagger.v3.oas.annotations.media.Schema;
@RestController @RestController
@Tag(name = "Security", description = "Security APIs")
public class WatermarkController { public class WatermarkController {
@PostMapping(consumes = "multipart/form-data", value = "/add-watermark") @PostMapping(consumes = "multipart/form-data", value = "/add-watermark")
@Operation(summary = "Add watermark to a PDF file", @Operation(summary = "Add watermark to a PDF file", description = "This endpoint adds a watermark to a given PDF file. Users can specify the watermark type (text or image), rotation, opacity, width spacer, and height spacer. Input:PDF Output:PDF Type:SISO")
description = "This endpoint adds a watermark to a given PDF file. Users can specify the watermark text, font size, rotation, opacity, width spacer, and height spacer.") public ResponseEntity<byte[]> addWatermark(
public ResponseEntity<byte[]> addWatermark( @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to add a watermark") MultipartFile pdfFile,
@RequestPart(required = true, value = "fileInput") @RequestPart(required = true) @Parameter(description = "The watermark type (text or image)") String watermarkType,
@Parameter(description = "The input PDF file to add a watermark") @RequestPart(required = false) @Parameter(description = "The watermark text") String watermarkText,
MultipartFile pdfFile, @RequestPart(required = false) @Parameter(description = "The watermark image") MultipartFile watermarkImage,
@RequestParam("watermarkText")
@Parameter(description = "The watermark text to add to the PDF file")
String watermarkText,
@RequestParam(defaultValue = "30", name = "fontSize")
@Parameter(description = "The font size of the watermark text", example = "30")
float fontSize,
@RequestParam(defaultValue = "0", name = "rotation")
@Parameter(description = "The rotation of the watermark text in degrees", example = "0")
float rotation,
@RequestParam(defaultValue = "0.5", name = "opacity")
@Parameter(description = "The opacity of the watermark text (0.0 - 1.0)", example = "0.5")
float opacity,
@RequestParam(defaultValue = "50", name = "widthSpacer")
@Parameter(description = "The width spacer between watermark texts", example = "50")
int widthSpacer,
@RequestParam(defaultValue = "50", name = "heightSpacer")
@Parameter(description = "The height spacer between watermark texts", example = "50")
int heightSpacer) throws IOException {
// Load the input PDF @RequestParam(defaultValue = "roman", name = "alphabet") @Parameter(description = "The selected alphabet",
PDDocument document = PDDocument.load(pdfFile.getInputStream()); schema = @Schema(type = "string",
allowableValues = {"roman","arabic","japanese","korean","chinese"},
defaultValue = "roman")) String alphabet,
@RequestParam(defaultValue = "30", name = "fontSize") @Parameter(description = "The font size of the watermark text", example = "30") float fontSize,
@RequestParam(defaultValue = "0", name = "rotation") @Parameter(description = "The rotation of the watermark in degrees", example = "0") float rotation,
@RequestParam(defaultValue = "0.5", name = "opacity") @Parameter(description = "The opacity of the watermark (0.0 - 1.0)", example = "0.5") float opacity,
@RequestParam(defaultValue = "50", name = "widthSpacer") @Parameter(description = "The width spacer between watermark elements", example = "50") int widthSpacer,
@RequestParam(defaultValue = "50", name = "heightSpacer") @Parameter(description = "The height spacer between watermark elements", example = "50") int heightSpacer)
throws IOException, Exception {
// Create a page in the document // Load the input PDF
for (PDPage page : document.getPages()) { PDDocument document = PDDocument.load(pdfFile.getInputStream());
// Get the page's content stream // Create a page in the document
PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true); for (PDPage page : document.getPages()) {
// Set transparency // Get the page's content stream
PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState(); PDPageContentStream contentStream = new PDPageContentStream(document, page,
graphicsState.setNonStrokingAlphaConstant(opacity); PDPageContentStream.AppendMode.APPEND, true);
contentStream.setGraphicsStateParameters(graphicsState);
// Set font of watermark // Set transparency
PDFont font = PDType1Font.HELVETICA_BOLD; PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState();
contentStream.beginText(); graphicsState.setNonStrokingAlphaConstant(opacity);
contentStream.setFont(font, fontSize); contentStream.setGraphicsStateParameters(graphicsState);
contentStream.setNonStrokingColor(Color.LIGHT_GRAY);
// Set size and location of watermark if (watermarkType.equalsIgnoreCase("text")) {
float pageWidth = page.getMediaBox().getWidth(); addTextWatermark(contentStream, watermarkText, document, page, rotation, widthSpacer, heightSpacer,
float pageHeight = page.getMediaBox().getHeight(); fontSize, alphabet);
float watermarkWidth = widthSpacer + font.getStringWidth(watermarkText) * fontSize / 1000; } else if (watermarkType.equalsIgnoreCase("image")) {
float watermarkHeight = heightSpacer + fontSize; addImageWatermark(contentStream, watermarkImage, document, page, rotation, widthSpacer, heightSpacer,
int watermarkRows = (int) (pageHeight / watermarkHeight + 1); fontSize);
int watermarkCols = (int) (pageWidth / watermarkWidth + 1); }
// Add the watermark text // Close the content stream
for (int i = 0; i < watermarkRows; i++) { contentStream.close();
for (int j = 0; j < watermarkCols; j++) { }
contentStream.setTextMatrix(Matrix.getRotateInstance((float) Math.toRadians(rotation), j * watermarkWidth, i * watermarkHeight));
contentStream.showTextWithPositioning(new Object[] { watermarkText }); return WebResponseUtils.pdfDocToWebResponse(document,
} pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_watermarked.pdf");
}
private void addTextWatermark(PDPageContentStream contentStream, String watermarkText, PDDocument document,
PDPage page, float rotation, int widthSpacer, int heightSpacer, float fontSize, String alphabet) throws IOException {
String resourceDir = "";
PDFont font = PDType1Font.HELVETICA_BOLD;
switch (alphabet) {
case "arabic":
resourceDir = "static/fonts/NotoSansArabic-Regular.ttf";
break;
case "japanese":
resourceDir = "static/fonts/Meiryo.ttf";
break;
case "korean":
resourceDir = "static/fonts/malgun.ttf";
break;
case "chinese":
resourceDir = "static/fonts/SimSun.ttf";
break;
case "roman":
default:
resourceDir = "static/fonts/NotoSans-Regular.ttf";
break;
}
if(!resourceDir.equals("")) {
ClassPathResource classPathResource = new ClassPathResource(resourceDir);
String fileExtension = resourceDir.substring(resourceDir.lastIndexOf("."));
File tempFile = File.createTempFile("NotoSansFont", fileExtension);
try (InputStream is = classPathResource.getInputStream(); FileOutputStream os = new FileOutputStream(tempFile)) {
IOUtils.copy(is, os);
} }
contentStream.endText(); font = PDType0Font.load(document, tempFile);
tempFile.deleteOnExit();
// Close the content stream
contentStream.close();
} }
return PdfUtils.pdfDocToWebResponse(document, pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_watermarked.pdf");
} contentStream.setFont(font, fontSize);
contentStream.setNonStrokingColor(Color.LIGHT_GRAY);
// Set size and location of text watermark
float watermarkWidth = widthSpacer + font.getStringWidth(watermarkText) * fontSize / 1000;
float watermarkHeight = heightSpacer + fontSize;
float pageWidth = page.getMediaBox().getWidth();
float pageHeight = page.getMediaBox().getHeight();
int watermarkRows = (int) (pageHeight / watermarkHeight + 1);
int watermarkCols = (int) (pageWidth / watermarkWidth + 1);
// Add the text watermark
for (int i = 0; i < watermarkRows; i++) {
for (int j = 0; j < watermarkCols; j++) {
contentStream.beginText();
contentStream.setTextMatrix(Matrix.getRotateInstance((float) Math.toRadians(rotation),
j * watermarkWidth, i * watermarkHeight));
contentStream.showText(watermarkText);
contentStream.endText();
}
}
}
private void addImageWatermark(PDPageContentStream contentStream, MultipartFile watermarkImage, PDDocument document, PDPage page, float rotation,
int widthSpacer, int heightSpacer, float fontSize) throws IOException {
// Load the watermark image
BufferedImage image = ImageIO.read(watermarkImage.getInputStream());
// Compute width based on original aspect ratio
float aspectRatio = (float) image.getWidth() / (float) image.getHeight();
// Desired physical height (in PDF points)
float desiredPhysicalHeight = fontSize ;
// Desired physical width based on the aspect ratio
float desiredPhysicalWidth = desiredPhysicalHeight * aspectRatio;
// Convert the BufferedImage to PDImageXObject
PDImageXObject xobject = LosslessFactory.createFromImage(document, image);
// Calculate the number of rows and columns for watermarks
float pageWidth = page.getMediaBox().getWidth();
float pageHeight = page.getMediaBox().getHeight();
int watermarkRows = (int) ((pageHeight + heightSpacer) / (desiredPhysicalHeight + heightSpacer));
int watermarkCols = (int) ((pageWidth + widthSpacer) / (desiredPhysicalWidth + widthSpacer));
for (int i = 0; i < watermarkRows; i++) {
for (int j = 0; j < watermarkCols; j++) {
float x = j * (desiredPhysicalWidth + widthSpacer);
float y = i * (desiredPhysicalHeight + heightSpacer);
// Save the graphics state
contentStream.saveGraphicsState();
// Create rotation matrix and rotate
contentStream.transform(Matrix.getTranslateInstance(x + desiredPhysicalWidth / 2, y + desiredPhysicalHeight / 2));
contentStream.transform(Matrix.getRotateInstance(Math.toRadians(rotation), 0, 0));
contentStream.transform(Matrix.getTranslateInstance(-desiredPhysicalWidth / 2, -desiredPhysicalHeight / 2));
// Draw the image and restore the graphics state
contentStream.drawImage(xobject, 0, 0, desiredPhysicalWidth, desiredPhysicalHeight);
contentStream.restoreGraphicsState();
}
}
}
} }

View File

@@ -6,8 +6,10 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.tags.Tag;
@Controller @Controller
@Tag(name = "Convert", description = "Convert APIs")
public class ConverterWebController { public class ConverterWebController {
@GetMapping("/img-to-pdf") @GetMapping("/img-to-pdf")
@@ -17,6 +19,20 @@ public class ConverterWebController {
return "convert/img-to-pdf"; return "convert/img-to-pdf";
} }
@GetMapping("/html-to-pdf")
@Hidden
public String convertHTMLToPdfForm(Model model) {
model.addAttribute("currentPage", "html-to-pdf");
return "convert/html-to-pdf";
}
@GetMapping("/url-to-pdf")
@Hidden
public String convertURLToPdfForm(Model model) {
model.addAttribute("currentPage", "url-to-pdf");
return "convert/url-to-pdf";
}
@GetMapping("/pdf-to-img") @GetMapping("/pdf-to-img")
@Hidden @Hidden

View File

@@ -1,27 +1,84 @@
package stirling.software.SPDF.controller.web; package stirling.software.SPDF.controller.web;
import org.springframework.http.MediaType; import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.tags.Tag;
@Controller @Controller
@Tag(name = "General", description = "General APIs")
public class GeneralWebController { public class GeneralWebController {
@GetMapping("/pipeline")
@Hidden
public String pipelineForm(Model model) {
model.addAttribute("currentPage", "pipeline");
List<String> pipelineConfigs = new ArrayList<>();
try (Stream<Path> paths = Files.walk(Paths.get("./pipeline/defaultWebUIConfigs/"))) {
List<Path> jsonFiles = paths
.filter(Files::isRegularFile)
.filter(p -> p.toString().endsWith(".json"))
.collect(Collectors.toList());
for (Path jsonFile : jsonFiles) {
String content = Files.readString(jsonFile, StandardCharsets.UTF_8);
pipelineConfigs.add(content);
}
List<Map<String, String>> pipelineConfigsWithNames = new ArrayList<>();
for (String config : pipelineConfigs) {
Map<String, Object> jsonContent = new ObjectMapper().readValue(config, Map.class);
String name = (String) jsonContent.get("name");
Map<String, String> configWithName = new HashMap<>();
configWithName.put("json", config);
configWithName.put("name", name);
pipelineConfigsWithNames.add(configWithName);
}
model.addAttribute("pipelineConfigsWithNames", pipelineConfigsWithNames);
} catch (IOException e) {
e.printStackTrace();
}
model.addAttribute("pipelineConfigs", pipelineConfigs);
return "pipeline";
}
@GetMapping("/merge-pdfs") @GetMapping("/merge-pdfs")
@Hidden @Hidden
public String mergePdfForm(Model model) { public String mergePdfForm(Model model) {
model.addAttribute("currentPage", "merge-pdfs"); model.addAttribute("currentPage", "merge-pdfs");
return "merge-pdfs"; return "merge-pdfs";
} }
@GetMapping("/about")
@Hidden
public String gameForm(Model model) {
model.addAttribute("currentPage", "about");
return "about";
}
@GetMapping("/multi-tool") @GetMapping("/multi-tool")
@Hidden @Hidden
@@ -30,16 +87,6 @@ public class GeneralWebController {
return "multi-tool"; return "multi-tool";
} }
@GetMapping("/")
public String home(Model model) {
model.addAttribute("currentPage", "home");
return "home";
}
@GetMapping("/home")
public String root(Model model) {
return "redirect:/";
}
@GetMapping("/remove-pages") @GetMapping("/remove-pages")
@Hidden @Hidden
@@ -73,23 +120,35 @@ public class GeneralWebController {
@Hidden @Hidden
public String signForm(Model model) { public String signForm(Model model) {
model.addAttribute("currentPage", "sign"); model.addAttribute("currentPage", "sign");
model.addAttribute("fonts", getFontNames());
return "sign"; return "sign";
} }
private List<String> getFontNames() {
@GetMapping(value = "/robots.txt", produces = MediaType.TEXT_PLAIN_VALUE) try {
@ResponseBody return Files.list(Paths.get("src/main/resources/static/fonts"))
@Hidden .map(Path::getFileName)
public String getRobotsTxt() { .map(Path::toString)
String allowGoogleVisibility = System.getProperty("ALLOW_GOOGLE_VISIBILITY"); .filter(name -> name.endsWith(".woff2"))
if (allowGoogleVisibility == null) .map(name -> name.substring(0, name.length() - 6)) // Remove .woff2 extension
allowGoogleVisibility = System.getenv("ALLOW_GOOGLE_VISIBILITY"); .collect(Collectors.toList());
if (allowGoogleVisibility == null) } catch (IOException e) {
allowGoogleVisibility = "false"; throw new RuntimeException("Failed to read font directory", e);
if (Boolean.parseBoolean(allowGoogleVisibility)) {
return "User-agent: Googlebot\nAllow: /\n\nUser-agent: *\nAllow: /";
} else {
return "User-agent: Googlebot\nDisallow: /\n\nUser-agent: *\nDisallow: /";
} }
} }
@GetMapping("/crop")
@Hidden
public String cropForm(Model model) {
model.addAttribute("currentPage", "crop");
return "crop";
}
@GetMapping("/auto-split-pdf")
@Hidden
public String autoSPlitPDFForm(Model model) {
model.addAttribute("currentPage", "auto-split-pdf");
return "auto-split-pdf";
}
} }

View File

@@ -0,0 +1,52 @@
package stirling.software.SPDF.controller.web;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.v3.oas.annotations.Hidden;
@Controller
public class HomeWebController {
@GetMapping("/about")
@Hidden
public String gameForm(Model model) {
model.addAttribute("currentPage", "about");
return "about";
}
@GetMapping("/")
public String home(Model model) {
model.addAttribute("currentPage", "home");
return "home";
}
@GetMapping("/home")
public String root(Model model) {
return "redirect:/";
}
@GetMapping(value = "/robots.txt", produces = MediaType.TEXT_PLAIN_VALUE)
@ResponseBody
@Hidden
public String getRobotsTxt() {
String allowGoogleVisibility = System.getProperty("ALLOW_GOOGLE_VISIBILITY");
if (allowGoogleVisibility == null)
allowGoogleVisibility = System.getenv("ALLOW_GOOGLE_VISIBILITY");
if (allowGoogleVisibility == null)
allowGoogleVisibility = "false";
if (Boolean.parseBoolean(allowGoogleVisibility)) {
return "User-agent: Googlebot\nAllow: /\n\nUser-agent: *\nAllow: /";
} else {
return "User-agent: Googlebot\nDisallow: /\n\nUser-agent: *\nDisallow: /";
}
}
}

View File

@@ -1,9 +1,4 @@
package stirling.software.SPDF.controller.web; package stirling.software.SPDF.controller.web;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.swagger.v3.oas.annotations.Operation;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
@@ -13,8 +8,16 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@RequestMapping("/api/v1") @RequestMapping("/api/v1")
@Tag(name = "API", description = "Info APIs")
public class MetricsController { public class MetricsController {
private final MeterRegistry meterRegistry; private final MeterRegistry meterRegistry;
@@ -36,17 +39,31 @@ public class MetricsController {
@GetMapping("/loads") @GetMapping("/loads")
@Operation(summary = "GET request count", @Operation(summary = "GET request count",
description = "This endpoint returns the total count of GET requests or the count of GET requests for a specific endpoint.") description = "This endpoint returns the total count of GET requests or the count of GET requests for a specific endpoint.")
public Double getPageLoads(@RequestParam Optional<String> endpoint) { public Double getPageLoads(@RequestParam(required = false, name = "endpoint") @Parameter(description = "endpoint") Optional<String> endpoint) {
try { try {
double count = 0.0; double count = 0.0;
for (Meter meter : meterRegistry.getMeters()) { for (Meter meter : meterRegistry.getMeters()) {
if (meter.getId().getName().equals("http.requests")) { if (meter.getId().getName().equals("http.requests")) {
String method = meter.getId().getTag("method"); String method = meter.getId().getTag("method");
if (method != null && method.equals("GET")) { if (method != null && method.equals("GET")) {
if (meter instanceof Counter) {
count += ((Counter) meter).count(); if (endpoint.isPresent() && !endpoint.get().isBlank()) {
} if(!endpoint.get().startsWith("/")) {
endpoint = Optional.of("/" + endpoint.get());
}
System.out.println("loads " + endpoint.get() + " vs " + meter.getId().getTag("uri"));
if(endpoint.get().equals(meter.getId().getTag("uri"))){
if (meter instanceof Counter) {
count += ((Counter) meter).count();
}
}
} else {
if (meter instanceof Counter) {
count += ((Counter) meter).count();
}
}
} }
} }
} }
@@ -60,10 +77,15 @@ public class MetricsController {
@GetMapping("/requests") @GetMapping("/requests")
@Operation(summary = "POST request count", @Operation(summary = "POST request count",
description = "This endpoint returns the total count of POST requests or the count of POST requests for a specific endpoint.") description = "This endpoint returns the total count of POST requests or the count of POST requests for a specific endpoint.")
public Double getTotalRequests(@RequestParam Optional<String> endpoint) { public Double getTotalRequests(@RequestParam(required = false, name = "endpoint") @Parameter(description = "endpoint") Optional<String> endpoint) {
try { try {
Counter counter; Counter counter;
if (endpoint.isPresent()) { if (endpoint.isPresent() && !endpoint.get().isBlank()) {
if(!endpoint.get().startsWith("/")) {
endpoint = Optional.of("/" + endpoint.get());
}
System.out.println("loads " + endpoint.get() + " vs " + meterRegistry.get("http.requests").tags("uri", endpoint.get()).toString());
counter = meterRegistry.get("http.requests") counter = meterRegistry.get("http.requests")
.tags("method", "POST", "uri", endpoint.get()).counter(); .tags("method", "POST", "uri", endpoint.get()).counter();
} else { } else {
@@ -72,7 +94,8 @@ public class MetricsController {
} }
return counter.count(); return counter.count();
} catch (Exception e) { } catch (Exception e) {
return -1.0; e.printStackTrace();
return 0.0;
} }
} }

View File

@@ -12,8 +12,10 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.tags.Tag;
@Controller @Controller
@Tag(name = "Other", description = "Other APIs")
public class OtherWebController { public class OtherWebController {
@GetMapping("/compress-pdf") @GetMapping("/compress-pdf")
@Hidden @Hidden
@@ -30,6 +32,13 @@ public class OtherWebController {
return modelAndView; return modelAndView;
} }
@GetMapping("/add-page-numbers")
@Hidden
public String addPageNumbersForm(Model model) {
model.addAttribute("currentPage", "add-page-numbers");
return "other/add-page-numbers";
}
@GetMapping("/extract-images") @GetMapping("/extract-images")
@Hidden @Hidden
public String extractImagesForm(Model model) { public String extractImagesForm(Model model) {
@@ -74,7 +83,9 @@ public class OtherWebController {
@Hidden @Hidden
public ModelAndView ocrPdfPage() { public ModelAndView ocrPdfPage() {
ModelAndView modelAndView = new ModelAndView("other/ocr-pdf"); ModelAndView modelAndView = new ModelAndView("other/ocr-pdf");
modelAndView.addObject("languages", getAvailableTesseractLanguages()); List<String> languages = getAvailableTesseractLanguages();
Collections.sort(languages);
modelAndView.addObject("languages", languages);
modelAndView.addObject("currentPage", "ocr-pdf"); modelAndView.addObject("currentPage", "ocr-pdf");
return modelAndView; return modelAndView;
} }
@@ -108,4 +119,34 @@ public class OtherWebController {
return "other/remove-blanks"; return "other/remove-blanks";
} }
@GetMapping("/multi-page-layout")
@Hidden
public String multiPageLayoutForm(Model model) {
model.addAttribute("currentPage", "multi-page-layout");
return "other/multi-page-layout";
}
@GetMapping("/scale-pages")
@Hidden
public String scalePagesFrom(Model model) {
model.addAttribute("currentPage", "scale-pages");
return "other/scale-pages";
}
@GetMapping("/auto-crop")
@Hidden
public String autoCropForm(Model model) {
model.addAttribute("currentPage", "auto-crop");
return "other/auto-crop";
}
@GetMapping("/auto-rename")
@Hidden
public String autoRenameForm(Model model) {
model.addAttribute("currentPage", "auto-rename");
return "other/auto-rename";
}
} }

View File

@@ -5,8 +5,10 @@ import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.tags.Tag;
@Controller @Controller
@Tag(name = "Security", description = "Security APIs")
public class SecurityWebController { public class SecurityWebController {
@GetMapping("/add-password") @GetMapping("/add-password")
@Hidden @Hidden
@@ -34,4 +36,18 @@ public class SecurityWebController {
model.addAttribute("currentPage", "add-watermark"); model.addAttribute("currentPage", "add-watermark");
return "security/add-watermark"; return "security/add-watermark";
} }
@GetMapping("/cert-sign")
@Hidden
public String certSignForm(Model model) {
model.addAttribute("currentPage", "cert-sign");
return "security/cert-sign";
}
@GetMapping("/sanitize-pdf")
@Hidden
public String sanitizeForm(Model model) {
model.addAttribute("currentPage", "sanitize-pdf");
return "security/sanitize-pdf";
}
} }

View File

@@ -0,0 +1,51 @@
package stirling.software.SPDF.model;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;
public class PipelineConfig {
private String name;
@JsonProperty("pipeline")
private List<PipelineOperation> operations;
private String outputDir;
@JsonProperty("outputFileName")
private String outputPattern;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<PipelineOperation> getOperations() {
return operations;
}
public void setOperations(List<PipelineOperation> operations) {
this.operations = operations;
}
public String getOutputDir() {
return outputDir;
}
public void setOutputDir(String outputDir) {
this.outputDir = outputDir;
}
public String getOutputPattern() {
return outputPattern;
}
public void setOutputPattern(String outputPattern) {
this.outputPattern = outputPattern;
}
}

View File

@@ -0,0 +1,32 @@
package stirling.software.SPDF.model;
import java.util.Map;
public class PipelineOperation {
private String operation;
private Map<String, Object> parameters;
public String getOperation() {
return operation;
}
public void setOperation(String operation) {
this.operation = operation;
}
public Map<String, Object> getParameters() {
return parameters;
}
public void setParameters(Map<String, Object> parameters) {
this.parameters = parameters;
}
@Override
public String toString() {
return "PipelineOperation [operation=" + operation + ", parameters=" + parameters + "]";
}
}

View File

@@ -1,4 +1,4 @@
package stirling.software.SPDF.utils; package stirling.software.SPDF.pdf;
import java.awt.geom.Point2D; import java.awt.geom.Point2D;
import java.io.IOException; import java.io.IOException;

View File

@@ -0,0 +1,153 @@
package stirling.software.SPDF.utils;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;
public class GeneralUtils {
public static void deleteDirectory(Path path) throws IOException {
Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
});
}
public static String convertToFileName(String name) {
String safeName = name.replaceAll("[^a-zA-Z0-9]", "_");
if (safeName.length() > 50) {
safeName = safeName.substring(0, 50);
}
return safeName;
}
public static boolean isValidURL(String urlStr) {
try {
new URL(urlStr);
return true;
} catch (MalformedURLException e) {
return false;
}
}
public static Long convertSizeToBytes(String sizeStr) {
if (sizeStr == null) {
return null;
}
sizeStr = sizeStr.trim().toUpperCase();
try {
if (sizeStr.endsWith("KB")) {
return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) * 1024);
} else if (sizeStr.endsWith("MB")) {
return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) * 1024 * 1024);
} else if (sizeStr.endsWith("GB")) {
return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) * 1024 * 1024 * 1024);
} else if (sizeStr.endsWith("B")) {
return Long.parseLong(sizeStr.substring(0, sizeStr.length() - 1));
} else {
// Input string does not have a valid format, handle this case
}
} catch (NumberFormatException e) {
// The numeric part of the input string cannot be parsed, handle this case
}
return null;
}
public static List<Integer> parsePageList(String[] pageOrderArr, int totalPages) {
List<Integer> newPageOrder = new ArrayList<>();
// loop through the page order array
for (String element : pageOrderArr) {
if (element.equalsIgnoreCase("all")) {
for (int i = 0; i < totalPages; i++) {
newPageOrder.add(i);
}
// As all pages are already added, no need to check further
break;
}
else if (element.matches("\\d*n\\+?-?\\d*|\\d*\\+?n")) {
// Handle page order as a function
int coefficient = 0;
int constant = 0;
boolean coefficientExists = false;
boolean constantExists = false;
if (element.contains("n")) {
String[] parts = element.split("n");
if (!parts[0].equals("") && parts[0] != null) {
coefficient = Integer.parseInt(parts[0]);
coefficientExists = true;
}
if (parts.length > 1 && !parts[1].equals("") && 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 - 1);
}
}
} 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 - 1);
}
} else {
// if the element is a single page
newPageOrder.add(Integer.parseInt(element) - 1);
}
}
return newPageOrder;
}
public static boolean createDir(String path) {
Path folder = Paths.get(path);
if (!Files.exists(folder)) {
try {
Files.createDirectories(folder);
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
return true;
}
}

View File

@@ -0,0 +1,25 @@
package stirling.software.SPDF.utils;
import java.awt.image.BufferedImage;
public class ImageProcessingUtils {
static BufferedImage convertColorType(BufferedImage sourceImage, String colorType) {
BufferedImage convertedImage;
switch (colorType) {
case "greyscale":
convertedImage = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
convertedImage.getGraphics().drawImage(sourceImage, 0, 0, null);
break;
case "blackwhite":
convertedImage = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
convertedImage.getGraphics().drawImage(sourceImage, 0, 0, null);
break;
default: // full color
convertedImage = sourceImage;
break;
}
return convertedImage;
}
}

View File

@@ -0,0 +1,5 @@
package stirling.software.SPDF.utils;
public class PDFManipulationUtils {
}

View File

@@ -92,6 +92,6 @@ public class PDFToFile {
if (tempOutputDir != null) if (tempOutputDir != null)
FileUtils.deleteDirectory(tempOutputDir.toFile()); FileUtils.deleteDirectory(tempOutputDir.toFile());
} }
return PdfUtils.bytesToWebResponse(fileBytes, fileName, MediaType.APPLICATION_OCTET_STREAM); return WebResponseUtils.bytesToWebResponse(fileBytes, fileName, MediaType.APPLICATION_OCTET_STREAM);
} }
} }

View File

@@ -2,23 +2,13 @@ package stirling.software.SPDF.utils;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ColorConvertOp;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.security.KeyPair;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -32,46 +22,184 @@ import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; 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;
import org.apache.pdfbox.text.PDFTextStripper;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.canvas.parser.PdfTextExtractor;
import com.itextpdf.kernel.pdf.canvas.parser.listener.SimpleTextExtractionStrategy;
import stirling.software.SPDF.pdf.ImageFinder;
public class PdfUtils { public class PdfUtils {
private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class); private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class);
public static ResponseEntity<byte[]> boasToWebResponse(ByteArrayOutputStream baos, String docName) throws IOException {
return PdfUtils.bytesToWebResponse(baos.toByteArray(), docName); public static PDRectangle textToPageSize(String size) {
switch (size.toUpperCase()) {
case "A0":
return PDRectangle.A0;
case "A1":
return PDRectangle.A1;
case "A2":
return PDRectangle.A2;
case "A3":
return PDRectangle.A3;
case "A4":
return PDRectangle.A4;
case "A5":
return PDRectangle.A5;
case "A6":
return PDRectangle.A6;
case "LETTER":
return PDRectangle.LETTER;
case "LEGAL":
return PDRectangle.LEGAL;
default:
throw new IllegalArgumentException("Invalid standard page size: " + size);
}
}
public static boolean hasImages(PDDocument document, String pagesToCheck) throws IOException {
String[] pageOrderArr = pagesToCheck.split(",");
List<Integer> pageList = GeneralUtils.parsePageList(pageOrderArr, document.getNumberOfPages());
for (int pageNumber : pageList) {
PDPage page = document.getPage(pageNumber);
if (hasImagesOnPage(page)) {
return true;
}
}
return false;
} }
public static ResponseEntity<byte[]> boasToWebResponse(ByteArrayOutputStream baos, String docName, MediaType mediaType) throws IOException { public static boolean hasText(PDDocument document, String pageNumbersToCheck, String phrase) throws IOException {
return PdfUtils.bytesToWebResponse(baos.toByteArray(), docName, mediaType); String[] pageOrderArr = pageNumbersToCheck.split(",");
List<Integer> pageList = GeneralUtils.parsePageList(pageOrderArr, document.getNumberOfPages());
for (int pageNumber : pageList) {
PDPage page = document.getPage(pageNumber);
if (hasTextOnPage(page, phrase)) {
return true;
}
}
return false;
} }
public static ResponseEntity<byte[]> bytesToWebResponse(byte[] bytes, String docName, MediaType mediaType) throws IOException {
// Return the PDF as a response public static boolean hasImagesOnPage(PDPage page) throws IOException {
HttpHeaders headers = new HttpHeaders(); ImageFinder imageFinder = new ImageFinder(page);
headers.setContentType(mediaType); imageFinder.processPage(page);
headers.setContentLength(bytes.length); return imageFinder.hasImages();
String encodedDocName = URLEncoder.encode(docName, StandardCharsets.UTF_8.toString()).replaceAll("\\+", "%20");
headers.setContentDispositionFormData("attachment", encodedDocName);
return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
} }
public static ResponseEntity<byte[]> bytesToWebResponse(byte[] bytes, String docName) throws IOException {
return bytesToWebResponse(bytes, docName, MediaType.APPLICATION_PDF);
public static boolean hasTextOnPage(PDPage page, String phrase) throws IOException {
PDFTextStripper textStripper = new PDFTextStripper();
PDDocument tempDoc = new PDDocument();
tempDoc.addPage(page);
String pageText = textStripper.getText(tempDoc);
tempDoc.close();
return pageText.contains(phrase);
} }
public static byte[] convertFromPdf(byte[] inputStream, String imageType, ImageType colorType, boolean singleImage, int DPI) throws IOException, Exception {
public boolean containsTextInFile(PDDocument pdfDocument, String text, String pagesToCheck) throws IOException {
PDFTextStripper textStripper = new PDFTextStripper();
String pdfText = "";
if(pagesToCheck == null || pagesToCheck.equals("all")) {
pdfText = textStripper.getText(pdfDocument);
} else {
// remove whitespaces
pagesToCheck = pagesToCheck.replaceAll("\\s+", "");
String[] splitPoints = pagesToCheck.split(",");
for (String splitPoint : splitPoints) {
if (splitPoint.contains("-")) {
// Handle page ranges
String[] range = splitPoint.split("-");
int startPage = Integer.parseInt(range[0]);
int endPage = Integer.parseInt(range[1]);
for (int i = startPage; i <= endPage; i++) {
textStripper.setStartPage(i);
textStripper.setEndPage(i);
pdfText += textStripper.getText(pdfDocument);
}
} else {
// Handle individual page
int page = Integer.parseInt(splitPoint);
textStripper.setStartPage(page);
textStripper.setEndPage(page);
pdfText += textStripper.getText(pdfDocument);
}
}
}
pdfDocument.close();
return pdfText.contains(text);
}
public boolean pageCount(PDDocument pdfDocument, int pageCount, String comparator) throws IOException {
int actualPageCount = pdfDocument.getNumberOfPages();
pdfDocument.close();
switch(comparator.toLowerCase()) {
case "greater":
return actualPageCount > pageCount;
case "equal":
return actualPageCount == pageCount;
case "less":
return actualPageCount < pageCount;
default:
throw new IllegalArgumentException("Invalid comparator. Only 'greater', 'equal', and 'less' are supported.");
}
}
public boolean pageSize(PDDocument pdfDocument, String expectedPageSize) throws IOException {
PDPage firstPage = pdfDocument.getPage(0);
PDRectangle mediaBox = firstPage.getMediaBox();
float actualPageWidth = mediaBox.getWidth();
float actualPageHeight = mediaBox.getHeight();
pdfDocument.close();
// Assumes the expectedPageSize is in the format "widthxheight", e.g. "595x842" for A4
String[] dimensions = expectedPageSize.split("x");
float expectedPageWidth = Float.parseFloat(dimensions[0]);
float expectedPageHeight = Float.parseFloat(dimensions[1]);
// Checks if the actual page size matches the expected page size
return actualPageWidth == expectedPageWidth && actualPageHeight == expectedPageHeight;
}
public static byte[] convertFromPdf(byte[] inputStream, String imageType, ImageType colorType, boolean singleImage, int DPI, String filename) throws IOException, Exception {
try (PDDocument document = PDDocument.load(new ByteArrayInputStream(inputStream))) { try (PDDocument document = PDDocument.load(new ByteArrayInputStream(inputStream))) {
PDFRenderer pdfRenderer = new PDFRenderer(document); PDFRenderer pdfRenderer = new PDFRenderer(document);
int pageCount = document.getNumberOfPages(); int pageCount = document.getNumberOfPages();
@@ -79,7 +207,7 @@ public class PdfUtils {
// Create images of all pages // Create images of all pages
for (int i = 0; i < pageCount; i++) { for (int i = 0; i < pageCount; i++) {
images.add(pdfRenderer.renderImageWithDPI(i, 300, colorType)); images.add(pdfRenderer.renderImageWithDPI(i, DPI, colorType));
} }
if (singleImage) { if (singleImage) {
@@ -109,7 +237,7 @@ public class PdfUtils {
ImageIO.write(image, imageType, baosImage); ImageIO.write(image, imageType, baosImage);
// Add the image to the zip file // Add the image to the zip file
zos.putNextEntry(new ZipEntry(String.format("page_%d.%s", i + 1, imageType.toLowerCase()))); zos.putNextEntry(new ZipEntry(String.format(filename + "_%d.%s", i + 1, imageType.toLowerCase())));
zos.write(baosImage.toByteArray()); zos.write(baosImage.toByteArray());
} }
} }
@@ -127,6 +255,7 @@ public class PdfUtils {
public static byte[] imageToPdf(MultipartFile[] files, boolean stretchToFit, boolean autoRotate, String colorType) throws IOException { public static byte[] imageToPdf(MultipartFile[] files, boolean stretchToFit, boolean autoRotate, String colorType) throws IOException {
try (PDDocument doc = new PDDocument()) { try (PDDocument doc = new PDDocument()) {
for (MultipartFile file : files) { for (MultipartFile file : files) {
String contentType = file.getContentType();
String originalFilename = file.getOriginalFilename(); String originalFilename = file.getOriginalFilename();
if (originalFilename != null && (originalFilename.toLowerCase().endsWith(".tiff") || originalFilename.toLowerCase().endsWith(".tif")) ) { if (originalFilename != null && (originalFilename.toLowerCase().endsWith(".tiff") || originalFilename.toLowerCase().endsWith(".tif")) ) {
ImageReader reader = ImageIO.getImageReadersByFormatName("tiff").next(); ImageReader reader = ImageIO.getImageReadersByFormatName("tiff").next();
@@ -134,7 +263,7 @@ public class PdfUtils {
int numPages = reader.getNumImages(true); int numPages = reader.getNumImages(true);
for (int i = 0; i < numPages; i++) { for (int i = 0; i < numPages; i++) {
BufferedImage pageImage = reader.read(i); BufferedImage pageImage = reader.read(i);
BufferedImage convertedImage = convertColorType(pageImage, colorType); BufferedImage convertedImage = ImageProcessingUtils.convertColorType(pageImage, colorType);
PDImageXObject pdImage = LosslessFactory.createFromImage(doc, convertedImage); PDImageXObject pdImage = LosslessFactory.createFromImage(doc, convertedImage);
addImageToDocument(doc, pdImage, stretchToFit, autoRotate); addImageToDocument(doc, pdImage, stretchToFit, autoRotate);
} }
@@ -147,8 +276,13 @@ public class PdfUtils {
fos.write(buffer, 0, len); fos.write(buffer, 0, len);
} }
BufferedImage image = ImageIO.read(imageFile); BufferedImage image = ImageIO.read(imageFile);
BufferedImage convertedImage = convertColorType(image, colorType); BufferedImage convertedImage = ImageProcessingUtils.convertColorType(image, colorType);
PDImageXObject pdImage = LosslessFactory.createFromImage(doc, convertedImage); PDImageXObject pdImage;
if (contentType != null && (contentType.equals("image/jpeg"))) {
pdImage = JPEGFactory.createFromImage(doc, convertedImage);
} else {
pdImage = LosslessFactory.createFromImage(doc, convertedImage);
}
addImageToDocument(doc, pdImage, stretchToFit, autoRotate); addImageToDocument(doc, pdImage, stretchToFit, autoRotate);
} catch (IOException e) { } catch (IOException e) {
logger.error("Error writing image to file: {}", imageFile.getAbsolutePath(), e); logger.error("Error writing image to file: {}", imageFile.getAbsolutePath(), e);
@@ -165,24 +299,6 @@ public class PdfUtils {
} }
} }
private static BufferedImage convertColorType(BufferedImage sourceImage, String colorType) {
BufferedImage convertedImage;
switch (colorType) {
case "greyscale":
convertedImage = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
convertedImage.getGraphics().drawImage(sourceImage, 0, 0, null);
break;
case "blackwhite":
convertedImage = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
convertedImage.getGraphics().drawImage(sourceImage, 0, 0, null);
break;
default: // full color
convertedImage = sourceImage;
break;
}
return convertedImage;
}
private static void addImageToDocument(PDDocument doc, PDImageXObject image, boolean stretchToFit, boolean autoRotate) throws IOException { private static void addImageToDocument(PDDocument doc, PDImageXObject image, boolean stretchToFit, boolean autoRotate) throws IOException {
boolean imageIsLandscape = image.getWidth() > image.getHeight(); boolean imageIsLandscape = image.getWidth() > image.getHeight();
PDRectangle pageSize = PDRectangle.A4; PDRectangle pageSize = PDRectangle.A4;
@@ -219,33 +335,6 @@ public class PdfUtils {
} }
} }
public static X509Certificate[] loadCertificateChainFromKeystore(InputStream keystoreInputStream, String keystorePassword) throws Exception {
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(keystoreInputStream, keystorePassword.toCharArray());
String alias = keystore.aliases().nextElement();
Certificate[] certChain = keystore.getCertificateChain(alias);
X509Certificate[] x509CertChain = new X509Certificate[certChain.length];
for (int i = 0; i < certChain.length; i++) {
x509CertChain[i] = (X509Certificate) certChain[i];
}
return x509CertChain;
}
public static KeyPair loadKeyPairFromKeystore(InputStream keystoreInputStream, String keystorePassword) throws Exception {
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(keystoreInputStream, keystorePassword.toCharArray());
String alias = keystore.aliases().nextElement();
PrivateKey privateKey = (PrivateKey) keystore.getKey(alias, keystorePassword.toCharArray());
Certificate cert = keystore.getCertificate(alias);
PublicKey publicKey = cert.getPublicKey();
return new KeyPair(publicKey, privateKey);
}
public static byte[] overlayImage(byte[] pdfBytes, byte[] imageBytes, float x, float y, boolean everyPage) throws IOException { public static byte[] overlayImage(byte[] pdfBytes, byte[] imageBytes, float x, float y, boolean everyPage) throws IOException {
PDDocument document = PDDocument.load(new ByteArrayInputStream(pdfBytes)); PDDocument document = PDDocument.load(new ByteArrayInputStream(pdfBytes));
@@ -277,14 +366,7 @@ public class PdfUtils {
return baos.toByteArray(); return baos.toByteArray();
} }
public static ResponseEntity<byte[]> pdfDocToWebResponse(PDDocument document, String docName) throws IOException {
// Open Byte Array and save document to it
ByteArrayOutputStream baos = new ByteArrayOutputStream();
document.save(baos);
// Close the document
document.close();
return PdfUtils.boasToWebResponse(baos, docName);
}
} }

View File

@@ -1,6 +1,7 @@
package stirling.software.SPDF.utils; package stirling.software.SPDF.utils;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@@ -13,7 +14,7 @@ import java.util.concurrent.Semaphore;
public class ProcessExecutor { public class ProcessExecutor {
public enum Processes { public enum Processes {
LIBRE_OFFICE, OCR_MY_PDF, PYTHON_OPENCV, GHOSTSCRIPT LIBRE_OFFICE, OCR_MY_PDF, PYTHON_OPENCV, GHOSTSCRIPT, WEASYPRINT
} }
private static final Map<Processes, ProcessExecutor> instances = new ConcurrentHashMap<>(); private static final Map<Processes, ProcessExecutor> instances = new ConcurrentHashMap<>();
@@ -25,6 +26,7 @@ public class ProcessExecutor {
case OCR_MY_PDF -> 2; case OCR_MY_PDF -> 2;
case PYTHON_OPENCV -> 8; case PYTHON_OPENCV -> 8;
case GHOSTSCRIPT -> 16; case GHOSTSCRIPT -> 16;
case WEASYPRINT -> 16;
}; };
return new ProcessExecutor(semaphoreLimit); return new ProcessExecutor(semaphoreLimit);
}); });
@@ -35,14 +37,21 @@ public class ProcessExecutor {
private ProcessExecutor(int semaphoreLimit) { private ProcessExecutor(int semaphoreLimit) {
this.semaphore = new Semaphore(semaphoreLimit); this.semaphore = new Semaphore(semaphoreLimit);
} }
public int runCommandWithOutputHandling(List<String> command) throws IOException, InterruptedException { public int runCommandWithOutputHandling(List<String> command) throws IOException, InterruptedException {
return runCommandWithOutputHandling(command, null);
}
public int runCommandWithOutputHandling(List<String> command, File workingDirectory) throws IOException, InterruptedException {
int exitCode = 1; int exitCode = 1;
semaphore.acquire(); semaphore.acquire();
try { try {
System.out.print("Running command: " + String.join(" ", command)); System.out.print("Running command: " + String.join(" ", command));
ProcessBuilder processBuilder = new ProcessBuilder(command); ProcessBuilder processBuilder = new ProcessBuilder(command);
// Use the working directory if it's set
if (workingDirectory != null) {
processBuilder.directory(workingDirectory);
}
Process process = processBuilder.start(); Process process = processBuilder.start();
// Read the error stream and standard output stream concurrently // Read the error stream and standard output stream concurrently

View File

@@ -0,0 +1,61 @@
package stirling.software.SPDF.utils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;
public class WebResponseUtils {
public static ResponseEntity<byte[]> boasToWebResponse(ByteArrayOutputStream baos, String docName) throws IOException {
return WebResponseUtils.bytesToWebResponse(baos.toByteArray(), docName);
}
public static ResponseEntity<byte[]> boasToWebResponse(ByteArrayOutputStream baos, String docName, MediaType mediaType) throws IOException {
return WebResponseUtils.bytesToWebResponse(baos.toByteArray(), docName, mediaType);
}
public static ResponseEntity<byte[]> multiPartFileToWebResponse(MultipartFile file) throws IOException {
String fileName = file.getOriginalFilename();
MediaType mediaType = MediaType.parseMediaType(file.getContentType());
byte[] bytes = file.getBytes();
return bytesToWebResponse(bytes, fileName, mediaType);
}
public static ResponseEntity<byte[]> bytesToWebResponse(byte[] bytes, String docName, MediaType mediaType) throws IOException {
// Return the PDF as a response
HttpHeaders headers = new HttpHeaders();
headers.setContentType(mediaType);
headers.setContentLength(bytes.length);
String encodedDocName = URLEncoder.encode(docName, StandardCharsets.UTF_8.toString()).replaceAll("\\+", "%20");
headers.setContentDispositionFormData("attachment", encodedDocName);
return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
}
public static ResponseEntity<byte[]> bytesToWebResponse(byte[] bytes, String docName) throws IOException {
return bytesToWebResponse(bytes, docName, MediaType.APPLICATION_PDF);
}
public static ResponseEntity<byte[]> pdfDocToWebResponse(PDDocument document, String docName) throws IOException {
// Open Byte Array and save document to it
ByteArrayOutputStream baos = new ByteArrayOutputStream();
document.save(baos);
// Close the document
document.close();
return boasToWebResponse(baos, docName);
}
}

View File

@@ -1,12 +1,12 @@
spring.http.multipart.max-file-size=2GB spring.http.multipart.max-file-size=${MAX_FILE_SIZE:2000MB}
spring.http.multipart.max-request-size=2GB spring.http.multipart.max-request-size=${MAX_FILE_SIZE:2000MB}
multipart.enabled=true multipart.enabled=true
multipart.max-file-size=2000MB multipart.max-file-size=${MAX_FILE_SIZE:2000MB}
multipart.max-request-size=2000MB multipart.max-request-size=${MAX_FILE_SIZE:2000MB}
spring.servlet.multipart.max-file-size=2000MB spring.servlet.multipart.max-file-size=${MAX_FILE_SIZE:2000MB}
spring.servlet.multipart.max-request-size=2000MB spring.servlet.multipart.max-request-size=${MAX_FILE_SIZE:2000MB}
server.forward-headers-strategy=NATIVE server.forward-headers-strategy=NATIVE
@@ -15,7 +15,7 @@ server.error.whitelabel.enabled=false
server.error.include-stacktrace=always server.error.include-stacktrace=always
server.error.include-exception=true server.error.include-exception=true
server.error.include-message=always server.error.include-message=always
\
server.servlet.session.tracking-modes=cookie server.servlet.session.tracking-modes=cookie
server.servlet.context-path=${APP_ROOT_PATH:/} server.servlet.context-path=${APP_ROOT_PATH:/}
@@ -26,3 +26,7 @@ spring.thymeleaf.encoding=UTF-8
server.connection-timeout=${CONNECTION_TIMEOUT:5m} server.connection-timeout=${CONNECTION_TIMEOUT:5m}
spring.mvc.async.request-timeout=${ASYNC_CONNECTION_TIMEOUT:300000} spring.mvc.async.request-timeout=${ASYNC_CONNECTION_TIMEOUT:300000}
spring.resources.static-locations=file:customFiles/static/
#spring.thymeleaf.prefix=file:/customFiles/templates/,classpath:/templates/
#spring.thymeleaf.cache=false

View File

@@ -1,11 +1,7 @@
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#
# Translated by Google Translate #
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl=right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=rtl language.direction=rtl
pdfPrompt=اختر PDF pdfPrompt=اختر PDF
@@ -21,152 +17,499 @@ false=\u062E\u0637\u0623
unknown=\u063A\u064A\u0631 \u0645\u0639\u0631\u0648\u0641 unknown=\u063A\u064A\u0631 \u0645\u0639\u0631\u0648\u0641
save=\u062D\u0641\u0638 save=\u062D\u0641\u0638
close=\u0625\u063A\u0644\u0627\u0642 close=\u0625\u063A\u0644\u0627\u0642
filesSelected = الملفات المحددة filesSelected=الملفات المحددة
noFavourites = لم تتم إضافة أي مفضلات noFavourites=لم تتم إضافة أي مفضلات
bored = الانتظار بالملل؟ bored=الانتظار بالملل؟
alphabet=\u0627\u0644\u0623\u0628\u062C\u062F\u064A\u0629
downloadPdf=تنزيل PDF
text=نص
font=الخط
selectFillter=- حدد -
pageNum=رقم الصفحة
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
#############
# NAVBAR #
#############
navbar.convert=تحويل
navbar.security=الأمان
navbar.other=أخرى
navbar.darkmode=الوضع الداكن
navbar.pageOps=عمليات الصفحة
navbar.settings=\u0625\u0639\u062F\u0627\u062F\u0627\u062A
#############
# SETTINGS #
#############
settings.title=\u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A
settings.update=\u0627\u0644\u062A\u062D\u062F\u064A\u062B \u0645\u062A\u0627\u062D
settings.appVersion=\u0625\u0635\u062F\u0627\u0631 \u0627\u0644\u062A\u0637\u0628\u064A\u0642:
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.downloadOption.1=\u0641\u062A\u062D \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0646\u0627\u0641\u0630\u0629
settings.downloadOption.2=\u0641\u062A\u062D \u0641\u064A \u0646\u0627\u0641\u0630\u0629 \u062C\u062F\u064A\u062F\u0629
settings.downloadOption.3=\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u0645\u0644\u0641
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
############# #############
# HOME-PAGE # # HOME-PAGE #
############# #############
home.desc=متجرك الشامل المستضاف محليًا لجميع احتياجات PDF الخاصة بك. home.desc=متجرك الشامل المستضاف محليًا لجميع احتياجات PDF الخاصة بك.
navbar.convert=تحويل
navbar.security=الأمان
navbar.other=أخرى
navbar.darkmode=الوضع الداكن
navbar.pageOps=عمليات الصفحة
home.multiTool.title=أداة متعددة PDF home.multiTool.title=أداة متعددة PDF
home.multiTool.desc=دمج الصفحات وتدويرها وإعادة ترتيبها وإزالتها home.multiTool.desc=دمج الصفحات وتدويرها وإعادة ترتيبها وإزالتها
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
home.merge.title=دمج ملفات home.merge.title=دمج ملفات
home.merge.desc=دمج ملفات PDF متعددة في ملف واحد بسهولة. home.merge.desc=دمج ملفات PDF متعددة في ملف واحد بسهولة.
merge.tags=merge,Page operations,Back end,server side
home.split.title=انقسام ملفات home.split.title=انقسام ملفات
home.split.desc=تقسيم ملفات PDF إلى مستندات متعددة home.split.desc=تقسيم ملفات PDF إلى مستندات متعددة
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=تدوير ملفات home.rotate.title=تدوير ملفات
home.rotate.desc=قم بتدوير ملفات PDF الخاصة بك بسهولة. home.rotate.desc=قم بتدوير ملفات PDF الخاصة بك بسهولة.
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
home.imageToPdf.title=صورة إلى PDF home.imageToPdf.title=صورة إلى PDF
home.imageToPdf.desc=تحويل الصور (PNG ، JPEG ، GIF) إلى PDF. home.imageToPdf.desc=تحويل الصور (PNG ، JPEG ، GIF) إلى PDF.
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=تحويل PDF إلى صورة home.pdfToImage.title=تحويل PDF إلى صورة
home.pdfToImage.desc=تحويل ملف PDF إلى صورة. (PNG ، JPEG ، GIF) home.pdfToImage.desc=تحويل ملف PDF إلى صورة. (PNG ، JPEG ، GIF)
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=منظم home.pdfOrganiser.title=منظم
home.pdfOrganiser.desc=إزالة / إعادة ترتيب الصفحات بأي ترتيب home.pdfOrganiser.desc=إزالة / إعادة ترتيب الصفحات بأي ترتيب
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=إضافة صورة إلى ملف PDF home.addImage.title=إضافة صورة إلى ملف PDF
home.addImage.desc=إضافة صورة إلى موقع معين في PDF (العمل قيد التقدم) home.addImage.desc=إضافة صورة إلى موقع معين في PDF (العمل قيد التقدم)
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
home.watermark.title=إضافة علامة مائية home.watermark.title=إضافة علامة مائية
home.watermark.desc=أضف علامة مائية مخصصة إلى مستند PDF الخاص بك. home.watermark.desc=أضف علامة مائية مخصصة إلى مستند PDF الخاص بك.
##########################
home.remove-watermark.title=\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0645\u0627\u0626\u064A\u0629 ### TODO: Translate ###
home.remove-watermark.desc=\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062A \u0627\u0644\u0645\u0627\u0626\u064A\u0629 \u0645\u0646 \u0645\u0633\u062A\u0646\u062F PDF \u0627\u0644\u062E\u0627\u0635 \u0628\u0643. ##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.permissions.title=تغيير الأذونات home.permissions.title=تغيير الأذونات
home.permissions.desc=قم بتغيير أذونات مستند PDF الخاص بك home.permissions.desc=قم بتغيير أذونات مستند PDF الخاص بك
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
home.removePages.title=إزالة الصفحات home.removePages.title=إزالة الصفحات
home.removePages.desc=حذف الصفحات غير المرغوب فيها من مستند PDF الخاص بك. home.removePages.desc=حذف الصفحات غير المرغوب فيها من مستند PDF الخاص بك.
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
home.addPassword.title=إضافة كلمة مرور home.addPassword.title=إضافة كلمة مرور
home.addPassword.desc=تشفير مستند PDF الخاص بك بكلمة مرور. home.addPassword.desc=تشفير مستند PDF الخاص بك بكلمة مرور.
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
home.removePassword.title=إزالة كلمة المرور home.removePassword.title=إزالة كلمة المرور
home.removePassword.desc=إزالة الحماية بكلمة مرور من مستند PDF الخاص بك. home.removePassword.desc=إزالة الحماية بكلمة مرور من مستند PDF الخاص بك.
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=ضغط ملفات home.compressPdfs.title=ضغط ملفات
home.compressPdfs.desc=ضغط ملفات PDF لتقليل حجم الملف. home.compressPdfs.desc=ضغط ملفات PDF لتقليل حجم الملف.
##########################
### TODO: Translate ###
##########################
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=\u062A\u063A\u064A\u064A\u0631 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629
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=\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
##########################
### TODO: Translate ###
##########################
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=\u062A\u062D\u0648\u064A\u0644 \u0627\u0644\u0645\u0644\u0641 \u0625\u0644\u0649 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=\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)
##########################
### TODO: Translate ###
##########################
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=\u062A\u0634\u063A\u064A\u0644 OCR \u0639\u0644\u0649 PDF \u0648 / \u0623\u0648 \u0645\u0633\u062D \u0636\u0648\u0626\u064A
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=\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
##########################
### TODO: Translate ###
##########################
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=\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0627\u0644\u0635\u0648\u0631
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=\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
##########################
### TODO: Translate ###
##########################
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=\u062A\u062D\u0648\u064A\u0644 \u0645\u0644\u0641\u0627\u062A PDF \u0625\u0644\u0649 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=\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
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=تحويل PDF إلى Word home.PDFToWord.title=تحويل PDF إلى Word
home.PDFToWord.desc=تحويل PDF إلى تنسيقات Word (DOC و DOCX و ODT) home.PDFToWord.desc=تحويل PDF إلى تنسيقات Word (DOC و DOCX و ODT)
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=PDF للعرض التقديمي home.PDFToPresentation.title=PDF للعرض التقديمي
home.PDFToPresentation.desc=تحويل PDF إلى تنسيقات عرض تقديمي (PPT و PPTX و ODP) home.PDFToPresentation.desc=تحويل PDF إلى تنسيقات عرض تقديمي (PPT و PPTX و ODP)
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=تحويل PDF إلى نص / RTF home.PDFToText.title=تحويل PDF إلى نص / RTF
home.PDFToText.desc=تحويل PDF إلى تنسيق نص أو RTF home.PDFToText.desc=تحويل PDF إلى تنسيق نص أو RTF
##########################
### TODO: Translate ###
##########################
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=تحويل PDF إلى HTML home.PDFToHTML.title=تحويل PDF إلى HTML
home.PDFToHTML.desc=تحويل PDF إلى تنسيق HTML home.PDFToHTML.desc=تحويل PDF إلى تنسيق HTML
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=تحويل PDF إلى XML home.PDFToXML.title=تحويل PDF إلى XML
home.PDFToXML.desc=تحويل PDF إلى تنسيق XML home.PDFToXML.desc=تحويل PDF إلى تنسيق XML
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=كشف / انقسام الصور الممسوحة ضوئيًا home.ScannerImageSplit.title=كشف / انقسام الصور الممسوحة ضوئيًا
home.ScannerImageSplit.desc=تقسيم عدة صور من داخل صورة / ملف PDF home.ScannerImageSplit.desc=تقسيم عدة صور من داخل صورة / ملف PDF
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title = تسجيل الدخول home.sign.title=تسجيل الدخول
home.sign.desc = إضافة التوقيع إلى PDF عن طريق الرسم أو النص أو الصورة home.sign.desc=إضافة التوقيع إلى PDF عن طريق الرسم أو النص أو الصورة
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title = تسطيح home.flatten.title=تسطيح
home.flatten.desc = قم بإزالة كافة العناصر والنماذج التفاعلية من ملف PDF home.flatten.desc=قم بإزالة كافة العناصر والنماذج التفاعلية من ملف PDF
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title = إصلاح home.repair.title=إصلاح
home.repair.desc = يحاول إصلاح ملف PDF تالف / معطل home.repair.desc=يحاول إصلاح ملف PDF تالف / معطل
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
home.removeBlanks.title = إزالة الصفحات الفارغة home.removeBlanks.title=إزالة الصفحات الفارغة
home.removeBlanks.desc = يكتشف ويزيل الصفحات الفارغة من المستند home.removeBlanks.desc=يكتشف ويزيل الصفحات الفارغة من المستند
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title = قارن home.compare.title=قارن
home.compare.desc = يقارن ويظهر الاختلافات بين 2 من مستندات PDF home.compare.desc=يقارن ويظهر الاختلافات بين 2 من مستندات PDF
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
downloadPdf = تنزيل PDF home.certSign.title=Sign with Certificate
text=نص home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
font=الخط ##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
removeBlanks.title = إزالة الفراغات home.pageLayout.title=Multi-Page Layout
removeBlanks.header = إزالة الصفحات الفارغة home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
removeBlanks.threshold = العتبة: ##########################
removeBlanks.thresholdDesc = الحد الفاصل لتحديد مدى بياض البكسل الأبيض ### TODO: Translate ###
removeBlanks.whitePercent = نسبة الأبيض (٪): ##########################
removeBlanks.whitePercentDesc = النسبة المئوية للصفحة التي يجب أن تكون بيضاء لتتم إزالتها pageLayout.tags=merge,composite,single-view,organize
removeBlanks.submit = إزالة الفراغات
home.scalePages.title=Adjust page size/scale
home.scalePages.desc=Change the size/scale of page and/or its contents.
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
##########################
### TODO: Translate ###
##########################
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
##########################
### TODO: Translate ###
##########################
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
##########################
### TODO: Translate ###
##########################
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
##########################
### TODO: Translate ###
##########################
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
##########################
### TODO: Translate ###
##########################
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
##########################
### TODO: Translate ###
##########################
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
##########################
### TODO: Translate ###
##########################
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Multi Page Layout
pageLayout.header=Multi Page Layout
pageLayout.pagesPerSheet=Pages per sheet:
pageLayout.submit=Submit
#scalePages
scalePages.title=Adjust page-scale
scalePages.header=Adjust page-scale
scalePages.pageSize=Size of a page of the document.
scalePages.scaleFactor=Zoom level (crop) of a page.
scalePages.submit=Submit
#certSign
certSign.title=توقيع الشهادة
certSign.header=قم بتوقيع ملف PDF بشهادتك (العمل قيد التقدم)
certSign.selectPDF=حدد ملف PDF للتوقيع:
certSign.selectKey=حدد ملف المفتاح الخاص (تنسيق PKCS # 8 ، يمكن أن يكون .pem أو .der):
certSign.selectCert=حدد ملف الشهادة الخاص بك (تنسيق X.509 ، يمكن أن يكون .pem أو .der):
certSign.selectP12=حدد ملف تخزين المفاتيح PKCS # 12 (.p12 أو .pfx) (اختياري ، إذا تم توفيره ، يجب أن يحتوي على مفتاحك الخاص وشهادتك):
certSign.certType=نوع الشهادة
certSign.password=أدخل ملف تخزين المفاتيح أو كلمة المرور الخاصة (إن وجدت):
certSign.showSig=إظهار التوقيع
certSign.reason=السبب
certSign.location=الموقع
certSign.name=الاسم
certSign.submit=تسجيل PDF
#removeBlanks
removeBlanks.title=إزالة الفراغات
removeBlanks.header=إزالة الصفحات الفارغة
removeBlanks.threshold=العتبة:
removeBlanks.thresholdDesc=الحد الفاصل لتحديد مدى بياض البكسل الأبيض
removeBlanks.whitePercent=نسبة الأبيض (٪):
removeBlanks.whitePercentDesc=النسبة المئوية للصفحة التي يجب أن تكون بيضاء لتتم إزالتها
removeBlanks.submit=إزالة الفراغات
#compare
compare.title=يقارن compare.title=يقارن
compare.header=قارن ملفات PDF compare.header=قارن ملفات PDF
compare.document.1=المستند 1 compare.document.1=المستند 1
compare.document.2=المستند 2 compare.document.2=المستند 2
compare.submit=يقارن compare.submit=يقارن
sign.title = تسجيل الدخول
sign.header = توقيع ملفات PDF
sign.upload = تحميل الصورة
sign.draw = رسم التوقيع
Sign.text = إدخال النص
#sign
sign.title=تسجيل الدخول
sign.header=توقيع ملفات PDF
sign.upload=تحميل الصورة
sign.draw=رسم التوقيع
sign.text=Text Input
sign.clear=واضح sign.clear=واضح
sign.add = إضافة sign.add=إضافة
repair.title = إصلاح
repair.header = إصلاح ملفات PDF
repair.submit = الإصلاح
flatten.title = تسطيح #repair
flatten.header = تسوية ملفات PDF repair.title=إصلاح
flatten.submit = تسطيح repair.header=إصلاح ملفات PDF
repair.submit=الإصلاح
#flatten
flatten.title=تسطيح
flatten.header=تسوية ملفات PDF
flatten.submit=تسطيح
#ScannerImageSplit
ScannerImageSplit.selectText.1=عتبة الزاوية: ScannerImageSplit.selectText.1=عتبة الزاوية:
ScannerImageSplit.selectText.2=تعيين الحد الأدنى للزاوية المطلقة المطلوبة لتدوير الصورة (افتراضي: 10). ScannerImageSplit.selectText.2=تعيين الحد الأدنى للزاوية المطلقة المطلوبة لتدوير الصورة (افتراضي: 10).
ScannerImageSplit.selectText.3=التسامح: ScannerImageSplit.selectText.3=التسامح:
@@ -179,16 +522,6 @@ ScannerImageSplit.selectText.9=حجم الحدود:
ScannerImageSplit.selectText.10=يضبط حجم الحدود المضافة والمزالة لمنع الحدود البيضاء في الإخراج (الافتراضي: 1). ScannerImageSplit.selectText.10=يضبط حجم الحدود المضافة والمزالة لمنع الحدود البيضاء في الإخراج (الافتراضي: 1).
navbar.settings=\u0625\u0639\u062F\u0627\u062F\u0627\u062A
settings.title=\u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A
settings.update=\u0627\u0644\u062A\u062D\u062F\u064A\u062B \u0645\u062A\u0627\u062D
settings.appVersion=\u0625\u0635\u062F\u0627\u0631 \u0627\u0644\u062A\u0637\u0628\u064A\u0642:
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.downloadOption.1=\u0641\u062A\u062D \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0646\u0627\u0641\u0630\u0629
settings.downloadOption.2=\u0641\u062A\u062D \u0641\u064A \u0646\u0627\u0641\u0630\u0629 \u062C\u062F\u064A\u062F\u0629
settings.downloadOption.3=\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u0645\u0644\u0641
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
#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=\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.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=\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)
@@ -202,19 +535,21 @@ ocr.selectText.7=\u0641\u0631\u0636 \u0627\u0644\u062A\u0639\u0631\u0641 \u0627\
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=\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.9=\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0625\u0636\u0627\u0641\u064A\u0629 ocr.selectText.9=\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0625\u0636\u0627\u0641\u064A\u0629
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=\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.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=\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.credit=\u062A\u0633\u062A\u062E\u062F\u0645 \u0647\u0630\u0647 \u0627\u0644\u062E\u062F\u0645\u0629 OCRmyPDF \u0648 Tesseract \u0644 OCR. ocr.credit=\u062A\u0633\u062A\u062E\u062F\u0645 \u0647\u0630\u0647 \u0627\u0644\u062E\u062F\u0645\u0629 OCRmyPDF \u0648 Tesseract \u0644 OCR.
ocr.submit=\u0645\u0639\u0627\u0644\u062C\u0629 PDF \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 OCR ocr.submit=\u0645\u0639\u0627\u0644\u062C\u0629 PDF \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 OCR
#extractImages
extractImages.title=\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0627\u0644\u0635\u0648\u0631 extractImages.title=\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0627\u0644\u0635\u0648\u0631
extractImages.header=\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0627\u0644\u0635\u0648\u0631 extractImages.header=\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0627\u0644\u0635\u0648\u0631
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=\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.submit=\u0627\u0633\u062A\u062E\u0631\u0627\u062C extractImages.submit=\u0627\u0633\u062A\u062E\u0631\u0627\u062C
#File \u0625\u0644\u0649 PDF
#File to PDF
fileToPDF.title=\u0645\u0644\u0641 \u0625\u0644\u0649 PDF fileToPDF.title=\u0645\u0644\u0641 \u0625\u0644\u0649 PDF
fileToPDF.header=\u062A\u062D\u0648\u064A\u0644 \u0623\u064A \u0645\u0644\u0641 \u0625\u0644\u0649 PDF fileToPDF.header=\u062A\u062D\u0648\u064A\u0644 \u0623\u064A \u0645\u0644\u0641 \u0625\u0644\u0649 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=\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.
@@ -222,46 +557,50 @@ fileToPDF.supportedFileTypes=\u064A\u062C\u0628 \u0623\u0646 \u062A\u062A\u0636\
fileToPDF.submit=\u062A\u062D\u0648\u064A\u0644 \u0625\u0644\u0649 PDF fileToPDF.submit=\u062A\u062D\u0648\u064A\u0644 \u0625\u0644\u0649 PDF
#compress
compress.title=ضغط
compress.header=ضغط ملف PDF
compress.credit=تستخدم هذه الخدمة OCRmyPDF لضغط / تحسين PDF.
compress.selectText.1=الوضع اليدوي - من 1 إلى 4
compress.selectText.2=مستوى التحسين:
compress.selectText.3=4 (رهيب للصور النصية)
compress.selectText.4=الوضع التلقائي - يضبط الجودة تلقائيًا للحصول على ملف PDF بالحجم المحدد
compress.selectText.5=حجم PDF المتوقع (على سبيل المثال 25 ميجا بايت ، 10.8 ميجا بايت ، 25 كيلو بايت)
compress.submit=ضغطضغط
#Add image #Add image
addImage.title=إضافة صورة addImage.title=إضافة صورة
addImage.header=إضافة صورة إلى PDF addImage.header=إضافة صورة إلى PDF
addImage.everyPage=كل صفحة؟ addImage.everyPage=كل صفحة؟
addImage.upload=إضافة صورة
addImage.submit=إضافة صورة addImage.submit=إضافة صورة
#compress
compress.title=ضغط
compress.header=\u0636\u063A\u0637 PDF
compress.credit=\u062A\u0633\u062A\u062E\u062F\u0645 \u0647\u0630\u0647 \u0627\u0644\u062E\u062F\u0645\u0629 OCRmyPDF \u0644\u0636\u063A\u0637 / \u062A\u062D\u0633\u064A\u0646 PDF.
compress.selectText.1=\u0645\u0633\u062A\u0648\u0649 \u0627\u0644\u062A\u062D\u0633\u064A\u0646:
compress.selectText.2=0 (\u0628\u062F\u0648\u0646 \u062A\u062D\u0633\u064A\u0646)
compress.selectText.3=1 (\u0627\u0641\u062A\u0631\u0627\u0636\u064A\u060C \u062A\u062D\u0633\u064A\u0646 \u0628\u062F\u0648\u0646 \u0641\u0642\u062F\u0627\u0646)
compress.selectText.4=2 (\u062A\u062D\u0633\u064A\u0646 \u0636\u064A\u0627\u0639)
compress.selectText.5=3 (\u062A\u062D\u0633\u064A\u0646 \u0636\u064A\u0627\u0639 \u060C \u0623\u0643\u062B\u0631 \u0639\u062F\u0648\u0627\u0646\u064A\u0629)
compress.selectText.6=\u062A\u0645\u0643\u064A\u0646 \u0639\u0631\u0636 \u0627\u0644\u0648\u064A\u0628 \u0627\u0644\u0633\u0631\u064A\u0639 (\u062E\u0637\u064A PDF)
compress.selectText.7=\u062A\u0645\u0643\u064A\u0646 \u062A\u0631\u0645\u064A\u0632 JBIG2 \u0627\u0644\u0645\u0641\u0642\u0648\u062F
compress.submit=ضغط
#merge #merge
merge.title=دمج merge.title=دمج
merge.header=دمج ملفات PDF متعددة (2+) merge.header=دمج ملفات PDF متعددة (2+)
merge.submit=دمج merge.submit=دمج
#pdfOrganiser #pdfOrganiser
pdfOrganiser.title=منظم الصفحة pdfOrganiser.title=منظم الصفحة
pdfOrganiser.header=منظم صفحات PDF pdfOrganiser.header=منظم صفحات PDF
pdfOrganiser.submit=إعادة ترتيب الصفحات pdfOrganiser.submit=إعادة ترتيب الصفحات
#multiTool #multiTool
multiTool.title=أداة متعددة PDF multiTool.title=أداة متعددة PDF
multiTool.header=أداة متعددة PDF multiTool.header=أداة متعددة PDF
#pageRemover #pageRemover
pageRemover.title=مزيل الصفحة pageRemover.title=مزيل الصفحة
pageRemover.header=مزيل صفحة PDF pageRemover.header=مزيل صفحة PDF
pageRemover.pagesToDelete=الصفحات المراد حذفها (أدخل قائمة بأرقام الصفحات مفصولة بفواصل): pageRemover.pagesToDelete=الصفحات المراد حذفها (أدخل قائمة بأرقام الصفحات مفصولة بفواصل):
pageRemover.submit=حذف الصفحات pageRemover.submit=حذف الصفحات
#rotate #rotate
rotate.title=تدوير PDF rotate.title=تدوير PDF
rotate.header=تدوير PDF rotate.header=تدوير PDF
@@ -269,8 +608,6 @@ rotate.selectAngle=حدد زاوية الدوران (بمضاعفات 90 درج
rotate.submit=استدارة rotate.submit=استدارة
#merge #merge
split.title=انقسام PDF split.title=انقسام PDF
split.header=تقسيم PDF split.header=تقسيم PDF
@@ -296,6 +633,7 @@ imageToPDF.selectText.3=\u0627\u0644\u0645\u0646\u0637\u0642 \u0627\u0644\u0645\
imageToPDF.selectText.4=\u062F\u0645\u062C \u0641\u064A \u0645\u0644\u0641 PDF \u0648\u0627\u062D\u062F imageToPDF.selectText.4=\u062F\u0645\u062C \u0641\u064A \u0645\u0644\u0641 PDF \u0648\u0627\u062D\u062F
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=\u062A\u062D\u0648\u064A\u0644 \u0625\u0644\u0649 \u0645\u0644\u0641\u0627\u062A PDF \u0645\u0646\u0641\u0635\u0644\u0629
#pdfToImage #pdfToImage
pdfToImage.title=تحويل PDF إلى صورة pdfToImage.title=تحويل PDF إلى صورة
pdfToImage.header=تحويل PDF إلى صورة pdfToImage.header=تحويل PDF إلى صورة
@@ -309,6 +647,7 @@ pdfToImage.grey=\u062A\u062F\u0631\u062C \u0627\u0644\u0631\u0645\u0627\u062F\u0
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=\u0623\u0628\u064A\u0636 \u0648\u0623\u0633\u0648\u062F (\u0642\u062F \u064A\u0641\u0642\u062F \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A!)
pdfToImage.submit=تحول pdfToImage.submit=تحول
#addPassword #addPassword
addPassword.title=إضافة كلمة مرور addPassword.title=إضافة كلمة مرور
addPassword.header=إضافة كلمة مرور (تشفير) addPassword.header=إضافة كلمة مرور (تشفير)
@@ -325,8 +664,12 @@ addPassword.selectText.10=منع التعديل
addPassword.selectText.11=منع تعديل التعليقات التوضيحية addPassword.selectText.11=منع تعديل التعليقات التوضيحية
addPassword.selectText.12=منع الطباعة addPassword.selectText.12=منع الطباعة
addPassword.selectText.13=منع طباعة تنسيقات مختلفة addPassword.selectText.13=منع طباعة تنسيقات مختلفة
addPassword.selectText.14=Owner Password
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
addPassword.selectText.16=Restricts the opening of the document itself
addPassword.submit=تشفير addPassword.submit=تشفير
#watermark #watermark
watermark.title=إضافة علامة مائية watermark.title=إضافة علامة مائية
watermark.header=إضافة علامة مائية watermark.header=إضافة علامة مائية
@@ -339,6 +682,7 @@ watermark.selectText.6=heightSpacer (مسافة بين كل علامة مائي
watermark.selectText.7=\u0627\u0644\u062A\u0639\u062A\u064A\u0645 (0\u066A - 100\u066A): watermark.selectText.7=\u0627\u0644\u062A\u0639\u062A\u064A\u0645 (0\u066A - 100\u066A):
watermark.submit=إضافة علامة مائية watermark.submit=إضافة علامة مائية
#remove-watermark #remove-watermark
remove-watermark.title=\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0645\u0627\u0626\u064A\u0629 remove-watermark.title=\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0645\u0627\u0626\u064A\u0629
remove-watermark.header=\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0645\u0627\u0626\u064A\u0629 remove-watermark.header=\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0645\u0627\u0626\u064A\u0629
@@ -346,6 +690,7 @@ remove-watermark.selectText.1=\u062D\u062F\u062F PDF \u0644\u0625\u0632\u0627\u0
remove-watermark.selectText.2=\u0646\u0635 \u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0645\u0627\u0626\u064A\u0629: remove-watermark.selectText.2=\u0646\u0635 \u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0645\u0627\u0626\u064A\u0629:
remove-watermark.submit=\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0645\u0627\u0626\u064A\u0629 remove-watermark.submit=\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0645\u0627\u0626\u064A\u0629
#Change permissions #Change permissions
permissions.title=تغيير الأذونات permissions.title=تغيير الأذونات
permissions.header=تغيير الأذونات permissions.header=تغيير الأذونات
@@ -362,6 +707,7 @@ permissions.selectText.9=منع الطباعة
permissions.selectText.10=منع طباعة التنسيقات المختلفة permissions.selectText.10=منع طباعة التنسيقات المختلفة
permissions.submit=تغيير permissions.submit=تغيير
#remove password #remove password
removePassword.title=إزالة كلمة المرور removePassword.title=إزالة كلمة المرور
removePassword.header=إزالة كلمة المرور (فك التشفير) removePassword.header=إزالة كلمة المرور (فك التشفير)
@@ -369,7 +715,9 @@ removePassword.selectText.1=حدد PDF لفك التشفير
removePassword.selectText.2=كلمة المرور removePassword.selectText.2=كلمة المرور
removePassword.submit=إزالة removePassword.submit=إزالة
changeMetadata.title=\u062A\u063A\u064A\u064A\u0631 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629
#changeMetadata
changeMetadata.title=\u0627\u0644\u0639\u0646\u0648\u0627\u0646:
changeMetadata.header=\u062A\u063A\u064A\u064A\u0631 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629 changeMetadata.header=\u062A\u063A\u064A\u064A\u0631 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629
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=\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.2=\u062D\u0630\u0641 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0623\u0648\u0644\u064A\u0629 changeMetadata.selectText.2=\u062D\u0630\u0641 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0623\u0648\u0644\u064A\u0629
@@ -388,24 +736,29 @@ changeMetadata.selectText.5=\u0625\u0636\u0627\u0641\u0629 \u0625\u062F\u062E\u0
changeMetadata.submit=\u062A\u063A\u064A\u064A\u0631 changeMetadata.submit=\u062A\u063A\u064A\u064A\u0631
#xlsToPdf
xlsToPdf.title=\u062A\u062D\u0648\u064A\u0644 Excel \u0625\u0644\u0649 PDF xlsToPdf.title=\u062A\u062D\u0648\u064A\u0644 Excel \u0625\u0644\u0649 PDF
xlsToPdf.header=\u062A\u062D\u0648\u064A\u0644 Excel \u0625\u0644\u0649 PDF xlsToPdf.header=\u062A\u062D\u0648\u064A\u0644 Excel \u0625\u0644\u0649 PDF
xlsToPdf.selectText.1=\u062D\u062F\u062F \u0648\u0631\u0642\u0629 \u0625\u0643\u0633\u0644 XLS \u0623\u0648 XLSX \u0644\u0644\u062A\u062D\u0648\u064A\u0644 xlsToPdf.selectText.1=\u062D\u062F\u062F \u0648\u0631\u0642\u0629 \u0625\u0643\u0633\u0644 XLS \u0623\u0648 XLSX \u0644\u0644\u062A\u062D\u0648\u064A\u0644
xlsToPdf.convert=\u062A\u062D\u0648\u064A\u0644 xlsToPdf.convert=\u062A\u062D\u0648\u064A\u0644
#pdfToPDFA
pdfToPDFA.title=PDF \u0625\u0644\u0649 PDF / A pdfToPDFA.title=PDF \u0625\u0644\u0649 PDF / A
pdfToPDFA.header=PDF \u0625\u0644\u0649 PDF / A pdfToPDFA.header=PDF \u0625\u0644\u0649 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=\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.submit=\u062A\u062D\u0648\u064A\u0644 pdfToPDFA.submit=\u062A\u062D\u0648\u064A\u0644
#PDFToWord
PDFToWord.title=تحويل PDF إلى 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 لتحويل الملفات.
PDFToWord.submit=تحويل PDFToWord.submit=تحويل
#PDFToPresentation
PDFToPresentation.title=PDF للعرض التقديمي PDFToPresentation.title=PDF للعرض التقديمي
PDFToPresentation.header=PDF للعرض التقديمي PDFToPresentation.header=PDF للعرض التقديمي
PDFToPresentation.selectText.1=تنسيق ملف الإخراج PDFToPresentation.selectText.1=تنسيق ملف الإخراج
@@ -413,6 +766,7 @@ PDFToPresentation.credit=تستخدم هذه الخدمة LibreOffice لتحوي
PDFToPresentation.submit=تحويل PDFToPresentation.submit=تحويل
#PDFToText
PDFToText.title=تحويل PDF إلى نص / RTF PDFToText.title=تحويل PDF إلى نص / RTF
PDFToText.header=تحويل PDF إلى نص / RTF PDFToText.header=تحويل PDF إلى نص / RTF
PDFToText.selectText.1=تنسيق ملف الإخراج PDFToText.selectText.1=تنسيق ملف الإخراج
@@ -420,11 +774,14 @@ PDFToText.credit=تستخدم هذه الخدمة LibreOffice لتحويل ال
PDFToText.submit=تحويل PDFToText.submit=تحويل
#PDFToHTML
PDFToHTML.title=PDF إلى HTML PDFToHTML.title=PDF إلى HTML
PDFToHTML.header=PDF إلى HTML PDFToHTML.header=PDF إلى HTML
PDFToHTML.credit=تستخدم هذه الخدمة LibreOffice لتحويل الملفات. PDFToHTML.credit=تستخدم هذه الخدمة LibreOffice لتحويل الملفات.
PDFToHTML.submit=تحويل PDFToHTML.submit=تحويل
#PDFToXML
PDFToXML.title=تحويل PDF إلى XML PDFToXML.title=تحويل PDF إلى XML
PDFToXML.header=تحويل PDF إلى XML PDFToXML.header=تحويل PDF إلى XML
PDFToXML.credit=تستخدم هذه الخدمة LibreOffice لتحويل الملفات. PDFToXML.credit=تستخدم هذه الخدمة LibreOffice لتحويل الملفات.

View File

@@ -1,7 +1,7 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr = left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr language.direction=ltr
pdfPrompt=Selecciona PDF(s) pdfPrompt=Selecciona PDF(s)
@@ -20,115 +20,456 @@ close=Tanca
filesSelected=fitxers seleccionats filesSelected=fitxers seleccionats
noFavourites=No s'ha afegit cap favorit noFavourites=No s'ha afegit cap favorit
bored=Avorrit esperant? bored=Avorrit esperant?
alphabet=Alfabet
downloadPdf=Descarregueu PDF
text=Text
font=Tipus de lletra
selectFillter=-- Selecciona --
pageNum=Número de pàgina
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
#############
# NAVBAR #
#############
navbar.convert=Converteix
navbar.security=Seguretat
navbar.other=Altres
navbar.darkmode=Mode Fost
navbar.pageOps=Operacions de Pàgina
navbar.settings=Opcions
#############
# SETTINGS #
#############
settings.title=Opcions
settings.update=Actualització Disponible
settings.appVersion=Versió App:
settings.downloadOption.title=Trieu l'opció de descàrrega (per a descàrregues d'un sol fitxer no zip):
settings.downloadOption.1=Obre mateixa finestra
settings.downloadOption.2=Obre mateixa finestra
settings.downloadOption.3=Descarrega Arxiu
settings.zipThreshold=Comprimiu els fitxers quan el nombre de fitxers baixats superi
############# #############
# HOME-PAGE # # HOME-PAGE #
############# #############
home.desc=L'eina allotjada localment per a necessitats PDF. home.desc=L'eina allotjada localment per a necessitats PDF.
navbar.convert=Converteix
navbar.security=Seguretat
navbar.other=Altres
navbar.darkmode=Mode Fost
navbar.pageOps=Operacions de Pàgina
home.multiTool.title=PDF Multi Tool home.multiTool.title=PDF Multi Tool
home.multiTool.desc=Fusiona, Rota, Reorganitza, i Esborra pàgines home.multiTool.desc=Fusiona, Rota, Reorganitza, i Esborra pàgines
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
home.merge.title=Fusiona home.merge.title=Fusiona
home.merge.desc=Fusiona fàcilment pàgines en una. home.merge.desc=Fusiona fàcilment pàgines en una.
merge.tags=merge,Page operations,Back end,server side
home.split.title=Divideix home.split.title=Divideix
home.split.desc=Divideix PDFs en múltiples documents home.split.desc=Divideix PDFs en múltiples documents
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=Rota home.rotate.title=Rota
home.rotate.desc=Rota els PDFs. home.rotate.desc=Rota els PDFs.
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
home.imageToPdf.title=Imatge a PDF home.imageToPdf.title=Imatge a PDF
home.imageToPdf.desc=Converteix imatge (PNG, JPEG, GIF) a PDF. home.imageToPdf.desc=Converteix imatge (PNG, JPEG, GIF) a PDF.
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=PDF a Imatge home.pdfToImage.title=PDF a Imatge
home.pdfToImage.desc=Converteix PDF a imatge. (PNG, JPEG, GIF) home.pdfToImage.desc=Converteix PDF a imatge. (PNG, JPEG, GIF)
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=Organitza home.pdfOrganiser.title=Organitza
home.pdfOrganiser.desc=Elimina/Reorganitza pàgines en qualsevol ordre home.pdfOrganiser.desc=Elimina/Reorganitza pàgines en qualsevol ordre
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=Afegir imatge a PDF home.addImage.title=Afegir imatge a PDF
home.addImage.desc=Afegeix imatge en un PDF (En progrés) home.addImage.desc=Afegeix imatge en un PDF (En progrés)
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
home.watermark.title=Afegir Marca d'aigua home.watermark.title=Afegir Marca d'aigua
home.watermark.desc=Afegir Marca d'aigua personalitzada en un PDF home.watermark.desc=Afegir Marca d'aigua personalitzada en un PDF
##########################
home.remove-watermark.title=Treure Marca d'Aigua ### TODO: Translate ###
home.remove-watermark.desc=Treu Marca d'Aigua d'un PDF ##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.permissions.title=Canvia permissos home.permissions.title=Canvia permissos
home.permissions.desc=Canvia permisos del document PDF home.permissions.desc=Canvia permisos del document PDF
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
home.removePages.title=Elimina home.removePages.title=Elimina
home.removePages.desc=Elimina pàgines del document PDF. home.removePages.desc=Elimina pàgines del document PDF.
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
home.addPassword.title=Afegir Password home.addPassword.title=Afegir Password
home.addPassword.desc=Xifra document PDF amb password. home.addPassword.desc=Xifra document PDF amb password.
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
home.removePassword.title=Elimina Password home.removePassword.title=Elimina Password
home.removePassword.desc=Elimia Password de document PDF. home.removePassword.desc=Elimia Password de document PDF.
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=Comprimeix home.compressPdfs.title=Comprimeix
home.compressPdfs.desc=Comprimeix PDFs per reduir la mida. home.compressPdfs.desc=Comprimeix PDFs per reduir la mida.
##########################
### TODO: Translate ###
##########################
compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=Canvia Metadades home.changeMetadata.title=Canvia Metadades
home.changeMetadata.desc=Canvia/Treu/Afegeix matadades al document PDF. home.changeMetadata.desc=Canvia/Treu/Afegeix matadades al document PDF.
##########################
### TODO: Translate ###
##########################
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=Converteix arxiu a PDF home.fileToPDF.title=Converteix arxiu a PDF
home.fileToPDF.desc=Converteix qualsevol arxiu a PDF (DOCX, PNG, XLS, PPT, TXT i més) home.fileToPDF.desc=Converteix qualsevol arxiu a PDF (DOCX, PNG, XLS, PPT, TXT i més)
##########################
### TODO: Translate ###
##########################
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=Executa exploracions OCR i/o neteja escanejos home.ocr.title=Executa exploracions OCR i/o neteja escanejos
home.ocr.desc=Neteja escanejats i detecta text d'imatges dins d'un PDF i el torna a afegir com a text. home.ocr.desc=Neteja escanejats i detecta text d'imatges dins d'un PDF i el torna a afegir com a text.
##########################
### TODO: Translate ###
##########################
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
home.extractImages.title=Extreu Imatges home.extractImages.title=Extreu Imatges
home.extractImages.desc=Extreu les Imatges del PDF i les desa a zip home.extractImages.desc=Extreu les Imatges del PDF i les desa a zip
##########################
### TODO: Translate ###
##########################
extractImages.tags=picture,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=PDF a PDF/A home.pdfToPDFA.title=PDF a PDF/A
home.pdfToPDFA.desc=Converteix PDF a PDF/A per desar a llarg termini. home.pdfToPDFA.desc=Converteix PDF a PDF/A per desar a llarg termini.
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=PDF a Word home.PDFToWord.title=PDF a Word
home.PDFToWord.desc=Converteix PDF a formats de Word (DOC, DOCX and ODT) home.PDFToWord.desc=Converteix PDF a formats de Word (DOC, DOCX and ODT)
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=PDF a Presentació home.PDFToPresentation.title=PDF a Presentació
home.PDFToPresentation.desc=Convert PDF to Presentation formats (PPT, PPTX and ODP) home.PDFToPresentation.desc=Convert PDF to Presentation formats (PPT, PPTX and ODP)
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=PDF a Text/RTF home.PDFToText.title=PDF a Text/RTF
home.PDFToText.desc=Converteix PDF a Text o format RTF home.PDFToText.desc=Converteix PDF a Text o format RTF
##########################
### TODO: Translate ###
##########################
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDF a HTML home.PDFToHTML.title=PDF a HTML
home.PDFToHTML.desc=Converteix PDF a format HTML home.PDFToHTML.desc=Converteix PDF a format HTML
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=PDF a XML home.PDFToXML.title=PDF a XML
home.PDFToXML.desc=Converteix PDF a format XML home.PDFToXML.desc=Converteix PDF a format XML
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=Detecta/Divideix fotos escanejades home.ScannerImageSplit.title=Detecta/Divideix fotos escanejades
home.ScannerImageSplit.desc=Divideix múltiples fotos dins del PDF/foto home.ScannerImageSplit.desc=Divideix múltiples fotos dins del PDF/foto
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title=Sign home.sign.title=Sign
home.sign.desc=Afegeix signatura al PDF mitjançant dibuix, text o imatge home.sign.desc=Afegeix signatura al PDF mitjançant dibuix, text o imatge
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=Aplanar home.flatten.title=Aplanar
home.flatten.desc=Elimineu tots els elements i formularis interactius d'un PDF home.flatten.desc=Elimineu tots els elements i formularis interactius d'un PDF
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title=Reparar home.repair.title=Reparar
home.repair.desc=Intenta reparar un PDF danyat o trencat home.repair.desc=Intenta reparar un PDF danyat o trencat
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
home.removeBlanks.title=Elimina les pàgines en blanc home.removeBlanks.title=Elimina les pàgines en blanc
home.removeBlanks.desc=Detecta i elimina les pàgines en blanc d'un document home.removeBlanks.desc=Detecta i elimina les pàgines en blanc d'un document
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title=Compara home.compare.title=Compara
home.compare.desc=Compara i mostra les diferències entre 2 documents PDF home.compare.desc=Compara i mostra les diferències entre 2 documents PDF
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
downloadPdf=Descarregueu PDF home.certSign.title=Sign with Certificate
text=Text home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
font=Tipus de lletra ##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Multi-Page Layout
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
##########################
### TODO: Translate ###
##########################
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=Adjust page size/scale
home.scalePages.desc=Change the size/scale of page and/or its contents.
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
##########################
### TODO: Translate ###
##########################
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
##########################
### TODO: Translate ###
##########################
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
##########################
### TODO: Translate ###
##########################
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
##########################
### TODO: Translate ###
##########################
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
##########################
### TODO: Translate ###
##########################
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
##########################
### TODO: Translate ###
##########################
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
##########################
### TODO: Translate ###
##########################
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Multi Page Layout
pageLayout.header=Multi Page Layout
pageLayout.pagesPerSheet=Pages per sheet:
pageLayout.submit=Submit
#scalePages
scalePages.title=Adjust page-scale
scalePages.header=Adjust page-scale
scalePages.pageSize=Size of a page of the document.
scalePages.scaleFactor=Zoom level (crop) of a page.
scalePages.submit=Submit
#certSign
certSign.title=Significació del certificat
certSign.header=Firmar un PDF amb el vostre certificat (Treball en curs)
certSign.selectPDF=Seleccioneu un fitxer PDF per signar:
certSign.selectKey=Seleccioneu el vostre fitxer de clau privada (format PKCS#8, podria ser .pem o .der):
certSign.selectCert=Seleccioneu el vostre fitxer de certificat (format X.509, podria ser .pem o .der):
certSign.selectP12=Seleccioneu el vostre fitxer de magatzem de claus PKCS#12 (.p12 o .pfx) (Opcional, si es proporciona, hauria de contenir la vostra clau privada i certificat):
certSign.certType=Tipus de certificat
certSign.password=Introduïu el vostre magatzem de claus o contrasenya de clau privada (si n'hi ha):
certSign.showSig=Mostra la signatura
certSign.reason=Motiu
certSign.location=Ubicació
certSign.name=Nom
certSign.submit=Firma PDF
#removeBlanks
removeBlanks.title=Elimina els espais en blanc removeBlanks.title=Elimina els espais en blanc
removeBlanks.header=Elimina les pàgines en blanc removeBlanks.header=Elimina les pàgines en blanc
removeBlanks.threshold=Llindar: removeBlanks.threshold=Llindar:
@@ -137,12 +478,16 @@ removeBlanks.whitePercent=Percentatge blanc (%):
removeBlanks.whitePercentDesc=Percentatge de pàgina que ha de ser blanca per eliminar-la removeBlanks.whitePercentDesc=Percentatge de pàgina que ha de ser blanca per eliminar-la
removeBlanks.submit=Elimina els espais en blanc removeBlanks.submit=Elimina els espais en blanc
#compare
compare.title=Comparar compare.title=Comparar
compare.header=Compara PDF compare.header=Compara PDF
compare.document.1=Document 1 compare.document.1=Document 1
compare.document.2=Document 2 compare.document.2=Document 2
compare.submit=Comparar compare.submit=Comparar
#sign
sign.title=Sign sign.title=Sign
sign.header=Firma els PDF sign.header=Firma els PDF
sign.upload=Penja la imatge sign.upload=Penja la imatge
@@ -151,14 +496,20 @@ sign.text=Entrada de text
sign.clear=Esborrar sign.clear=Esborrar
sign.add=Afegeix sign.add=Afegeix
#repair
repair.title=Reparar repair.title=Reparar
repair.header=Repara els PDF repair.header=Repara els PDF
repair.submit=Reparar repair.submit=Reparar
#flatten
flatten.title=Aplanar flatten.title=Aplanar
flatten.header=Aplana els PDF flatten.header=Aplana els PDF
flatten.submit=Aplanar flatten.submit=Aplanar
#ScannerImageSplit
ScannerImageSplit.selectText.1=Llindar d'angle: ScannerImageSplit.selectText.1=Llindar d'angle:
ScannerImageSplit.selectText.2=Estableix l'angle absolut mínim necessari perquè la imatge es giri (per defecte: 10). ScannerImageSplit.selectText.2=Estableix l'angle absolut mínim necessari perquè la imatge es giri (per defecte: 10).
ScannerImageSplit.selectText.3=Tolerància: ScannerImageSplit.selectText.3=Tolerància:
@@ -170,19 +521,6 @@ ScannerImageSplit.selectText.8=Estableix el llindar mínim de l'àrea de contorn
ScannerImageSplit.selectText.9=Mida Vora: ScannerImageSplit.selectText.9=Mida Vora:
ScannerImageSplit.selectText.10=Estableix la mida de la vora afegida i eliminada per evitar vores blanques a la sortida (per defecte: 1). ScannerImageSplit.selectText.10=Estableix la mida de la vora afegida i eliminada per evitar vores blanques a la sortida (per defecte: 1).
navbar.settings=Opcions
settings.title=Opcions
settings.update=Actualització Disponible
settings.appVersion=Versió App:
settings.downloadOption.title=Trieu l'opció de descàrrega (per a descàrregues d'un sol fitxer no zip):
settings.downloadOption.1=Obre mateixa finestra
settings.downloadOption.2=Obre mateixa finestra
settings.downloadOption.3=Descarrega Arxiu
settings.zipThreshold=Comprimiu els fitxers quan el nombre de fitxers baixats superi
#OCR #OCR
ocr.title=OCR / Neteja escaneig ocr.title=OCR / Neteja escaneig
@@ -204,7 +542,7 @@ ocr.credit=Aquest servei empra OCRmyPDF i Tesseract per OCR.
ocr.submit=Processa PDF amb OCR ocr.submit=Processa PDF amb OCR
#extractImages
extractImages.title=Extreu Imatges extractImages.title=Extreu Imatges
extractImages.header=Extreu Imatges extractImages.header=Extreu Imatges
extractImages.selectText=Selecciona el format d'imatge al qual convertir les imatges extretes extractImages.selectText=Selecciona el format d'imatge al qual convertir les imatges extretes
@@ -220,23 +558,22 @@ fileToPDF.submit=Converteix a PDF
#compress #compress
compress.title=Comprimeix compress.title=Comprimir
compress.header=Comprimeix PDF compress.header=Comprimir PDF
compress.credit=Utilitza OCRmyPDF per Compressió/Optimització de PDF. compress.credit=Aquest servei utilitza Ghostscript per a la compressió/optimització de PDF.
compress.selectText.1=Nivell Optimització: compress.selectText.1=Mode manual: de l'1 al 4
compress.selectText.2=0 (Sense Optimització) compress.selectText.2=Nivell d'optimització:
compress.selectText.3=1 (Defecte, sense pèrdua Optimització) compress.selectText.3=4 (terrible per a imatges de text)
compress.selectText.4=2 (Pèrdua Optimització) compress.selectText.4=Mode automàtic: ajusta automàticament la qualitat per tal que el PDF tingui la mida exacta
compress.selectText.5=3 (Pèrdua Optimització, més agressiu) compress.selectText.5=Mida esperada del PDF (p. ex. 25 MB, 10,8 MB, 25 KB)
compress.selectText.6=Activa la visualització web ràpida (linealitza PDF) compress.submit=Comprimir
compress.selectText.7=Activa pèrdua codificació JBIG2
compress.submit=Comprimeix
#Add image #Add image
addImage.title=Afegir Imatge addImage.title=Afegir Imatge
addImage.header=Afegir Imatge a PDF (en construcció) addImage.header=Afegir Imatge a PDF (en construcció)
addImage.everyPage=Totes les pàgines? addImage.everyPage=Totes les pàgines?
addImage.upload=Afegir Imatge
addImage.submit=Afegir Imatge addImage.submit=Afegir Imatge
@@ -245,11 +582,13 @@ merge.title=Fusiona
merge.header=Fusiona múltiples PDFs (2+) merge.header=Fusiona múltiples PDFs (2+)
merge.submit=Fusiona merge.submit=Fusiona
#pdfOrganiser #pdfOrganiser
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
#multiTool #multiTool
multiTool.title=PDF Multi Tool multiTool.title=PDF Multi Tool
multiTool.header=PDF Multi Tool multiTool.header=PDF Multi Tool
@@ -261,6 +600,7 @@ 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
#rotate #rotate
rotate.title=Rota PDF rotate.title=Rota PDF
rotate.header=Rota PDF rotate.header=Rota PDF
@@ -268,8 +608,6 @@ rotate.selectAngle=Selecciona l'angle de gir (en múltiples de 90 graus):
rotate.submit=Rota rotate.submit=Rota
#merge #merge
split.title=Divideix PDF split.title=Divideix PDF
split.header=Divideix PDF split.header=Divideix PDF
@@ -295,6 +633,7 @@ imageToPDF.selectText.3=Lògica de diversos fitxers (només està activada si es
imageToPDF.selectText.4=Combina en un únic PDF imageToPDF.selectText.4=Combina en un únic PDF
imageToPDF.selectText.5=Converteix per separar PDFs imageToPDF.selectText.5=Converteix per separar PDFs
#pdfToImage #pdfToImage
pdfToImage.title=PDF a Imatge pdfToImage.title=PDF a Imatge
pdfToImage.header=PDF a Imatge pdfToImage.header=PDF a Imatge
@@ -308,6 +647,7 @@ pdfToImage.grey=Escala de Grisos
pdfToImage.blackwhite=Blanc i Negre (Pot perdre dades!) pdfToImage.blackwhite=Blanc i Negre (Pot perdre dades!)
pdfToImage.submit=Converteix pdfToImage.submit=Converteix
#addPassword #addPassword
addPassword.title=Afegir Password addPassword.title=Afegir Password
addPassword.header=Afegir password (Encriptat) addPassword.header=Afegir password (Encriptat)
@@ -324,8 +664,12 @@ addPassword.selectText.10=Evita modificacions
addPassword.selectText.11=Evita modificacions d'annotacions addPassword.selectText.11=Evita modificacions d'annotacions
addPassword.selectText.12=Evita impressió addPassword.selectText.12=Evita impressió
addPassword.selectText.13=Evita impressió de diferents formats addPassword.selectText.13=Evita impressió de diferents formats
addPassword.selectText.14=Owner Password
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
addPassword.selectText.16=Restricts the opening of the document itself
addPassword.submit=Encripta addPassword.submit=Encripta
#watermark #watermark
watermark.title=Afegir Marca d'Aigua watermark.title=Afegir Marca d'Aigua
watermark.header=Afegir Marca d'Aigua watermark.header=Afegir Marca d'Aigua
@@ -338,6 +682,7 @@ watermark.selectText.6=separació d'alçada (Espai vertical entre cada Marca d'A
watermark.selectText.7=Opacitat (0% - 100%): watermark.selectText.7=Opacitat (0% - 100%):
watermark.submit=Afegir Marca d'Aigua watermark.submit=Afegir Marca d'Aigua
#remove-watermark #remove-watermark
remove-watermark.title=Elimina Marca d'Aigua remove-watermark.title=Elimina Marca d'Aigua
remove-watermark.header=Elimina Marca d'Aigua remove-watermark.header=Elimina Marca d'Aigua
@@ -345,6 +690,7 @@ remove-watermark.selectText.1=Seleciona PDF per eliminar Marca d'Aigua:
remove-watermark.selectText.2=Text de la Marca d'Aigua: remove-watermark.selectText.2=Text de la Marca d'Aigua:
remove-watermark.submit=Elimina Marca d'Aigua remove-watermark.submit=Elimina Marca d'Aigua
#Change permissions #Change permissions
permissions.title=Canviar Permissos permissions.title=Canviar Permissos
permissions.header=Canviar Permissos permissions.header=Canviar Permissos
@@ -361,6 +707,7 @@ permissions.selectText.9=Evita impressió
permissions.selectText.10=Evita impressió de diferents formats permissions.selectText.10=Evita impressió de diferents formats
permissions.submit=Canviar Permissos permissions.submit=Canviar Permissos
#remove password #remove password
removePassword.title=Treure Password removePassword.title=Treure Password
removePassword.header=Treure Password (Decriptar) removePassword.header=Treure Password (Decriptar)
@@ -368,7 +715,9 @@ removePassword.selectText.1=Selecciona PDF a Decriptar
removePassword.selectText.2=Password removePassword.selectText.2=Password
removePassword.submit=Treu Password removePassword.submit=Treu Password
changeMetadata.title=Canvia Metadades
#changeMetadata
changeMetadata.title=Títol:
changeMetadata.header=Canvia Metadades changeMetadata.header=Canvia Metadades
changeMetadata.selectText.1=Edit les variables a canviar changeMetadata.selectText.1=Edit les variables a canviar
changeMetadata.selectText.2=Neteja totes les matadades changeMetadata.selectText.2=Neteja totes les matadades
@@ -386,27 +735,30 @@ changeMetadata.selectText.4=Altres Metadades:
changeMetadata.selectText.5=Afegir entrada personalizada changeMetadata.selectText.5=Afegir entrada personalizada
changeMetadata.submit=Canvia changeMetadata.submit=Canvia
#xlsToPdf
xlsToPdf.title=Excel a PDF xlsToPdf.title=Excel a PDF
xlsToPdf.header=Excel a PDF xlsToPdf.header=Excel a PDF
xlsToPdf.selectText.1=Selecciona arxiu XLS o XLSX a convertir xlsToPdf.selectText.1=Selecciona arxiu XLS o XLSX a convertir
xlsToPdf.convert=Converteix xlsToPdf.convert=Converteix
#pdfToPDFA
pdfToPDFA.title=PDF a PDF/A pdfToPDFA.title=PDF a PDF/A
pdfToPDFA.header=PDF a PDF/A pdfToPDFA.header=PDF a PDF/A
pdfToPDFA.credit=Utilitza OCRmyPDF per la conversió a PDF/A pdfToPDFA.credit=Utilitza OCRmyPDF per la conversió a PDF/A
pdfToPDFA.submit=Converteix pdfToPDFA.submit=Converteix
#PDFToWord
PDFToWord.title=PDF a Word PDFToWord.title=PDF a Word
PDFToWord.header=PDF a Word PDFToWord.header=PDF a Word
PDFToWord.selectText.1=Format d'Arxiu de Sortida PDFToWord.selectText.1=Format d'Arxiu de Sortida
PDFToWord.credit=Utilitza LibreOffice per a la conversió d'Arxius. PDFToWord.credit=Utilitza LibreOffice per a la conversió d'Arxius.
PDFToWord.submit=Converteix PDFToWord.submit=Converteix
#PDFToPresentation
PDFToPresentation.title=PDF a Presentació PDFToPresentation.title=PDF a Presentació
PDFToPresentation.header=PDF a Presentació PDFToPresentation.header=PDF a Presentació
PDFToPresentation.selectText.1=Format d'Arxiu de Sortida PDFToPresentation.selectText.1=Format d'Arxiu de Sortida
@@ -414,6 +766,7 @@ PDFToPresentation.credit=Utilitza LibreOffice per a la conversió d'Arxius.
PDFToPresentation.submit=Converteix PDFToPresentation.submit=Converteix
#PDFToText
PDFToText.title=PDF a Text/RTF PDFToText.title=PDF a Text/RTF
PDFToText.header=PDF a Text/RTF PDFToText.header=PDF a Text/RTF
PDFToText.selectText.1=Format d'Arxiu de Sortida PDFToText.selectText.1=Format d'Arxiu de Sortida
@@ -421,24 +774,15 @@ PDFToText.credit=Utilitza LibreOffice per a la conversió d'Arxius.
PDFToText.submit=Converteix PDFToText.submit=Converteix
#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 LibreOffice per a la conversió d'Arxius.
PDFToHTML.submit=Converteix PDFToHTML.submit=Converteix
#PDFToXML
PDFToXML.title=PDF a XML PDFToXML.title=PDF a XML
PDFToXML.header=PDF a XML PDFToXML.header=PDF a XML
PDFToXML.credit=Utilitza LibreOffice per a la conversió d'Arxius. PDFToXML.credit=Utilitza LibreOffice per a la conversió d'Arxius.
PDFToXML.submit=Converteix PDFToXML.submit=Converteix

View File

@@ -1,7 +1,7 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl=right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr language.direction=ltr
pdfPrompt=PDF auswählen pdfPrompt=PDF auswählen
@@ -20,114 +20,456 @@ close=Schließen
filesSelected=Dateien ausgewählt filesSelected=Dateien ausgewählt
noFavourites=Keine Favoriten hinzugefügt noFavourites=Keine Favoriten hinzugefügt
bored=Gelangweiltes Warten? bored=Gelangweiltes Warten?
############# alphabet=Alphabet
# HOME-PAGE # downloadPdf=PDF herunterladen
############# text=Text
home.desc=Ihr lokal gehosteter One-Stop-Shop für alle Ihre PDF-Anforderungen. font=Schriftart
selectFillter=-- Auswählen --
pageNum=Seitenzahl
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
#############
# NAVBAR #
#############
navbar.convert=Konvertieren navbar.convert=Konvertieren
navbar.security=Sicherheit navbar.security=Sicherheit
navbar.other=Anderes navbar.other=Anderes
navbar.darkmode=Dark Mode navbar.darkmode=Dark Mode
navbar.pageOps=Seitenoperationen navbar.pageOps=Seitenoperationen
navbar.settings=Einstellungen
#############
# SETTINGS #
#############
settings.title=Einstellungen
settings.update=Update verfügbar
settings.appVersion=App-Version:
settings.downloadOption.title=Download-Option wählen (für einzelne Dateien, die keine Zip-Downloads sind):
settings.downloadOption.1=Im selben Fenster öffnen
settings.downloadOption.2=In neuem Fenster öffnen
settings.downloadOption.3=Datei herunterladen
settings.zipThreshold=Dateien komprimieren, wenn die Anzahl der heruntergeladenen Dateien überschritten wird
#############
# HOME-PAGE #
#############
home.desc=Ihr lokal gehosteter One-Stop-Shop für alle Ihre PDF-Anforderungen.
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
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
home.split.title=Aufteilen home.split.title=Aufteilen
home.split.desc=PDFs in mehrere Dokumente aufteilen. home.split.desc=PDFs in mehrere Dokumente aufteilen.
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
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.
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
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.
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
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).
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=Organisieren home.pdfOrganiser.title=Organisieren
home.pdfOrganiser.desc=Seiten entfernen und Seitenreihenfolge ändern. home.pdfOrganiser.desc=Seiten entfernen und Seitenreihenfolge ändern.
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
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 (Work in progress). home.addImage.desc=Fügt ein Bild an eine bestimmte Stelle im PDF ein (Work in progress).
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
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.
##########################
home.remove-watermark.title=Wasserzeichen entfernen ### TODO: Translate ###
home.remove-watermark.desc=Wasserzeichen aus Ihrem PDF-Dokument entfernen. ##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
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.
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
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.
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
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.
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
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.
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
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.
##########################
### TODO: Translate ###
##########################
compressPdfs.tags=squish,small,tiny
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
##########################
### TODO: Translate ###
##########################
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
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)
##########################
### TODO: Translate ###
##########################
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=Führe OCR auf PDF- und/oder Cleanup-Scans aus home.ocr.title=Führe OCR auf PDF- und/oder 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.
##########################
### TODO: Translate ###
##########################
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
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-Datei home.extractImages.desc=Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Datei
##########################
### TODO: Translate ###
##########################
extractImages.tags=picture,photo,save,archive,zip,capture,grab
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
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
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)
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,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)
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,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
##########################
### TODO: Translate ###
##########################
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
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
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
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
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
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
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
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
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
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
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
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
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
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
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
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
downloadPdf=PDF herunterladen home.certSign.title=Sign with Certificate
text=Text home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
font=Schriftart ##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Multi-Page Layout
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
##########################
### TODO: Translate ###
##########################
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=Adjust page size/scale
home.scalePages.desc=Change the size/scale of page and/or its contents.
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
##########################
### TODO: Translate ###
##########################
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
##########################
### TODO: Translate ###
##########################
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
##########################
### TODO: Translate ###
##########################
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
##########################
### TODO: Translate ###
##########################
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
##########################
### TODO: Translate ###
##########################
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
##########################
### TODO: Translate ###
##########################
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
##########################
### TODO: Translate ###
##########################
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Multi Page Layout
pageLayout.header=Multi Page Layout
pageLayout.pagesPerSheet=Pages per sheet:
pageLayout.submit=Submit
#scalePages
scalePages.title=Adjust page-scale
scalePages.header=Adjust page-scale
scalePages.pageSize=Size of a page of the document.
scalePages.scaleFactor=Zoom level (crop) of a page.
scalePages.submit=Submit
#certSign
certSign.title=Zertifikatsignierung
certSign.header=Signieren Sie ein PDF mit Ihrem Zertifikat (in Arbeit)
certSign.selectPDF=Wählen Sie eine PDF-Datei zum Signieren aus:
certSign.selectKey=Wählen Sie Ihre private Schlüsseldatei aus (PKCS#8-Format, könnte .pem oder .der sein):
certSign.selectCert=Wählen Sie Ihre Zertifikatsdatei aus (X.509-Format, könnte .pem oder .der sein):
certSign.selectP12=Wählen Sie Ihre PKCS#12-Keystore-Datei (.p12 oder .pfx) aus (optional, falls angegeben, sollte sie Ihren privaten Schlüssel und Ihr Zertifikat enthalten):
certSign.certType=Zertifikattyp
certSign.password=Geben Sie Ihr Keystore- oder Private-Key-Passwort ein (falls vorhanden):
certSign.showSig=Signatur anzeigen
certSign.reason=Grund
certSign.location=Standort
certSign.name=Name
certSign.submit=PDF signieren
#removeBlanks
removeBlanks.title=Leerzeichen entfernen removeBlanks.title=Leerzeichen entfernen
removeBlanks.header=Leere Seiten entfernen removeBlanks.header=Leere Seiten entfernen
removeBlanks.threshold=Schwellenwert: removeBlanks.threshold=Schwellenwert:
@@ -136,12 +478,16 @@ removeBlanks.whitePercent=Weißprozentsatz (%):
removeBlanks.whitePercentDesc=Prozentsatz der Seite, die weiß sein muss, um entfernt zu werden removeBlanks.whitePercentDesc=Prozentsatz der Seite, die weiß sein muss, um entfernt zu werden
removeBlanks.submit=Leerzeichen entfernen removeBlanks.submit=Leerzeichen entfernen
#compare
compare.title=Vergleichen compare.title=Vergleichen
compare.header=PDFs vergleichen compare.header=PDFs vergleichen
compare.document.1=Dokument 1 compare.document.1=Dokument 1
compare.document.2=Dokument 2 compare.document.2=Dokument 2
compare.submit=Vergleichen compare.submit=Vergleichen
#sign
sign.title=Signieren sign.title=Signieren
sign.header=PDFs signieren sign.header=PDFs signieren
sign.upload=Bild hochladen sign.upload=Bild hochladen
@@ -150,14 +496,20 @@ sign.text=Texteingabe
sign.clear=Klar sign.clear=Klar
sign.add=Hinzufügen sign.add=Hinzufügen
#repair
repair.title=Reparieren repair.title=Reparieren
Repair.header=PDFs reparieren repair.header=Repair PDFs
repair.submit=Reparieren repair.submit=Reparieren
#flatten
flatten.title=Abflachen flatten.title=Abflachen
flatten.header=PDFs reduzieren flatten.header=PDFs reduzieren
flatten.submit=Abflachen flatten.submit=Abflachen
#ScannerImageSplit
ScannerImageSplit.selectText.1=Winkelschwelle: ScannerImageSplit.selectText.1=Winkelschwelle:
ScannerImageSplit.selectText.2=Legt den minimalen absoluten Winkel fest, der erforderlich ist, damit das Bild gedreht werden kann (Standard: 10). ScannerImageSplit.selectText.2=Legt den minimalen absoluten Winkel fest, der erforderlich ist, damit das Bild gedreht werden kann (Standard: 10).
ScannerImageSplit.selectText.3=Toleranz: ScannerImageSplit.selectText.3=Toleranz:
@@ -170,16 +522,6 @@ ScannerImageSplit.selectText.9=Randgröße:
ScannerImageSplit.selectText.10=Legt die Größe des hinzugefügten und entfernten Randes fest, um weiße Ränder in der Ausgabe zu verhindern (Standard: 1). ScannerImageSplit.selectText.10=Legt die Größe des hinzugefügten und entfernten Randes fest, um weiße Ränder in der Ausgabe zu verhindern (Standard: 1).
navbar.settings=Einstellungen
settings.title=Einstellungen
settings.update=Update verfügbar
settings.appVersion=App-Version:
settings.downloadOption.title=Download-Option wählen (für einzelne Dateien, die keine Zip-Downloads sind):
settings.downloadOption.1=Im selben Fenster öffnen
settings.downloadOption.2=In neuem Fenster öffnen
settings.downloadOption.3=Datei herunterladen
settings.zipThreshold=Dateien komprimieren, wenn die Anzahl der heruntergeladenen Dateien überschritten wird
#OCR #OCR
ocr.title=OCR / Scan-Bereinigung ocr.title=OCR / Scan-Bereinigung
ocr.header=Scans bereinigen / OCR (Optical Character Recognition) ocr.header=Scans bereinigen / OCR (Optical Character Recognition)
@@ -200,6 +542,7 @@ ocr.credit=Dieser Dienst verwendet OCRmyPDF und Tesseract für OCR.
ocr.submit=PDF mit OCR verarbeiten ocr.submit=PDF mit OCR verarbeiten
#extractImages
extractImages.title=Bilder extrahieren extractImages.title=Bilder extrahieren
extractImages.header=Bilder extrahieren extractImages.header=Bilder extrahieren
extractImages.selectText=Wählen Sie das Bildformat aus, in das extrahierte Bilder konvertiert werden sollen extractImages.selectText=Wählen Sie das Bildformat aus, in das extrahierte Bilder konvertiert werden sollen
@@ -214,49 +557,50 @@ fileToPDF.supportedFileTypes=Unterstützte Dateitypen sollten die folgenden enth
fileToPDF.submit=In PDF konvertieren fileToPDF.submit=In PDF konvertieren
#compress
compress.title=Komprimieren
compress.header=PDF komprimieren
compress.credit=Dieser Dienst verwendet Ghostscript für die PDF-Komprimierung/-Optimierung.
compress.selectText.1=Manueller Modus Von 1 bis 4
compress.selectText.2=Optimierungsstufe:
compress.selectText.3=4 (Schrecklich für Textbilder)
compress.selectText.4=Automatischer Modus Passt die Qualität automatisch an, um das PDF auf die exakte Größe zu bringen
compress.selectText.5=Erwartete PDF-Größe (z. B. 25 MB, 10,8 MB, 25 KB)
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=Jede Seite?
addImage.upload=Bild hinzufügen
addImage.submit=Bild hinzufügen addImage.submit=Bild hinzufügen
#compress
compress.title=Komprimieren
compress.header=PDF komprimieren
compress.credit=Dieser Dienst verwendet OCRmyPDF für die PDF-Komprimierung/-Optimierung.
compress.selectText.1=Optimierungsstufe:
compress.selectText.2=0 (Keine Optimierung)
compress.selectText.3=1 (Standard, verlustfreie Optimierung)
compress.selectText.4=2 (Verlustbehaftete Optimierung)
compress.selectText.5=3 (Verlustbehaftete Optimierung, aggressiver)
compress.selectText.6=Schnelle Webansicht aktivieren (PDF linearisieren)
compress.selectText.7=Verlustbehaftete JBIG2-Kodierung aktivieren
compress.submit=Komprimieren
#merge #merge
merge.title=Zusammenführen merge.title=Zusammenführen
merge.header=Mehrere PDFs zusammenführen (2+) merge.header=Mehrere PDFs zusammenführen (2+)
merge.submit=Zusammenführen merge.submit=Zusammenführen
#pdfOrganiser #pdfOrganiser
pdfOrganiser.title=Seiten anordnen pdfOrganiser.title=Seiten anordnen
pdfOrganiser.header=PDF Seitenorganisation pdfOrganiser.header=PDF Seitenorganisation
pdfOrganiser.submit=Seiten anordnen pdfOrganiser.submit=Seiten anordnen
#Mehrfachwerkzeug
#multiTool
multiTool.title=PDF-Multitool multiTool.title=PDF-Multitool
multiTool.header=PDF-Multitool multiTool.header=PDF-Multitool
#pageRemover #pageRemover
pageRemover.title=Seiten entfernen 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
#rotate #rotate
rotate.title=PDF drehen rotate.title=PDF drehen
rotate.header=PDF drehen rotate.header=PDF drehen
@@ -264,8 +608,6 @@ rotate.selectAngle=Wählen Sie den Winkel (in Vielfachen von 90 Grad):
rotate.submit=Drehen rotate.submit=Drehen
#merge #merge
split.title=PDF aufteilen split.title=PDF aufteilen
split.header=PDF aufteilen split.header=PDF aufteilen
@@ -291,6 +633,7 @@ imageToPDF.selectText.3=Mehrere Dateien verarbeiten (nur aktiv, wenn Sie mit meh
imageToPDF.selectText.4=In ein einziges PDF zusammenführen imageToPDF.selectText.4=In ein einziges PDF zusammenführen
imageToPDF.selectText.5=In separate PDFs konvertieren imageToPDF.selectText.5=In separate PDFs konvertieren
#pdfToImage #pdfToImage
pdfToImage.title=PDF zu Bild pdfToImage.title=PDF zu Bild
pdfToImage.header=PDF zu Bild pdfToImage.header=PDF zu Bild
@@ -304,6 +647,7 @@ pdfToImage.grey=Graustufen
pdfToImage.blackwhite=Schwarzweiß (Datenverlust möglich!) pdfToImage.blackwhite=Schwarzweiß (Datenverlust möglich!)
pdfToImage.submit=Umwandeln pdfToImage.submit=Umwandeln
#addPassword #addPassword
addPassword.title=Passwort hinzufügen addPassword.title=Passwort hinzufügen
addPassword.header=Passwort hinzufügen (Verschlüsseln) addPassword.header=Passwort hinzufügen (Verschlüsseln)
@@ -320,8 +664,12 @@ addPassword.selectText.10=Modifizierung verhindern
addPassword.selectText.11=Ändern von Kommentaren verhindern addPassword.selectText.11=Ändern von Kommentaren verhindern
addPassword.selectText.12=Drucken verhindern addPassword.selectText.12=Drucken verhindern
addPassword.selectText.13=Drucken verschiedener Formate verhindern addPassword.selectText.13=Drucken verschiedener Formate verhindern
addPassword.selectText.14=Owner Password
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
addPassword.selectText.16=Restricts the opening of the document itself
addPassword.submit=Verschlüsseln addPassword.submit=Verschlüsseln
#watermark #watermark
watermark.title=Wasserzeichen hinzufügen watermark.title=Wasserzeichen hinzufügen
watermark.header=Wasserzeichen hinzufügen watermark.header=Wasserzeichen hinzufügen
@@ -334,6 +682,7 @@ watermark.selectText.6=höheSpacer (vertikaler Abstand zwischen den einzelnen Wa
watermark.selectText.7=Deckkraft (0% - 100 %): watermark.selectText.7=Deckkraft (0% - 100 %):
watermark.submit=Wasserzeichen hinzufügen watermark.submit=Wasserzeichen hinzufügen
#remove-watermark #remove-watermark
remove-watermark.title=Wasserzeichen entfernen remove-watermark.title=Wasserzeichen entfernen
remove-watermark.header=Wasserzeichen entfernen remove-watermark.header=Wasserzeichen entfernen
@@ -341,6 +690,7 @@ remove-watermark.selectText.1=PDF auswählen, um Wasserzeichen zu entfernen von:
remove-watermark.selectText.2=Wasserzeichentext: remove-watermark.selectText.2=Wasserzeichentext:
remove-watermark.submit=Wasserzeichen entfernen remove-watermark.submit=Wasserzeichen entfernen
#Change permissions #Change permissions
permissions.title=Berechtigungen ändern permissions.title=Berechtigungen ändern
permissions.header=Berechtigungen ändern permissions.header=Berechtigungen ändern
@@ -357,6 +707,7 @@ permissions.selectText.9=Drucken verhindern
permissions.selectText.10=Drucken verschiedener Formate verhindern permissions.selectText.10=Drucken verschiedener Formate verhindern
permissions.submit=Ändern permissions.submit=Ändern
#remove password #remove password
removePassword.title=Passwort entfernen removePassword.title=Passwort entfernen
removePassword.header=Passwort entfernen (Entschlüsseln) removePassword.header=Passwort entfernen (Entschlüsseln)
@@ -365,7 +716,8 @@ removePassword.selectText.2=Passwort
removePassword.submit=Entfernen removePassword.submit=Entfernen
changeMetadata.title=Metadaten ändern #changeMetadata
changeMetadata.title=Titel:
changeMetadata.header=Metadaten ändern changeMetadata.header=Metadaten ändern
changeMetadata.selectText.1=Bitte bearbeiten Sie die Variablen, die Sie ändern möchten changeMetadata.selectText.1=Bitte bearbeiten Sie die Variablen, die Sie ändern möchten
changeMetadata.selectText.2=Alle Metadaten löschen changeMetadata.selectText.2=Alle Metadaten löschen
@@ -384,28 +736,29 @@ changeMetadata.selectText.5=Benutzerdefinierten Metadateneintrag hinzufügen
changeMetadata.submit=Ändern changeMetadata.submit=Ändern
#xlsToPdf
xlsToPdf.title=Excel in PDF xlsToPdf.title=Excel in PDF
xlsToPdf.header=Excel in PDF xlsToPdf.header=Excel in PDF
xlsToPdf.selectText.1=XLS- oder XLSX-Excel-Tabelle zum Konvertieren auswählen xlsToPdf.selectText.1=XLS- oder XLSX-Excel-Tabelle zum Konvertieren auswählen
xlsToPdf.convert=konvertieren xlsToPdf.convert=konvertieren
#pdfToPDFA
pdfToPDFA.title=PDF zu PDF/A pdfToPDFA.title=PDF zu PDF/A
pdfToPDFA.header=PDF zu PDF/A pdfToPDFA.header=PDF zu PDF/A
pdfToPDFA.credit=Dieser Dienst verwendet 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
#PDFToWord
PDFToWord.title=PDF zu Word PDFToWord.title=PDF zu Word
PDFToWord.header=PDF zu Word PDFToWord.header=PDF zu Word
PDFToWord.selectText.1=Ausgabedateiformat PDFToWord.selectText.1=Ausgabedateiformat
PDFToWord.credit=Dieser Dienst verwendet LibreOffice für die Dateikonvertierung. PDFToWord.credit=Dieser Dienst verwendet LibreOffice für die Dateikonvertierung.
PDFToWord.submit=Konvertieren PDFToWord.submit=Konvertieren
#PDFToPresentation
PDFToPresentation.title=PDF zu Präsentation PDFToPresentation.title=PDF zu Präsentation
PDFToPresentation.header=PDF zu Präsentation PDFToPresentation.header=PDF zu Präsentation
PDFToPresentation.selectText.1=Ausgabedateiformat PDFToPresentation.selectText.1=Ausgabedateiformat
@@ -413,6 +766,7 @@ PDFToPresentation.credit=Dieser Dienst verwendet LibreOffice für die Dateikonve
PDFToPresentation.submit=Konvertieren PDFToPresentation.submit=Konvertieren
#PDFToText
PDFToText.title=PDF in Text/RTF PDFToText.title=PDF in Text/RTF
PDFToText.header=PDF in Text/RTF PDFToText.header=PDF in Text/RTF
PDFToText.selectText.1=Ausgabedateiformat PDFToText.selectText.1=Ausgabedateiformat
@@ -420,27 +774,15 @@ PDFToText.credit=Dieser Dienst verwendet LibreOffice für die Dateikonvertierung
PDFToText.submit=Konvertieren PDFToText.submit=Konvertieren
#PDFToHTML
PDFToHTML.title=PDF in HTML PDFToHTML.title=PDF in HTML
PDFToHTML.header=PDF in HTML PDFToHTML.header=PDF in HTML
PDFToHTML.credit=Dieser Dienst verwendet LibreOffice für die Dateikonvertierung. PDFToHTML.credit=Dieser Dienst verwendet LibreOffice für die Dateikonvertierung.
PDFToHTML.submit=Konvertieren PDFToHTML.submit=Konvertieren
#PDFToXML
PDFToXML.title=PDF in XML PDFToXML.title=PDF in XML
PDFToXML.header=PDF in XML PDFToXML.header=PDF in 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

View File

@@ -10,7 +10,7 @@ multiPdfDropPrompt=Select (or drag & drop) all PDFs you require
imgPrompt=Select Image(s) imgPrompt=Select Image(s)
genericSubmit=Submit genericSubmit=Submit
processTimeWarning=Warning: This process can take up to a minute depending on file-size processTimeWarning=Warning: This process can take up to a minute depending on file-size
pageOrderPrompt=Page Order (Enter a comma-separated list of page numbers) : pageOrderPrompt=Custom Page Order (Enter a comma-separated list of page numbers or Functions like 2n+1) :
goToPage=Go goToPage=Go
true=True true=True
false=False false=False
@@ -20,115 +20,336 @@ close=Close
filesSelected=files selected filesSelected=files selected
noFavourites=No favourites added noFavourites=No favourites added
bored=Bored Waiting? bored=Bored Waiting?
alphabet=Alphabet
downloadPdf=Download PDF
text=Text
font=Font
selectFillter=-- Select --
pageNum=Page Number
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
#############
# NAVBAR #
#############
navbar.convert=Convert
navbar.security=Security
navbar.other=Other
navbar.darkmode=Dark Mode
navbar.pageOps=Page Operations
navbar.settings=Settings
#############
# SETTINGS #
#############
settings.title=Settings
settings.update=Update available
settings.appVersion=App Version:
settings.downloadOption.title=Choose download option (For single file non zip downloads):
settings.downloadOption.1=Open in same window
settings.downloadOption.2=Open in new window
settings.downloadOption.3=Download file
settings.zipThreshold=Zip files when the number of downloaded files exceeds
############# #############
# HOME-PAGE # # HOME-PAGE #
############# #############
home.desc=Your locally hosted one-stop-shop for all your PDF needs. home.desc=Your locally hosted one-stop-shop for all your PDF needs.
navbar.convert=Convert
navbar.security=Security
navbar.other=Other
navbar.darkmode=Dark Mode
navbar.pageOps=Page Operations
home.multiTool.title=PDF Multi Tool home.multiTool.title=PDF Multi Tool
home.multiTool.desc=Merge, Rotate, Rearrange, and Remove pages home.multiTool.desc=Merge, Rotate, Rearrange, and Remove pages
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move
home.merge.title=Merge home.merge.title=Merge
home.merge.desc=Easily merge multiple PDFs into one. home.merge.desc=Easily merge multiple PDFs into one.
merge.tags=merge,Page operations,Back end,server side
home.split.title=Split home.split.title=Split
home.split.desc=Split PDFs into multiple documents home.split.desc=Split PDFs into multiple documents
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=Rotate home.rotate.title=Rotate
home.rotate.desc=Easily rotate your PDFs. home.rotate.desc=Easily rotate your PDFs.
rotate.tags=server side
home.imageToPdf.title=Image to PDF home.imageToPdf.title=Image to PDF
home.imageToPdf.desc=Convert a image (PNG, JPEG, GIF) to PDF. home.imageToPdf.desc=Convert a image (PNG, JPEG, GIF) to PDF.
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=PDF to Image home.pdfToImage.title=PDF to Image
home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF) home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF)
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=Organise home.pdfOrganiser.title=Organise
home.pdfOrganiser.desc=Remove/Rearrange pages in any order home.pdfOrganiser.desc=Remove/Rearrange pages in any order
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=Add image home.addImage.title=Add image
home.addImage.desc=Adds a image onto a set location on the PDF (Work in progress) home.addImage.desc=Adds a image onto a set location on the PDF
addImage.tags=img,jpg,picture,photo
home.watermark.title=Add Watermark home.watermark.title=Add Watermark
home.watermark.desc=Add a custom watermark to your PDF document. home.watermark.desc=Add a custom watermark to your PDF document.
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.remove-watermark.title=Remove Watermark
home.remove-watermark.desc=Remove watermarks from your PDF document.
home.permissions.title=Change Permissions home.permissions.title=Change Permissions
home.permissions.desc=Change the permissions of your PDF document home.permissions.desc=Change the permissions of your PDF document
permissions.tags=read,write,edit,print
home.removePages.title=Remove home.removePages.title=Remove
home.removePages.desc=Delete unwanted pages from your PDF document. home.removePages.desc=Delete unwanted pages from your PDF document.
removePages.tags=Remove pages,delete pages
home.addPassword.title=Add Password home.addPassword.title=Add Password
home.addPassword.desc=Encrypt your PDF document with a password. home.addPassword.desc=Encrypt your PDF document with a password.
addPassword.tags=secure,security
home.removePassword.title=Remove Password home.removePassword.title=Remove Password
home.removePassword.desc=Remove password protection from your PDF document. home.removePassword.desc=Remove password protection from your PDF document.
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=Compress home.compressPdfs.title=Compress
home.compressPdfs.desc=Compress PDFs to reduce their file size. home.compressPdfs.desc=Compress PDFs to reduce their file size.
compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=Change Metadata home.changeMetadata.title=Change Metadata
home.changeMetadata.desc=Change/Remove/Add metadata from a PDF document home.changeMetadata.desc=Change/Remove/Add metadata from a PDF document
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=Convert file to PDF home.fileToPDF.title=Convert file to PDF
home.fileToPDF.desc=Convert nearly any file to PDF (DOCX, PNG, XLS, PPT, TXT and more) home.fileToPDF.desc=Convert nearly any file to PDF (DOCX, PNG, XLS, PPT, TXT and more)
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=OCR / Cleanup scans home.ocr.title=OCR / Cleanup scans
home.ocr.desc=Cleanup scans and detects text from images within a PDF and re-adds it as text. home.ocr.desc=Cleanup scans and detects text from images within a PDF and re-adds it as text.
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
home.extractImages.title=Extract Images home.extractImages.title=Extract Images
home.extractImages.desc=Extracts all images from a PDF and saves them to zip home.extractImages.desc=Extracts all images from a PDF and saves them to zip
extractImages.tags=picture,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=PDF to PDF/A home.pdfToPDFA.title=PDF to PDF/A
home.pdfToPDFA.desc=Convert PDF to PDF/A for long-term storage home.pdfToPDFA.desc=Convert PDF to PDF/A for long-term storage
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=PDF to Word home.PDFToWord.title=PDF to Word
home.PDFToWord.desc=Convert PDF to Word formats (DOC, DOCX and ODT) home.PDFToWord.desc=Convert PDF to Word formats (DOC, DOCX and ODT)
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=PDF to Presentation home.PDFToPresentation.title=PDF to Presentation
home.PDFToPresentation.desc=Convert PDF to Presentation formats (PPT, PPTX and ODP) home.PDFToPresentation.desc=Convert PDF to Presentation formats (PPT, PPTX and ODP)
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=PDF to Text/RTF home.PDFToText.title=PDF to RTF (Text)
home.PDFToText.desc=Convert PDF to Text or RTF format home.PDFToText.desc=Convert PDF to Text or RTF format
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDF to HTML home.PDFToHTML.title=PDF to HTML
home.PDFToHTML.desc=Convert PDF to HTML format home.PDFToHTML.desc=Convert PDF to HTML format
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=PDF to XML home.PDFToXML.title=PDF to XML
home.PDFToXML.desc=Convert PDF to XML format home.PDFToXML.desc=Convert PDF to XML format
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=Detect/Split Scanned photos home.ScannerImageSplit.title=Detect/Split Scanned photos
home.ScannerImageSplit.desc=Splits multiple photos from within a photo/PDF home.ScannerImageSplit.desc=Splits multiple photos from within a photo/PDF
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title=Sign home.sign.title=Sign
home.sign.desc=Adds signature to PDF by drawing, text or image home.sign.desc=Adds signature to PDF by drawing, text or image
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=Flatten home.flatten.title=Flatten
home.flatten.desc=Remove all interactive elements and forms from a PDF home.flatten.desc=Remove all interactive elements and forms from a PDF
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title=Repair home.repair.title=Repair
home.repair.desc=Tries to repair a corrupt/broken PDF home.repair.desc=Tries to repair a corrupt/broken PDF
repair.tags=fix,restore,correction,recover
home.removeBlanks.title=Remove Blank pages home.removeBlanks.title=Remove Blank pages
home.removeBlanks.desc=Detects and removes blank pages from a document home.removeBlanks.desc=Detects and removes blank pages from a document
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title=Compare home.compare.title=Compare
home.compare.desc=Compares and shows the differences between 2 PDF Documents home.compare.desc=Compares and shows the differences between 2 PDF Documents
compare.tags=differentiate,contrast,changes,analysis
downloadPdf=Download PDF home.certSign.title=Sign with Certificate
text=Text home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
font=Font certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Multi-Page Layout
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=Adjust page size/scale
home.scalePages.desc=Change the size/scale of a page and/or its contents.
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
sanitizePdf.tags=clean,secure,safe,remove-threats
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Multi Page Layout
pageLayout.header=Multi Page Layout
pageLayout.pagesPerSheet=Pages per sheet:
pageLayout.submit=Submit
#scalePages
scalePages.title=Adjust page-scale
scalePages.header=Adjust page-scale
scalePages.pageSize=Size of a page of the document.
scalePages.scaleFactor=Zoom level (crop) of a page.
scalePages.submit=Submit
#certSign
certSign.title=Certificate Signing
certSign.header=Sign a PDF with your certificate (Work in progress)
certSign.selectPDF=Select a PDF File for Signing:
certSign.selectKey=Select Your Private Key File (PKCS#8 format, could be .pem or .der):
certSign.selectCert=Select Your Certificate File (X.509 format, could be .pem or .der):
certSign.selectP12=Select Your PKCS#12 Keystore File (.p12 or .pfx) (Optional, If provided, it should contain your private key and certificate):
certSign.certType=Certificate Type
certSign.password=Enter Your Keystore or Private Key Password (If Any):
certSign.showSig=Show Signature
certSign.reason=Reason
certSign.location=Location
certSign.name=Name
certSign.submit=Sign PDF
#removeBlanks
removeBlanks.title=Remove Blanks removeBlanks.title=Remove Blanks
removeBlanks.header=Remove Blank Pages removeBlanks.header=Remove Blank Pages
removeBlanks.threshold=Threshold: removeBlanks.threshold=Threshold:
@@ -137,12 +358,16 @@ removeBlanks.whitePercent=White Percent (%):
removeBlanks.whitePercentDesc=Percent of page that must be white to be removed removeBlanks.whitePercentDesc=Percent of page that must be white to be removed
removeBlanks.submit=Remove Blanks removeBlanks.submit=Remove Blanks
#compare
compare.title=Compare compare.title=Compare
compare.header=Compare PDFs compare.header=Compare PDFs
compare.document.1=Document 1 compare.document.1=Document 1
compare.document.2=Document 2 compare.document.2=Document 2
compare.submit=Compare compare.submit=Compare
#sign
sign.title=Sign sign.title=Sign
sign.header=Sign PDFs sign.header=Sign PDFs
sign.upload=Upload Image sign.upload=Upload Image
@@ -151,14 +376,20 @@ sign.text=Text Input
sign.clear=Clear sign.clear=Clear
sign.add=Add sign.add=Add
#repair
repair.title=Repair repair.title=Repair
repair.header=Repair PDFs repair.header=Repair PDFs
repair.submit=Repair repair.submit=Repair
#flatten
flatten.title=Flatten flatten.title=Flatten
flatten.header=Flatten PDFs flatten.header=Flatten PDFs
flatten.submit=Flatten flatten.submit=Flatten
#ScannerImageSplit
ScannerImageSplit.selectText.1=Angle Threshold: ScannerImageSplit.selectText.1=Angle Threshold:
ScannerImageSplit.selectText.2=Sets the minimum absolute angle required for the image to be rotated (default: 10). ScannerImageSplit.selectText.2=Sets the minimum absolute angle required for the image to be rotated (default: 10).
ScannerImageSplit.selectText.3=Tolerance: ScannerImageSplit.selectText.3=Tolerance:
@@ -170,19 +401,6 @@ ScannerImageSplit.selectText.8=Sets the minimum contour area threshold for a pho
ScannerImageSplit.selectText.9=Border Size: ScannerImageSplit.selectText.9=Border Size:
ScannerImageSplit.selectText.10=Sets the size of the border added and removed to prevent white borders in the output (default: 1). ScannerImageSplit.selectText.10=Sets the size of the border added and removed to prevent white borders in the output (default: 1).
navbar.settings=Settings
settings.title=Settings
settings.update=Update available
settings.appVersion=App Version:
settings.downloadOption.title=Choose download option (For single file non zip downloads):
settings.downloadOption.1=Open in same window
settings.downloadOption.2=Open in new window
settings.downloadOption.3=Download file
settings.zipThreshold=Zip files when the number of downloaded files exceeds
#OCR #OCR
ocr.title=OCR / Scan Cleanup ocr.title=OCR / Scan Cleanup
@@ -204,7 +422,7 @@ ocr.credit=This service uses OCRmyPDF and Tesseract for OCR.
ocr.submit=Process PDF with OCR ocr.submit=Process PDF with OCR
#extractImages
extractImages.title=Extract Images extractImages.title=Extract Images
extractImages.header=Extract Images extractImages.header=Extract Images
extractImages.selectText=Select image format to convert extracted images to extractImages.selectText=Select image format to convert extracted images to
@@ -222,14 +440,12 @@ fileToPDF.submit=Convert to PDF
#compress #compress
compress.title=Compress compress.title=Compress
compress.header=Compress PDF compress.header=Compress PDF
compress.credit=This service uses OCRmyPDF for PDF Compress/Optimisation. compress.credit=This service uses Ghostscript for PDF Compress/Optimisation.
compress.selectText.1=Optimization level: compress.selectText.1=Manual Mode - From 1 to 4
compress.selectText.2=0 (No optimization) compress.selectText.2=Optimization level:
compress.selectText.3=1 (Default, lossless optimization) compress.selectText.3=4 (Terrible for text images)
compress.selectText.4=2 (Lossy optimization) compress.selectText.4=Auto mode - Auto adjusts quality to get PDF to exact size
compress.selectText.5=3 (Lossy optimization, more aggressive) compress.selectText.5=Expected PDF Size (e.g. 25MB, 10.8MB, 25KB)
compress.selectText.6=Enable fast web view (linearize PDF)
compress.selectText.7=Enable lossy JBIG2 encoding
compress.submit=Compress compress.submit=Compress
@@ -237,6 +453,7 @@ compress.submit=Compress
addImage.title=Add Image addImage.title=Add Image
addImage.header=Add image to PDF addImage.header=Add image to PDF
addImage.everyPage=Every Page? addImage.everyPage=Every Page?
addImage.upload=Add image
addImage.submit=Add image addImage.submit=Add image
@@ -245,11 +462,13 @@ merge.title=Merge
merge.header=Merge multiple PDFs (2+) merge.header=Merge multiple PDFs (2+)
merge.submit=Merge merge.submit=Merge
#pdfOrganiser #pdfOrganiser
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
#multiTool #multiTool
multiTool.title=PDF Multi Tool multiTool.title=PDF Multi Tool
multiTool.header=PDF Multi Tool multiTool.header=PDF Multi Tool
@@ -261,6 +480,7 @@ 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
#rotate #rotate
rotate.title=Rotate PDF rotate.title=Rotate PDF
rotate.header=Rotate PDF rotate.header=Rotate PDF
@@ -268,8 +488,6 @@ rotate.selectAngle=Select rotation angle (in multiples of 90 degrees):
rotate.submit=Rotate rotate.submit=Rotate
#merge #merge
split.title=Split PDF split.title=Split PDF
split.header=Split PDF split.header=Split PDF
@@ -295,6 +513,7 @@ imageToPDF.selectText.3=Multi file logic (Only enabled if working with multiple
imageToPDF.selectText.4=Merge into single PDF imageToPDF.selectText.4=Merge into single PDF
imageToPDF.selectText.5=Convert to separate PDFs imageToPDF.selectText.5=Convert to separate PDFs
#pdfToImage #pdfToImage
pdfToImage.title=PDF to Image pdfToImage.title=PDF to Image
pdfToImage.header=PDF to Image pdfToImage.header=PDF to Image
@@ -308,14 +527,15 @@ pdfToImage.grey=Greyscale
pdfToImage.blackwhite=Black and White (May lose data!) pdfToImage.blackwhite=Black and White (May lose data!)
pdfToImage.submit=Convert pdfToImage.submit=Convert
#addPassword #addPassword
addPassword.title=Add Password addPassword.title=Add Password
addPassword.header=Add password (Encrypt) addPassword.header=Add password (Encrypt)
addPassword.selectText.1=Select PDF to encrypt addPassword.selectText.1=Select PDF to encrypt
addPassword.selectText.2=Password addPassword.selectText.2=User Password
addPassword.selectText.3=Encryption Key Length addPassword.selectText.3=Encryption Key Length
addPassword.selectText.4=Higher values are stronger, but lower values have better compatibility. addPassword.selectText.4=Higher values are stronger, but lower values have better compatibility.
addPassword.selectText.5=Permissions to set addPassword.selectText.5=Permissions to set (Recommended to be used along with Owner password)
addPassword.selectText.6=Prevent assembly of document addPassword.selectText.6=Prevent assembly of document
addPassword.selectText.7=Prevent content extraction addPassword.selectText.7=Prevent content extraction
addPassword.selectText.8=Prevent extraction for accessibility addPassword.selectText.8=Prevent extraction for accessibility
@@ -324,8 +544,12 @@ addPassword.selectText.10=Prevent modification
addPassword.selectText.11=Prevent annotation modification addPassword.selectText.11=Prevent annotation modification
addPassword.selectText.12=Prevent printing addPassword.selectText.12=Prevent printing
addPassword.selectText.13=Prevent printing different formats addPassword.selectText.13=Prevent printing different formats
addPassword.selectText.14=Owner Password
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
addPassword.selectText.16=Restricts the opening of the document itself
addPassword.submit=Encrypt addPassword.submit=Encrypt
#watermark #watermark
watermark.title=Add Watermark watermark.title=Add Watermark
watermark.header=Add Watermark watermark.header=Add Watermark
@@ -338,6 +562,7 @@ watermark.selectText.6=heightSpacer (Space between each watermark vertically):
watermark.selectText.7=Opacity (0% - 100%): watermark.selectText.7=Opacity (0% - 100%):
watermark.submit=Add Watermark watermark.submit=Add Watermark
#remove-watermark #remove-watermark
remove-watermark.title=Remove Watermark remove-watermark.title=Remove Watermark
remove-watermark.header=Remove Watermark remove-watermark.header=Remove Watermark
@@ -345,6 +570,7 @@ remove-watermark.selectText.1=Select PDF to remove watermark from:
remove-watermark.selectText.2=Watermark Text: remove-watermark.selectText.2=Watermark Text:
remove-watermark.submit=Remove Watermark remove-watermark.submit=Remove Watermark
#Change permissions #Change permissions
permissions.title=Change Permissions permissions.title=Change Permissions
permissions.header=Change Permissions permissions.header=Change Permissions
@@ -361,6 +587,7 @@ permissions.selectText.9=Prevent printing
permissions.selectText.10=Prevent printing different formats permissions.selectText.10=Prevent printing different formats
permissions.submit=Change permissions.submit=Change
#remove password #remove password
removePassword.title=Remove password removePassword.title=Remove password
removePassword.header=Remove password (Decrypt) removePassword.header=Remove password (Decrypt)
@@ -368,6 +595,8 @@ removePassword.selectText.1=Select PDF to Decrypt
removePassword.selectText.2=Password removePassword.selectText.2=Password
removePassword.submit=Remove removePassword.submit=Remove
#changeMetadata
changeMetadata.title=Change Metadata changeMetadata.title=Change Metadata
changeMetadata.header=Change Metadata changeMetadata.header=Change Metadata
changeMetadata.selectText.1=Please edit the variables you wish to change changeMetadata.selectText.1=Please edit the variables you wish to change
@@ -386,27 +615,30 @@ changeMetadata.selectText.4=Other Metadata:
changeMetadata.selectText.5=Add Custom Metadata Entry changeMetadata.selectText.5=Add Custom Metadata Entry
changeMetadata.submit=Change changeMetadata.submit=Change
#xlsToPdf
xlsToPdf.title=Excel to PDF xlsToPdf.title=Excel to PDF
xlsToPdf.header=Excel to PDF xlsToPdf.header=Excel to PDF
xlsToPdf.selectText.1=Select XLS or XLSX Excel sheet to convert xlsToPdf.selectText.1=Select XLS or XLSX Excel sheet to convert
xlsToPdf.convert=convert xlsToPdf.convert=convert
#pdfToPDFA
pdfToPDFA.title=PDF To PDF/A pdfToPDFA.title=PDF To PDF/A
pdfToPDFA.header=PDF To PDF/A pdfToPDFA.header=PDF To PDF/A
pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion
pdfToPDFA.submit=Convert pdfToPDFA.submit=Convert
#PDFToWord
PDFToWord.title=PDF to Word PDFToWord.title=PDF to Word
PDFToWord.header=PDF to Word PDFToWord.header=PDF to Word
PDFToWord.selectText.1=Output file format PDFToWord.selectText.1=Output file format
PDFToWord.credit=This service uses LibreOffice for file conversion. PDFToWord.credit=This service uses LibreOffice for file conversion.
PDFToWord.submit=Convert PDFToWord.submit=Convert
#PDFToPresentation
PDFToPresentation.title=PDF to Presentation PDFToPresentation.title=PDF to Presentation
PDFToPresentation.header=PDF to Presentation PDFToPresentation.header=PDF to Presentation
PDFToPresentation.selectText.1=Output file format PDFToPresentation.selectText.1=Output file format
@@ -414,31 +646,23 @@ PDFToPresentation.credit=This service uses LibreOffice for file conversion.
PDFToPresentation.submit=Convert PDFToPresentation.submit=Convert
PDFToText.title=PDF to Text/RTF #PDFToText
PDFToText.header=PDF to Text/RTF PDFToText.title=PDF to RTF (Text)
PDFToText.header=PDF to RTF (Text)
PDFToText.selectText.1=Output file format PDFToText.selectText.1=Output file format
PDFToText.credit=This service uses LibreOffice for file conversion. PDFToText.credit=This service uses LibreOffice for file conversion.
PDFToText.submit=Convert PDFToText.submit=Convert
#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 LibreOffice for file conversion.
PDFToHTML.submit=Convert PDFToHTML.submit=Convert
#PDFToXML
PDFToXML.title=PDF to XML PDFToXML.title=PDF to XML
PDFToXML.header=PDF to XML PDFToXML.header=PDF to XML
PDFToXML.credit=This service uses LibreOffice for file conversion. PDFToXML.credit=This service uses LibreOffice for file conversion.
PDFToXML.submit=Convert PDFToXML.submit=Convert

View File

@@ -1,17 +1,17 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr = left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr language.direction=ltr
pdfPrompt=Selecciona PDF(s) pdfPrompt=Seleccionar PDF(s)
multiPdfPrompt=Selecciona PDFs (2+) multiPdfPrompt=Seleccionar PDFs (2+)
multiPdfDropPrompt=Selecciona (o arrastra y suelta) todos los PDFs que quieras multiPdfDropPrompt=Selecciona (o arrastra y suelta) todos los PDFs que quieras
imgPrompt=Selecciona Imagen(es) imgPrompt=Seleccionar Imagen(es)
genericSubmit=Enviar genericSubmit=Enviar
processTimeWarning=Advertencia: este proceso puede tardar hasta un minuto dependiendo del tamaño del archivo processTimeWarning=Advertencia: este proceso puede tardar hasta un minuto dependiendo del tamaño del archivo
pageOrderPrompt=Orden de páginas (Introduzca una lista de números de página separados por coma): pageOrderPrompt=Orden de páginas (Introduzca una lista de números de página separados por coma):
goToPage=Ir goToPage=Ir a
true=Verdadero true=Verdadero
false=Falso false=Falso
unknown=Desconocido unknown=Desconocido
@@ -20,128 +20,474 @@ close=Cerrar
filesSelected=archivos seleccionados filesSelected=archivos seleccionados
noFavourites=No se agregaron favoritos noFavourites=No se agregaron favoritos
bored=¿Aburrido de esperar? bored=¿Aburrido de esperar?
############# alphabet=Alfabeto
# HOME-PAGE # downloadPdf=Descargar PDF
############# text=Texto
home.desc=Tu autohospedada ventanilla única para todas tus necesidades PDF. font=Fuente
selectFillter=-- Select --
pageNum=Número de página
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=El documento PDF está protegido con contraseña y no se ha proporcionado o es incorrecta
#############
# NAVBAR #
#############
navbar.convert=Convertir navbar.convert=Convertir
navbar.security=Seguridad navbar.security=Seguridad
navbar.other=Otro navbar.other=Otro
navbar.darkmode=Modo oscuro navbar.darkmode=Modo oscuro
navbar.pageOps=Operaciones de página navbar.pageOps=Operaciones de página
navbar.settings=Ajustes
home.multiTool.title=Multiherramienta PDF #############
# SETTINGS #
#############
settings.title=Ajustes
settings.update=Actualización disponible
settings.appVersion=Versión de la aplicación:
settings.downloadOption.title=Elegir la opción de descarga (para descargas de un solo archivo sin ZIP):
settings.downloadOption.1=Abrir en la misma ventana
settings.downloadOption.2=Abrir en una nueva ventana
settings.downloadOption.3=Descargar el fichero
settings.zipThreshold=Ficheros ZIP cuando excede el número de ficheros descargados
#############
# HOME-PAGE #
#############
home.desc=Tu ventanilla única autohospedada para todas tus necesidades PDF
home.multiTool.title=Multi-herramienta PDF
home.multiTool.desc=Combinar, rotar, reorganizar y eliminar páginas home.multiTool.desc=Combinar, rotar, reorganizar y eliminar páginas
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
home.merge.title=Unir home.merge.title=Unir
home.merge.desc=Unir fácilmente múltiples PDFs en uno. home.merge.desc=Unir fácilmente múltiples PDFs en uno
merge.tags=merge,Page operations,Back end,server side
home.split.title=Divide home.split.title=Dividir
home.split.desc=Divide PDFs en múltiples documentos home.split.desc=Dividir PDFs en múltiples documentos
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=Rotar
home.rotate.desc=Rotar fácilmente tus PDFs
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
home.rotate.title=Rota
home.rotate.desc=Rota fácilmente tus PDFs.
home.imageToPdf.title=Imagen a PDF home.imageToPdf.title=Imagen a PDF
home.imageToPdf.desc=Convierte una imagen (PNG, JPEG, GIF) a PDF. home.imageToPdf.desc=Convertir una imagen (PNG, JPEG, GIF) a PDF
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=PDF a Imagen home.pdfToImage.title=PDF a Imagen
home.pdfToImage.desc=Convierte un PDF a una imagen. (PNG, JPEG, GIF) home.pdfToImage.desc=Convertir un PDF a una imagen (PNG, JPEG, GIF)
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=Organizador home.pdfOrganiser.title=Organizador
home.pdfOrganiser.desc=Elimina/Reorganiza páginas en cualquier orden home.pdfOrganiser.desc=Eliminar/Reorganizar páginas en cualquier orden
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=Agregar imagen al PDF home.addImage.title=Agregar imagen al PDF
home.addImage.desc=Agrega una imagen en una ubicación establecida en el PDF (trabajo en progreso) home.addImage.desc=Agregar una imagen en una ubicación establecida en el PDF (trabajo en progreso)
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
home.watermark.title=Añade marca de agua home.watermark.title=Añadir marca de agua
home.watermark.desc=Añade una marca de agua predefinida a tu documento PDF. home.watermark.desc=Añadir una marca de agua predefinida al documento PDF
##########################
### TODO: Translate ###
##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.remove-watermark.title=Elimina marca de agua home.permissions.title=Cambiar permisos
home.remove-watermark.desc=Elimina marcas de agua de tu documento PDF. home.permissions.desc=Cambiar los permisos del documento PDF
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
home.permissions.title=Cambia Permisos
home.permissions.desc=Cambia los permisos de tu documento PDF
home.removePages.title=Elimina home.removePages.title=Eliminar
home.removePages.desc=Elimina páginas no deseadas de tu documento PDF. home.removePages.desc=Eliminar páginas no deseadas del documento PDF
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
home.addPassword.title=Añade Contraseña home.addPassword.title=Añadir contraseña
home.addPassword.desc=Encripta tu documento PDF con una contraseña. home.addPassword.desc=Encriptar el documento PDF con una contraseña
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
home.removePassword.title=Elimina Contraseña home.removePassword.title=Eliminar contraseña
home.removePassword.desc=Elimina la contraseña de tu documento PDF. home.removePassword.desc=Eliminar la contraseña del documento PDF
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=Comprime home.compressPdfs.title=Comprimir
home.compressPdfs.desc=Comprime PDFs para reducir el tamaño del fichero. home.compressPdfs.desc=Comprimir PDFs para reducir el tamaño del fichero
##########################
### TODO: Translate ###
##########################
compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=Cambia Metadatos
home.changeMetadata.desc=Cambia/Elimina/Añade metadatos a tu documento PDF.
home.fileToPDF.title=Convierte fichero a PDF home.changeMetadata.title=Cambiar metadatos
home.fileToPDF.desc=Convierte casi cualquier archivo a PDF (DOCX, PNG, XLS, PPT, TXT y más) home.changeMetadata.desc=Cambiar/Eliminar/Añadir metadatos al documento PDF
##########################
### TODO: Translate ###
##########################
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=Convertir fichero a PDF
home.fileToPDF.desc=Convertir casi cualquier archivo a PDF (DOCX, PNG, XLS, PPT, TXT y más)
##########################
### TODO: Translate ###
##########################
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=Ejecutar OCR en PDF y/o escaneos de limpieza
home.ocr.desc=Escaneos de limpieza y detectar texto de imágenes dentro de un PDF y volver a agregarlo como texto
##########################
### TODO: Translate ###
##########################
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
home.ocr.title=Ejecute OCR en PDF y/o escaneos de limpieza
home.ocr.desc=Escaneos de limpieza y detecta texto de imágenes dentro de un PDF y lo vuelve a agregar como texto.
home.extractImages.title=Extraer imágenes home.extractImages.title=Extraer imágenes
home.extractImages.desc=Extrae todas las imágenes de un PDF y las guarda en zip home.extractImages.desc=Extraer todas las imágenes de un PDF y guardarlas en ZIP
##########################
### TODO: Translate ###
##########################
extractImages.tags=picture,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=Convierte PDF to PDF/A home.pdfToPDFA.title=Convertir PDF a PDF/A
home.pdfToPDFA.desc=Convierte PDF to PDF/A para almacenamiento a largo plazo home.pdfToPDFA.desc=Convertir PDF a PDF/A para almacenamiento a largo plazo
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=PDF a Word home.PDFToWord.title=PDF a Word
home.PDFToWord.desc=Convertir formatos PDF a Word (DOC, DOCX y ODT) home.PDFToWord.desc=Convertir formatos PDF a Word (DOC, DOCX y ODT)
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=PDF a presentación home.PDFToPresentation.title=PDF a presentación
home.PDFToPresentation.desc=Convertir PDF a formatos de presentación (PPT, PPTX y ODP) home.PDFToPresentation.desc=Convertir PDF a formatos de presentación (PPT, PPTX y ODP)
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=PDF a texto/RTF home.PDFToText.title=PDF a TXT o RTF
home.PDFToText.desc=Convertir PDF a texto o formato RTF home.PDFToText.desc=Convertir PDF a formato TXT o RTF
##########################
### TODO: Translate ###
##########################
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDF a HTML home.PDFToHTML.title=PDF a HTML
home.PDFToHTML.desc=Convertir PDF a formato HTML home.PDFToHTML.desc=Convertir PDF a formato HTML
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=PDF a XML home.PDFToXML.title=PDF a XML
home.PDFToXML.desc=Convertir PDF a formato XML home.PDFToXML.desc=Convertir PDF a formato XML
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=Detectar/Dividir fotos escaneadas home.ScannerImageSplit.title=Detectar/Dividir fotos escaneadas
home.ScannerImageSplit.desc=Dividir varias fotos dentro de una foto/PDF home.ScannerImageSplit.desc=Dividir varias fotos dentro de una foto/PDF
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title=Firmar home.sign.title=Firmar
home.sign.desc=Añade firma a PDF mediante dibujo, texto o imagen home.sign.desc=Añadir firma a PDF mediante dibujo, texto o imagen
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=Aplanar home.flatten.title=Aplanar
home.flatten.desc=Eliminar todos los elementos y formularios interactivos de un PDF home.flatten.desc=Eliminar todos los elementos y formularios interactivos de un PDF
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title=Reparar home.repair.title=Reparar
home.repair.desc=Intenta reparar un PDF corrupto/roto home.repair.desc=Intentar reparar un PDF corrupto/roto
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
home.removeBlanks.title=Eliminar páginas en blanco home.removeBlanks.title=Eliminar páginas en blanco
home.removeBlanks.desc=Detecta y elimina páginas en blanco de un documento home.removeBlanks.desc=Detectar y eliminar páginas en blanco de un documento
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title=Comparar home.compare.title=Comparar
home.compare.desc=Compara y muestra las diferencias entre 2 documentos PDF home.compare.desc=Comparar y mostrar las diferencias entre 2 documentos PDF
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
downloadPdf=Descargar PDF home.certSign.title=Firmar con certificado
text=Texto home.certSign.desc=Firmar un PDF con un Certificado/Clave (PEM/P12)
font=Fuente ##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Diseño de varias páginas
home.pageLayout.desc=Unir varias páginas de un documento PDF en una sola página
##########################
### TODO: Translate ###
##########################
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=Escalar/ajustar tamaño de página
home.scalePages.desc=Escalar/cambiar el tamaño de una pagina y/o su contenido
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
##########################
### TODO: Translate ###
##########################
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
##########################
### TODO: Translate ###
##########################
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
##########################
### TODO: Translate ###
##########################
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
##########################
### TODO: Translate ###
##########################
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
##########################
### TODO: Translate ###
##########################
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
##########################
### TODO: Translate ###
##########################
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
##########################
### TODO: Translate ###
##########################
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Diseño de varias páginas
pageLayout.header=Diseño de varias páginas
pageLayout.pagesPerSheet=Páginas por hoja:
pageLayout.submit=Entregar
#scalePages
scalePages.title=Ajustar escala de la página
scalePages.header=Adjustar escala de la página
scalePages.pageSize=Tamaño de la página del documento
scalePages.scaleFactor=Nivel de zoom (recorte) de la página
scalePages.submit=Entregar
#certSign
certSign.title=Firma de certificado
certSign.header=Firmar un PDF con su certificado (Trabajo en progreso)
certSign.selectPDF=Seleccione un archivo PDF para firmar:
certSign.selectKey=Seleccione su archivo de clave privada (formato PKCS#8, podría ser .pem o .der):
certSign.selectCert=Seleccione su archivo de certificado (formato X.509, podría ser .pem o .der):
certSign.selectP12=Seleccione su archivo de almacén de claves PKCS#12 (.p12 o .pfx) (Opcional, si se proporciona, debe contener su clave privada y certificado):
certSign.certType=Tipo de certificado
certSign.password=Ingrese su almacén de claves o contraseña de clave privada (si corresponde):
certSign.showSig=Mostrar firma
certSign.reason=Razón
certSign.location=Ubicación
certSign.name=Nombre
certSign.submit=Firmar PDF
#removeBlanks
removeBlanks.title=Eliminar espacios en blanco removeBlanks.title=Eliminar espacios en blanco
removeBlanks.header=Eliminar páginas en blanco removeBlanks.header=Eliminar páginas en blanco
removeBlanks.threshold=Umbral: removeBlanks.threshold=Umbral:
removeBlanks.thresholdDesc=Umbral para determinar qué tan blanco debe ser un píxel blanco removeBlanks.thresholdDesc=Umbral para determinar cuán blanco debe ser un píxel blanco
removeBlanks.whitePercent=Porcentaje de blanco (%): removeBlanks.whitePercent=Porcentaje de blanco (%):
removeBlanks.whitePercentDesc=Porcentaje de página que debe ser blanca para ser eliminada removeBlanks.whitePercentDesc=Porcentaje de página que debe ser blanca para ser eliminada
removeBlanks.submit=Eliminar espacios en blanco removeBlanks.submit=Eliminar espacios en blanco
#compare
compare.title=Comparar compare.title=Comparar
compare.header=Comparar archivos PDF compare.header=Comparar archivos PDF
compare.document.1=Documento 1 compare.document.1=Documento 1
compare.document.2=Documento 2 compare.document.2=Documento 2
compare.submit=Comparar compare.submit=Comparar
#sign
sign.title=Firmar sign.title=Firmar
sign.header=Firmar archivos PDF sign.header=Firmar archivos PDF
sign.upload=Subir imagen sign.upload=Subir imagen
@@ -150,127 +496,122 @@ sign.text=Entrada de texto
sign.clear=Borrar sign.clear=Borrar
sign.add=Agregar sign.add=Agregar
#repair
repair.title=Reparar repair.title=Reparar
repair.header=Reparar archivos PDF repair.header=Reparar archivos PDF
repair.submit=Reparar repair.submit=Reparar
#flatten
flatten.title=Aplanar flatten.title=Aplanar
flatten.header=Acoplar archivos PDF flatten.header=Acoplar archivos PDF
flatten.submit=Aplanar flatten.submit=Aplanar
#ScannerImageSplit
ScannerImageSplit.selectText.1=Umbral de ángulo: ScannerImageSplit.selectText.1=Umbral de ángulo:
ScannerImageSplit.selectText.2=Establece el ángulo absoluto mínimo requerido para rotar la imagen (predeterminado: 10). ScannerImageSplit.selectText.2=Establecer el ángulo absoluto mínimo requerido para rotar la imagen (predeterminado: 10).
ScannerImageSplit.selectText.3=Tolerancia: ScannerImageSplit.selectText.3=Tolerancia:
ScannerImageSplit.selectText.4=Determina el rango de variación de color alrededor del color de fondo estimado (predeterminado: 30). ScannerImageSplit.selectText.4=Determinar el rango de variación de color alrededor del color de fondo estimado (predeterminado: 30).
ScannerImageSplit.selectText.5=Área mínima: ScannerImageSplit.selectText.5=Área mínima:
ScannerImageSplit.selectText.6=Establece el umbral mínimo de área para una foto (predeterminado: 10000). ScannerImageSplit.selectText.6=Establecer el umbral mínimo de área para una foto (predeterminado: 10000).
ScannerImageSplit.selectText.7=Área de contorno mínima: ScannerImageSplit.selectText.7=Área de contorno mínima:
ScannerImageSplit.selectText.8=Establece el umbral mínimo del área de contorno para una foto ScannerImageSplit.selectText.8=Establecer el umbral mínimo del área de contorno para una foto
ScannerImageSplit.selectText.9=Tamaño del borde: ScannerImageSplit.selectText.9=Tamaño del borde:
ScannerImageSplit.selectText.10=Establece el tamaño del borde agregado y eliminado para evitar bordes blancos en la salida (predeterminado: 1). ScannerImageSplit.selectText.10=Establece el tamaño del borde agregado y eliminado para evitar bordes blancos en la salida (predeterminado: 1).
navbar.settings=Ajustes
settings.title=Ajustes
settings.update=Actualización disponible
settings.appVersion=Version de la aplicacion:
settings.downloadOption.title=Elija la opción de descarga (para descargas de un solo archivo sin zip):
settings.downloadOption.1=Abre en la misma ventana
settings.downloadOption.2=Abre en una nueva ventana
settings.downloadOption.3=Descarga el fichero
settings.zipThreshold=Ficheros Zip cuando excede el número de ficheros descargados
#OCR #OCR
ocr.title=OCR / Escaneo de limpieza ocr.title=OCR / Escaneo de limpieza
ocr.header=Escaneos de limpieza / OCR (Reconocimiento óptico de caracteres) ocr.header=Escaneos de limpieza / OCR (Reconocimiento óptico de caracteres)
ocr.selectText.1=Selecciona los idiomas que se detectarán en el PDF (Los enumerados son los detectados actualmente): ocr.selectText.1=Seleccionar los idiomas que se detectarán en el PDF (Los enumerados son los detectados actualmente):
ocr.selectText.2=Produzca un archivo de texto que contenga texto OCR junto con el PDF editado con OCR ocr.selectText.2=Producir un archivo de texto que contenga texto OCR junto con el PDF editado con OCR
ocr.selectText.3=Corrija las páginas que se escanearon en un ángulo torcido girándolas nuevamente a su lugar ocr.selectText.3=Corregir las páginas que se escanearon en un ángulo torcido girándolas nuevamente a su lugar
ocr.selectText.4=Limpie la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo. (Sin cambio de salida) ocr.selectText.4=Limpiar la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo (Sin cambio de salida)
ocr.selectText.5=Limpie la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo, mantiene la limpieza en la salida. ocr.selectText.5=Limpiar la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo, mantiene la limpieza en la salida.
ocr.selectText.6=Ignora las páginas que tienen texto interactivo, solo las páginas OCR que son imágenes ocr.selectText.6=Ignorar las páginas que tienen texto interactivo, solo las páginas OCR que son imágenes
ocr.selectText.7=Fuerza OCR, OCR eliminará en cada página todo el texto original ocr.selectText.7=Forzar OCR, OCR eliminará en cada página todo el texto original
ocr.selectText.8=Normal (Se producirá un error si el PDF contiene texto) ocr.selectText.8=Normal (se producirá un error si el PDF contiene texto)
ocr.selectText.9=Ajustes Adicionales ocr.selectText.9=Ajustes adicionales
ocr.selectText.10=Modo OCR ocr.selectText.10=Modo OCR
ocr.selectText.11=Eliminar imágenes después de OCR (Elimina TODAS las imágenes, solo es útil si es parte del paso de conversión) ocr.selectText.11=Eliminar imágenes después de OCR (Elimina TODAS las imágenes, solo es útil si es parte del paso de conversión)
ocr.selectText.12=Tipo de procesamiento (avanzado) ocr.selectText.12=Tipo de procesamiento (avanzado)
ocr.help=Lea esta documentación sobre cómo usar esto para otros idiomas y/o no usarlo en docker ocr.help=Lea esta documentación sobre cómo usar esto para otros idiomas y/o no usarlo en Docker
ocr.credit=Este servicio utiliza OCRmyPDF y Tesseract para OCR. ocr.credit=Este servicio utiliza OCRmyPDF y Tesseract para OCR
ocr.submit=Procesa PDF con OCR ocr.submit=Procesar PDF con OCR
#extractImages
extractImages.title=Extraer imágenes extractImages.title=Extraer imágenes
extractImages.header=Extraer imágenes extractImages.header=Extraer imágenes
extractImages.selectText=Selecciona el formato de imagen para convertir las imágenes extraídas extractImages.selectText=Seleccionar el formato de imagen para convertir las imágenes extraídas
extractImages.submit=Extraer extractImages.submit=Extraer
#File to PDF #File to PDF
fileToPDF.title=Fichero a PDF fileToPDF.title=Archivo a PDF
fileToPDF.header=Convierte cualquier fichero a PDF fileToPDF.header=Convertir cualquier archivo a PDF
fileToPDF.credit=Este servicio usa LibreOffice y Unoconv para la conversión de ficheros. fileToPDF.credit=Este servicio usa LibreOffice y Unoconv para la conversión de ficheros
fileToPDF.supportedFileTypes=Los tipos de ficheros soportados deben incluir los de abajo sin embargo para una completa y acutualizada lista de formatos soportados, por favor consulte la documentación de LibreOffice fileToPDF.supportedFileTypes=Los tipos de ficheros soportados deben incluir los de abajo; sin embargo, para una completa y acutualizada lista de formatos soportados, por favor consulte la documentación de LibreOffice
fileToPDF.submit=Convertir a PDF fileToPDF.submit=Convertir a PDF
#compress #compress
compress.title=Comprimir compress.title=Comprimir
compress.header=Comprimir PDF compress.header=Comprimir PDF
compress.credit=Este servicio usa OCRmyPDF para la Compresión/Optimizatión del PDF. compress.credit=Este servicio utiliza Ghostscript para compresión/optimización de PDF
compress.selectText.1=Nivel de Optimización: compress.selectText.1=Modo manual - De 1 a 4
compress.selectText.2=0 (Sin optimización) compress.selectText.2=Nivel de optimización:
compress.selectText.3=1 (Por defecto, optimización sin pérdidas) compress.selectText.3=4 (Terrible para imágenes de texto)
compress.selectText.4=2 (Optimización con pérdida) compress.selectText.4=Modo automático: ajusta automáticamente la calidad para que el PDF tenga el tamaño exacto
compress.selectText.5=3 (Optimización con pérdida, más agresiva) compress.selectText.5=Tamaño esperado del PDF (por ejemplo, 25 MB, 10.8 MB, 25 KB)
compress.selectText.6=Habilita la vista web rápida (linealizar PDF)
compress.selectText.7=Habilita la codificación JBIG2 con pérdida
compress.submit=Comprimir compress.submit=Comprimir
#Add image #Add image
addImage.title=Añade Imagen addImage.title=Añadir imagen
addImage.header=Añade image de PDF addImage.header=Añadir imagen de PDF
addImage.everyPage=¿Todas las páginas? addImage.everyPage=¿Todas las páginas?
addImage.submit=Añade imagen addImage.upload=Añadir imagen
addImage.submit=Añadir imagen
#merge #merge
merge.title=Une merge.title=Unir
merge.header=Une múltiples PDFs (2+) merge.header=Unir múltiples PDFs (2+)
merge.submit=Une merge.submit=Unir
#pdfOrganiser #pdfOrganiser
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=Organiza páginas pdfOrganiser.submit=Organizar páginas
#multiTool
multiTool.title=Multi-herramienta PDF
multiTool.header=Multi-herramienta PDF
#herramienta multiple
multiTool.title=Multiherramienta PDF
multiTool.header=Multiherramienta PDF
#pageRemover #pageRemover
pageRemover.title=Eliminador de páginas 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 (Introduzca 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=Elimina Páginas pageRemover.submit=Eliminar Páginas
#rotate #rotate
rotate.title=Rotar PDF rotate.title=Rotar PDF
rotate.header=Rotar PDF rotate.header=Rotar PDF
rotate.SeleccionaAngle=Selecciona ángulo de rotación (múltiple de 90 grados): rotate.selectAngle=Select rotation angle (in multiples of 90 degrees):
rotate.submit=Rotar rotate.submit=Rotar
#merge #merge
split.title=Dividir PDF split.title=Dividir PDF
split.header=Dividir PDF split.header=Dividir PDF
split.desc.1=Los números que selecciona 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-8 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
@@ -278,7 +619,7 @@ split.desc.5=Documento #3: Páginas 4, 5 y 6
split.desc.6=Documento #4: Página 7 split.desc.6=Documento #4: Página 7
split.desc.7=Documento #5: Página 8 split.desc.7=Documento #5: Página 8
split.desc.8=Documento #6: Páginas 9 y 10 split.desc.8=Documento #6: Páginas 9 y 10
split.splitPages=Introduzca las páginas para dividir: split.splitPages=Introducir las páginas para dividir:
split.submit=Dividir split.submit=Dividir
@@ -287,31 +628,33 @@ imageToPDF.title=Imagen a PDF
imageToPDF.header=Imagen a PDF imageToPDF.header=Imagen a PDF
imageToPDF.submit=Convertir imageToPDF.submit=Convertir
imageToPDF.selectText.1=Estirar para ajustar imageToPDF.selectText.1=Estirar para ajustar
imageToPDF.selectText.2=Auto rotación PDF imageToPDF.selectText.2=Rotación automática del PDF
imageToPDF.selectText.3=Lógica de archivos múltiples (Únicamente activado si funciona con multiples imágenes) imageToPDF.selectText.3=Lógica de archivos múltiples (únicamente activado si funciona con multiples imágenes)
imageToPDF.selectText.4=Une en un único PDF imageToPDF.selectText.4=Unir en un único archivo PDF
imageToPDF.selectText.5=Convertir a PDFs separados imageToPDF.selectText.5=Convertir a PDFs separados
#pdfToImage #pdfToImage
pdfToImage.title=PDF a Imagen pdfToImage.title=PDF a Imagen
pdfToImage.header=PDF a Imagen pdfToImage.header=PDF a Imagen
pdfToImage.selectText=Formato de Imagen pdfToImage.selectText=Formato de Imagen
pdfToImage.singleOrMultiple=Tipo resultante de imagen pdfToImage.singleOrMultiple=Tipo resultante de imagen
pdfToImage.single=Imagen Grande Única pdfToImage.single=Una única imagen grande
pdfToImage.multi=Múltiples Imágenes pdfToImage.multi=Múltiples imágenes
pdfToImage.colorType=Tipo de color pdfToImage.colorType=Tipo de color
pdfToImage.color=Color pdfToImage.color=Color
pdfToImage.grey=Escala de Grises pdfToImage.grey=Escala de grises
pdfToImage.blackwhite=Blanco y Negro (¡Puedes perder datos!) pdfToImage.blackwhite=Blanco y Negro (¡Puede perder datos!)
pdfToImage.submit=Convertir pdfToImage.submit=Convertir
#addPassword #addPassword
addPassword.title=Añade Contraseña addPassword.title=Añadir contraseña
addPassword.header=Añade contraseña (Encripta) addPassword.header=Añadir contraseña (encriptar)
addPassword.selectText.1=Selecciona PDF para encriptar addPassword.selectText.1=Seleccionar PDF para encriptar
addPassword.selectText.2=Contraseña addPassword.selectText.2=Contraseña
addPassword.selectText.3=Longitud de la clave de cifrado addPassword.selectText.3=Longitud de la clave de cifrado
addPassword.selectText.4=Valores altos son más fuertes, pero valores bajos tienen mejor compatibilidad. addPassword.selectText.4=Valores altos son más fuertes, pero valores bajos tienen mejor compatibilidad
addPassword.selectText.5=Permisos para establecer addPassword.selectText.5=Permisos para establecer
addPassword.selectText.6=Impedir el ensamblaje del documento addPassword.selectText.6=Impedir el ensamblaje del documento
addPassword.selectText.7=Impedir la extracción de contenido addPassword.selectText.7=Impedir la extracción de contenido
@@ -321,32 +664,38 @@ addPassword.selectText.10=Impedir modificación
addPassword.selectText.11=Impedir modificación de anotaciones addPassword.selectText.11=Impedir modificación de anotaciones
addPassword.selectText.12=Impedir imprimir addPassword.selectText.12=Impedir imprimir
addPassword.selectText.13=Impedir imprimir diferentes formatos addPassword.selectText.13=Impedir imprimir diferentes formatos
addPassword.submit=Encripta addPassword.selectText.14=Contraseña
addPassword.selectText.15=Restringe qué se puede hacer con el documento una vez abierto (no soportado por todos los lectores)
addPassword.selectText.16=Restringe la apertura del propio documento
addPassword.submit=Encriptar
#watermark #watermark
watermark.title=Añade marca de agua watermark.title=Añadir marca de agua
watermark.header=Añade marca de agua watermark.header=Añadir marca de agua
watermark.selectText.1=Selecciona PDF para añadir marca de agua: watermark.selectText.1=Seleccionar PDF para añadir marca de agua:
watermark.selectText.2=Texto de la marca de agua: watermark.selectText.2=Texto de la marca de agua:
watermark.selectText.3=Tamaño de la Fuente: watermark.selectText.3=Tamaño de la Fuente:
watermark.selectText.4=Rotación (0-360): watermark.selectText.4=Rotación (0-360):
watermark.selectText.5=Ancho (Espacio entre cada marca de agua horizontalmente): watermark.selectText.5=Ancho (Espacio entre cada marca de agua horizontalmente):
watermark.selectText.6=Alto (Espacio entre cada marca de agua verticalmente): watermark.selectText.6=Alto (Espacio entre cada marca de agua verticalmente):
watermark.selectText.7=Opacidad (0% - 100%): watermark.selectText.7=Opacidad (0% - 100%):
watermark.submit=Añade marca de agua watermark.submit=Añadir marca de agua
#remove-watermark #remove-watermark
remove-watermark.title=Elimina marca de agua remove-watermark.title=Eliminar marca de agua
remove-watermark.header=Elimina marca de agua remove-watermark.header=Eliminar marca de agua
remove-watermark.selectText.1=Selecciona PDF para eliminar la marca de agua: remove-watermark.selectText.1=Seleccionar PDF para eliminar la marca de agua:
remove-watermark.selectText.2=Texto de la marca de agua: remove-watermark.selectText.2=Texto de la marca de agua:
remove-watermark.submit=Elimina marca de agua remove-watermark.submit=Eliminar marca de agua
#Change permissions #Change permissions
permissions.title=Cambiar Permisos permissions.title=Cambiar permisos
permissions.header=Cambiar Permisos permissions.header=Cambiar permisos
permissions.warning=Advertencia para que estos permisos no se puedan cambiar, se recomienda configurarlos con una contraseña a través de la página de cambio de contraseña permissions.warning=Advertencia: para que estos permisos no se puedan cambiar, se recomienda configurarlos con una contraseña a través de la página de cambio de contraseña
permissions.selectText.1=Selecciona PDF para cambiar los permisos permissions.selectText.1=Seleccionar PDF para cambiar los permisos
permissions.selectText.2=Permisos a establecer permissions.selectText.2=Permisos a establecer
permissions.selectText.3=Impedir el ensamblaje del documento permissions.selectText.3=Impedir el ensamblaje del documento
permissions.selectText.4=Impedir la extracción de contenido permissions.selectText.4=Impedir la extracción de contenido
@@ -358,72 +707,82 @@ permissions.selectText.9=Impedir imprimir
permissions.selectText.10=Impedir imprimir diferentes formatos permissions.selectText.10=Impedir imprimir diferentes formatos
permissions.submit=Cambiar permissions.submit=Cambiar
#remove password
removePassword.title=Elimina contraseña
removePassword.header=Elimina contraseña (Desencripta)
removePassword.selectText.1=Selecciona PDF para Desencriptar
removePassword.selectText.2=Contraseña
removePassword.submit=Elimina
changeMetadata.title=Cambia Metadatos #remove password
changeMetadata.header=Cambia Metadatos removePassword.title=Eliminar contraseña
changeMetadata.selectText.1=Edite las variables que desea cambiar removePassword.header=Eliminar contraseña (desencriptar)
changeMetadata.selectText.2=Elimina todos los metadatos removePassword.selectText.1=Seleccionar PDF para desencriptar
removePassword.selectText.2=Contraseña
removePassword.submit=Eliminar
#changeMetadata
changeMetadata.title=Título:
changeMetadata.header=Cambiar metadatos
changeMetadata.selectText.1=Editar las variables que desea cambiar
changeMetadata.selectText.2=Eliminar todos los metadatos
changeMetadata.selectText.3=Mostrar metadatos personalizados: changeMetadata.selectText.3=Mostrar metadatos personalizados:
changeMetadata.author=Autor: changeMetadata.author=Autor:
changeMetadata.creationDate=Fecha de Creación (yyyy/MM/dd HH:mm:ss): changeMetadata.creationDate=Fecha de creación (aaaa/MM/dd HH:mm:ss):
changeMetadata.creator=Creador: changeMetadata.creator=Creador:
changeMetadata.keywords=Palabras clave: changeMetadata.keywords=Palabras clave:
changeMetadata.modDate=Fecha de Modificación (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=Fecha de modificación (aaaa/MM/dd HH:mm:ss):
changeMetadata.producer=Productor: changeMetadata.producer=Productor:
changeMetadata.subject=Asunto: changeMetadata.subject=Asunto:
changeMetadata.title=Título: changeMetadata.title=Título:
changeMetadata.trapped=Trapped: changeMetadata.trapped=Trapped:
changeMetadata.selectText.4=Otros Metadatos: changeMetadata.selectText.4=Otros Metadatos:
changeMetadata.selectText.5=Agregar entrada de metadatos personalizados changeMetadata.selectText.5=Agregar entrada de metadatos personalizados
changeMetadata.submit=Cambia changeMetadata.submit=Cambiar
#xlsToPdf
xlsToPdf.title=Excel a PDF xlsToPdf.title=Excel a PDF
xlsToPdf.header=Excel a PDF xlsToPdf.header=Excel a PDF
xlsToPdf.selectText.1=Selecciona hoja de cálculo de Excel XLS o XLSX para convertir xlsToPdf.selectText.1=Seleccionar hoja de cálculo de Excel XLS o XLSX para convertir
xlsToPdf.convert=convertir xlsToPdf.convert=Convertir
#pdfToPDFA
pdfToPDFA.title=PDF a PDF/A pdfToPDFA.title=PDF a PDF/A
pdfToPDFA.header=PDF a PDF/A pdfToPDFA.header=PDF a PDF/A
pdfToPDFA.credit=Este servicio usa 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
#PDFToWord
PDFToWord.title=PDF a Word PDFToWord.title=PDF a Word
PDFToWord.header=PDF a Word PDFToWord.header=PDF a Word
PDFToWord.selectText.1=Formato de archivo de salida PDFToWord.selectText.1=Formato de archivo de salida
PDFToWord.credit=Este servicio utiliza LibreOffice para la conversión de archivos. PDFToWord.credit=Este servicio utiliza LibreOffice para la conversión de archivos
PDFToWord.submit=Convertir PDFToWord.submit=Convertir
#PDFToPresentation
PDFToPresentation.title=PDF a presentación PDFToPresentation.title=PDF a presentación
PDFToPresentation.header=PDF a presentación PDFToPresentation.header=PDF a presentación
PDFToPresentation.selectText.1=Formato de archivo de salida PDFToPresentation.selectText.1=Formato de archivo de salida
PDFToPresentation.credit=Este servicio utiliza LibreOffice para la conversión de archivos. PDFToPresentation.credit=Este servicio utiliza LibreOffice para la conversión de archivos
PDFToPresentation.submit=Convertir PDFToPresentation.submit=Convertir
PDFToText.title=PDF a texto/RTF #PDFToText
PDFToText.header=PDF a texto/RTF PDFToText.title=PDF a TXT/RTF
PDFToText.header=PDF a TXT/RTF
PDFToText.selectText.1=Formato de archivo de salida PDFToText.selectText.1=Formato de archivo de salida
PDFToText.credit=Este servicio utiliza LibreOffice para la conversión de archivos. PDFToText.credit=Este servicio utiliza LibreOffice para la conversión de archivos
PDFToText.submit=Convertir PDFToText.submit=Convertir
#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 LibreOffice para la conversión de archivos
PDFToHTML.submit=Convertir PDFToHTML.submit=Convertir
#PDFToXML
PDFToXML.title=PDF a XML PDFToXML.title=PDF a XML
PDFToXML.header=PDF a XML PDFToXML.header=PDF a XML
PDFToXML.credit=Este servicio utiliza LibreOffice para la conversión de archivos. PDFToXML.credit=Este servicio utiliza LibreOffice para la conversión de archivos
PDFToXML.submit=Convertir PDFToXML.submit=Convertir

View File

@@ -0,0 +1,788 @@
###########
# Generic #
###########
# the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr
pdfPrompt=Hautatu PDFa(k)
multiPdfPrompt=Hautatu PDFak (2+)
multiPdfDropPrompt=Hautatu (edo arrastatu eta jaregin) nahi dituzun PDFak
imgPrompt=Hautatu Irudia(k)
genericSubmit=Bidali
processTimeWarning=Oharra: prozesu honetarako minutu bat ere beharko da fitxategiaren tamaiaren arabera
pageOrderPrompt=Orrialdeen ordena (sartu komaz bereizitako orrialde-zenbakien zerrenda)
goToPage=Joan
true=Egiazkoa
false=Faltsua
unknown=Ezezaguna
save=Gorde
close=Itxi
filesSelected=Hautatutako fitxategiak
noFavourites=Ez dira gogokoak gehitu
bored=Itxaroten aspertuta?
alphabet=Alfabetoa
downloadPdf=PDFa deskargatu
text=Testua
font=Letra-tipoa
selectFillter=-- Select --
pageNum=Orrialde-zenbakia
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=PDF dokumentua pasahitzarekin babestuta dago eta pasahitza ez da sartu edo akastuna da
#############
# NAVBAR #
#############
navbar.convert=Bihurtu
navbar.security=Segurtasuna
navbar.other=Beste bat
navbar.darkmode=Modu iluna
navbar.pageOps=Orrialde-eragiketak
navbar.settings=Ezarpenak
#############
# SETTINGS #
#############
settings.title=Ezarpenak
settings.update=Eguneratze eskuragarria
settings.appVersion=Aplikazioaren bertsioa:
settings.downloadOption.title=Hautatu deskargatzeko aukera (fitxategi bakarra deskargatzeko ZIP gabe):
settings.downloadOption.1=Ireki leiho berean
settings.downloadOption.2=Ireki leiho berrian
settings.downloadOption.3=Deskargatu fitxategia
settings.zipThreshold=ZIP fitxategiak deskargatutako fitxategi kopurua gainditzen denean
#############
# HOME-PAGE #
#############
home.desc=Zure leihatila bakarra autoostatatua zure PDF behar guztietarako
home.multiTool.title=Erabilera anitzeko tresna PDF
home.multiTool.desc=Orriak konbinatu, biratu, berrantolatu eta ezabatu
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
home.merge.title=Elkartu
home.merge.desc=Elkartu zenbait PDF dokumentu bakar batean modu errazean
merge.tags=merge,Page operations,Back end,server side
home.split.title=Zatitu
home.split.desc=Zatitu PDFak zenbait dokumentutan
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=Biratu
home.rotate.desc=Biratu PDFak modu errazean
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
home.imageToPdf.title=Irudia PDF bihurtu
home.imageToPdf.desc=Irudi bat(PNG, JPEG, GIF)PDF bihurtu
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=PDFa irudi bihurtu
home.pdfToImage.desc=PDF bat irudi (PNG, JPEG, GIF) bihurtu
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=Antolatzailea
home.pdfOrganiser.desc=Ezabatu/Berrantolatu orrialdeak edozein ordenatan
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=Gehitu irudia PDFari
home.addImage.desc=Gehitu irudi bat PDFan ezarritako kokaleku batean (lanean)
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
home.watermark.title=Gehitu ur-marka
home.watermark.desc=Gehitu aurrez zehaztutako ur-marka bat PFD dokumentuari
##########################
### TODO: Translate ###
##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.permissions.title=Aldatu baimenak
home.permissions.desc=Aldatu PDF dokumentuaren baimenak
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
home.removePages.title=Ezabatu
home.removePages.desc=Ezabatu nahi ez dituzun orrialdeak PDF dokumentutik
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
home.addPassword.title=Gehitu pasahitza
home.addPassword.desc=Enkriptatu PDF dokumentua pasahitz batekin
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
home.removePassword.title=Ezabatu pasahitza
home.removePassword.desc=Ezabatu pasahitza PDF dokumentutik
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=Konprimatu
home.compressPdfs.desc=Konprimatu PDFak fitxategiaren tamaina murrizteko
##########################
### TODO: Translate ###
##########################
compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=Aldatu metadatuak
home.changeMetadata.desc=Aldatu/Ezabatu/Gehitu metadatuak PDF dokumentuari
##########################
### TODO: Translate ###
##########################
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=Fitxategia PDF bihurtu
home.fileToPDF.desc=PDF bihurtu ia edozein fitxategi (DOCX, PNG, XLS, PPT, TXT eta gehiago)
##########################
### TODO: Translate ###
##########################
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=OCR exekutatu PDFan eta/edo garbiketa-eskaneatzeak
home.ocr.desc=Garbiketa-eskaneatzeak eta irudi-testuak detektatu PDF baten barruan eta berriz ere gehitu testu gisa
##########################
### TODO: Translate ###
##########################
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
home.extractImages.title=Atera irudiak
home.extractImages.desc=Atera irudi guztiak PDF batetik eta ZIPen gorde
##########################
### TODO: Translate ###
##########################
extractImages.tags=picture,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=PDFa PDF/A bihurtu
home.pdfToPDFA.desc=PDFa PDF/A bihurtu luzaro biltegiratzeko
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=PDFa Word Bihurtu
home.PDFToWord.desc=PDF formatuak Word bihurtu (DOC, DOCX y ODT)
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=PDFa aurkezpen bihurtu
home.PDFToPresentation.desc=PDFa aurkezpen formatu bihurtu (PPT, PPTX y ODP)
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=PDFa TXT edo RTF bihurtu
home.PDFToText.desc=PDFa TXT edo RTF formatu bihurtu
##########################
### TODO: Translate ###
##########################
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDFa HTML bihurtu
home.PDFToHTML.desc=PDFa HTML formatu bihurtu
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=PDFa XML bihurtu
home.PDFToXML.desc=PDFa XML formatu bihurtu
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=Detektatu/Zatitu argazki eskaneatuak
home.ScannerImageSplit.desc=Hainbat argazki zatitu argazki/PDF baten barruan
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title=Sinatu
home.sign.desc=Gehitu sinadura PDFari marrazki, testu edo irudi bidez
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=Lautu
home.flatten.desc=PDF batetik elementu eta inprimaki interaktibo guztiak ezabatu
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title=Konpondu
home.repair.desc=Saiatu PDF hondatu/kaltetu bat konpontzen
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
home.removeBlanks.title=Ezabatu orrialde zuriak
home.removeBlanks.desc=Detektatu orrialde zuriak eta dokumentutik ezabatu
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title=Konparatu
home.compare.desc=Konparatu eta erakutsi 2 PDF dokumenturen aldeak
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
home.certSign.title=Sinatu ziurtagiriarekin
home.certSign.desc=Sinatu PDF bat Ziurtagiri/Gako batekin (PEM/P12)
##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Zenbait orrialderen diseinua
home.pageLayout.desc=Elkartu orri bakar batean PDF dokumentu baten zenbait orrialde
##########################
### TODO: Translate ###
##########################
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=Eskalatu/Doitu orrialdearen tamaina
home.scalePages.desc=Eskalatu/Aldatu orrialde baten tamaina eta/edo edukia
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
##########################
### TODO: Translate ###
##########################
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
##########################
### TODO: Translate ###
##########################
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
##########################
### TODO: Translate ###
##########################
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
##########################
### TODO: Translate ###
##########################
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
##########################
### TODO: Translate ###
##########################
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
##########################
### TODO: Translate ###
##########################
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
##########################
### TODO: Translate ###
##########################
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Hainbat orrialderen diseinua
pageLayout.header=Hainbat orrialderen diseinua
pageLayout.pagesPerSheet=Orrialdeak orriko:
pageLayout.submit=Entregatu
#scalePages
scalePages.title=Doitu orrialdearen eskala
scalePages.header=Doitu orrialdearen eskala
scalePages.pageSize=Dokumentuaren orrialdearen tamaina
scalePages.scaleFactor=Orriaren zoom maila (moztea)
scalePages.submit=Entregatu
#certSign
certSign.title=Ziurtagiriaren sinadura
certSign.header=Sinatu PDF bat haren ziurtagiriarekin (lanean)
certSign.selectPDF=Hautatu PDF fitxategi bat sinatzeko:
certSign.selectKey=Hautatu gako pribatuko fitxategia (PKCS#8 formatua, .pem edo .der izan liteke):
certSign.selectCert=Hautatu ziurtagiridun fitxategia (X.509 formatua, .pem edo .der izan liteke):
certSign.selectP12=Hautatu gakoak gordetzeko fitxategia PKCS#12 (.p12 o .pfx) (Aukerakoa, ematen bada, gako pribatua eta ziurtagiria izan beharko ditu):
certSign.certType=Ziurtagiri-mota
certSign.password=Sartu zure gakoen biltegia edo gako pribatuko pasahitza (hala badagokio):
certSign.showSig=Erakutsi sinadura
certSign.reason=Arrazoia
certSign.location=Kokalekua
certSign.name=Izena
certSign.submit=Sinatu PDFa
#removeBlanks
removeBlanks.title=Ezabatu zuriuneak
removeBlanks.header=Ezabatu orrialde zuriak
removeBlanks.threshold=Gutxieneko balioa:
removeBlanks.thresholdDesc=Pixel bat zeinen zuri izan behar den ezartzeko gutxieneko balioa
removeBlanks.whitePercent=Zuriaren protzentajea (%):
removeBlanks.whitePercentDesc=Zuria izan behar den orriaren ehunekoa ezabatua izan dadin
removeBlanks.submit=Ezabatu zuriuneak
#compare
compare.title=Konparatu
compare.header=Konparatu PDF fitxategiak
compare.document.1=1. dokumentua
compare.document.2=2. dokumentua
compare.submit=Konparatu
#sign
sign.title=Sinatu
sign.header=Sinatu PDF fitxategiak
sign.upload=Igo irudia
sign.draw=Marraztu sinadura
sign.text=Testua sartzea
sign.clear=Garbitu
sign.add=Gehitu
#repair
repair.title=Konpondu
repair.header=Konpondu PDF fitxategiak
repair.submit=Konpondu
#flatten
flatten.title=Lautu
flatten.header=Akoplatu PDF fitxategiak
flatten.submit=Lautu
#ScannerImageSplit
ScannerImageSplit.selectText.1=Angeluaren gutxieneko balioa:
ScannerImageSplit.selectText.2=Ezarri eskatutako gutxieneko angelu absolutua irudia biratzeko (lehenetsia: 10).
ScannerImageSplit.selectText.3=Tolerantzia:
ScannerImageSplit.selectText.4=Ezarri kalkulatutako atzeko kolorearen inguruko kolorearen aldakuntza tartea (lehenetsia: 30).
ScannerImageSplit.selectText.5=Gutxieneko area:
ScannerImageSplit.selectText.6=Ezarri arearen gutxieneko balioa argazki batentzat (lehenetsia: 10000).
ScannerImageSplit.selectText.7=Inguruko area gutxienekoa:
ScannerImageSplit.selectText.8=Ezarri inguruko arearen gutxieneko balioa argazki batentzat
ScannerImageSplit.selectText.9=Ertzaren tamaina:
ScannerImageSplit.selectText.10=Ezarri gehitutako eta ezabatutako ertzaren tamaina irteeran ertz zuriak saihesteko (lehenetsia: 1).
#OCR
ocr.title=OCR / Garbiketa-eskaneatzea
ocr.header=Garbiketa-eskaneatzea / OCR (Karaktere-ezagutze optikoa)
ocr.selectText.1=Hautatu PDFan detektatuko diren hizkuntzak (zerrendatutakoak gaur egun detektatzen dituenak dira):
ocr.selectText.2=Sortu OCR testua duen testu-fitxategi bat OCR-ren bidez editatutako PDFarekin batera
ocr.selectText.3=Zuzendu angelu okertu batean eskaneatu ziren orrialdeak berriro beren lekura biratuta
ocr.selectText.4=Garbitu orrialdea OCRk hondoko zaratan testua aurkitzeko probabilitate txikiagoa izan dezan (Irteeran aldatu gabe)
ocr.selectText.5=Garbitu orrialdea OCRk hondoko zaratan testua aurkitzeko probabilitate txikiagoa izan dezan, irteeran garbi mantentzen du.
ocr.selectText.6=Alde batera utzi testu interaktiboa duten orrialdeak, bakarrik irudi diren OCR orrialdeak
ocr.selectText.7=OCR behartu, OCRk orrialde bakoitzean jatorrizko testu guztia ezabatuko du
ocr.selectText.8=Normala (Errorea gertatuko da PDFak testua baldin badu)
ocr.selectText.9=Ezarpen gehigarriak
ocr.selectText.10=OCR modua
ocr.selectText.11=Irudiak ezabatu OCR-ren ondoren (Irudi GUZTIAK ezabatzen ditu, bakarrik da erabilgarri bihurketa urratsaren parte baldin bada)
ocr.selectText.12=Prozesaketa-mota (aurreratua)
ocr.help=Irakurri honen erabilerari buruzko dokumentazioa beste hizkuntza batzuetarako eta/edo ez erabili Docker-en
ocr.credit=Zerbitzu honek OCRmyPDF eta OCR-rako Tesseract erabiltzen ditu
ocr.submit=PDF prozesatu OCR-rekin
#extractImages
extractImages.title=Atera irudiak
extractImages.header=Atera irudiak
extractImages.selectText=Hautatu irudi-formatua ateratako irudiak bihurtzeko
extractImages.submit=Atera
#File to PDF
fileToPDF.title=Fitxategia PDF bihurtu
fileToPDF.header=Edozein fitxategi PDF bihurtu
fileToPDF.credit=Zerbitzu honek LibreOffice eta Unoconv erabiltzen ditu fitxategiak bihurtzeko
fileToPDF.supportedFileTypes=Jasandako fitxategi-motek behekoak barne hartu behar dituzte; hala ere, jasandako formatuen zerrenda osoa eta eguneratua izateko, kontsultatu, mesedez, LibreOffice-en dokumentazioa
fileToPDF.submit=PDF bihurtu
#compress
compress.title=Konprimatu
compress.header=PDFa konprimatu
compress.credit=Zerbitzu honek Ghostscript erabiltzen du PDFak komprimatzeko/optimizatzeko
compress.selectText.1=Eskuz 1etik 4ra
compress.selectText.2=Optimizazio maila:
compress.selectText.3=4 (Izugarria testu-irudietarako)
compress.selectText.4=Automatikoa: automatikoki egokitzen du kalitatea PDFak tamaina doi-doia izan dezan
compress.selectText.5=PDFaren espero den tamaina (adibidez, 25 MB, 10.8 MB, 25 KB)
compress.submit=Konprimatu
#Add image
addImage.title=Gehitu irudia
addImage.header=Gehitu PDF-irudia
addImage.everyPage=Orrialde guztiak?
addImage.upload=Gehitu irudia
addImage.submit=Gehitu irudia
#merge
merge.title=Elkartu
merge.header=Elkartu zenbait PDF (2+)
merge.submit=Elkartu
#pdfOrganiser
pdfOrganiser.title=Orrialdeen antolatzailea
pdfOrganiser.header=PDF orrialdeen antolatzailea
pdfOrganiser.submit=Antolatu orrialdeak
#multiTool
multiTool.title=PDF erabilera anitzeko tresna
multiTool.header=PDF erabilera anitzeko tresna
#pageRemover
pageRemover.title=Orrialdeen ezabatzailea
pageRemover.header=PDF orrialdeen ezabatzailea
pageRemover.pagesToDelete=Ezabatu beharreko orrialdeak (sartu komaz bereizitako orrialde-zenbakien zerrenda):
pageRemover.submit=Ezabatu orrialdeak
#rotate
rotate.title=Biratu PDFa
rotate.header=Biratu PDFa
rotate.selectAngle=Select rotation angle (in multiples of 90 degrees):
rotate.submit=Biratu
#merge
split.title=Zatitu PDFa
split.header=Zatitu PDFa
split.desc.1=Hautatzen dituzun zenbakiak zatiketa egin nahi duzun orrialde-zenbakiak dira
split.desc.2=Beraz, 1,3,7-8 hautatzean 10 orrialdeko dokumentua zatituko luke 6 PDF fitxategi bereizituetan
split.desc.3=#1 Dokumentua: 1. orrialdea
split.desc.4=#2 Dokumentua: 2. eta 3. orrialdeak
split.desc.5=#3 Dokumentua: 4., 5. eta 6. orrialdeak
split.desc.6=#4 Dokumentua: 7. orrialdea
split.desc.7=#5 Dokumentua: 8. orrialdea
split.desc.8=#6 Dokumentua: 9. eta 10. orrialdeak
split.splitPages=Sartu orrialdeak zatitzeko:
split.submit=Zatitu
#merge
imageToPDF.title=Irudia PDF bihurtu
imageToPDF.header=Irudia PDF bihurtu
imageToPDF.submit=Bihurtu
imageToPDF.selectText.1=Zabaldu doitzeko
imageToPDF.selectText.2=PDFaren errotazio automatikoa
imageToPDF.selectText.3=Fitxategi askoren logika (gaituta bakarrik zenbait irudirekin ari denean)
imageToPDF.selectText.4=Elkartu PDF bakar batean
imageToPDF.selectText.5=Bihurtu eta PDF bereizituak sortu
#pdfToImage
pdfToImage.title=PDFa irudi bihurtu
pdfToImage.header=PDFa irudi bihurtu
pdfToImage.selectText=Irudi-formatua
pdfToImage.singleOrMultiple=Ondoriozko irudi-mota
pdfToImage.single=Irudi handi bakarra
pdfToImage.multi=Zenbait irudi
pdfToImage.colorType=Kolore-mota
pdfToImage.color=Kolorea
pdfToImage.grey=Gris-eskala
pdfToImage.blackwhite=Zuria eta Beltza (Datuak galdu ditzake!)
pdfToImage.submit=Bihurtu
#addPassword
addPassword.title=Gehitu pasahitza
addPassword.header=Gehitu pasahitza (enkriptatu)
addPassword.selectText.1=Hautatu PDFa enkriptatzeko
addPassword.selectText.2=Pasahitza
addPassword.selectText.3=Gakoaren luzera
addPassword.selectText.4=Balio altuak sendoagoak dira, baina balio baxuek bateragarritasun hobea dute
addPassword.selectText.5=Ezartzeko baimenak
addPassword.selectText.6=Galarazi dokumentuaren mihiztaketa
addPassword.selectText.7=Galarazi edukia ateratzea
addPassword.selectText.8=Galarazi ateratzea irisgarritasunerako
addPassword.selectText.9=Galarazi inprimakia betetzea
addPassword.selectText.10=Galarazi aldaketak egitea
addPassword.selectText.11=Galarazi oharrak aldatzea
addPassword.selectText.12=Galarazi inprimatzea
addPassword.selectText.13=Galarazi zenbait formatu inprimatzea
addPassword.selectText.14=Pasahitza
addPassword.selectText.15=Mugatu zer egin daitekeen dokumentuarekin behin zabalduta (Irakurle guztiek onartu gabe)
addPassword.selectText.16=Mugatu dokumentu bera zabaltzeko aukera
addPassword.submit=Enkriptatu
#watermark
watermark.title=Gehitu ur-marka
watermark.header=Gehitu ur-marka
watermark.selectText.1=Hautatu PDFa ur-marka gehitzeko:
watermark.selectText.2=Ur-markaren testua:
watermark.selectText.3=Letra-tipoaren tamaina:
watermark.selectText.4=Errotazioa (0-360):
watermark.selectText.5=Zabalera (ur-marka bakoitzaren arteko espazioa horizontalean):
watermark.selectText.6=Altuera (ur-marka bakoitzaren arteko espazioa bertikalean):
watermark.selectText.7=Opakutasuna (0% - 100%):
watermark.submit=Gehitu ur-marka
#remove-watermark
remove-watermark.title=Ezabatu ur-marka
remove-watermark.header=Ezabatu ur-marka
remove-watermark.selectText.1=Hautatu PDFa ur-marka ezabatzeko:
remove-watermark.selectText.2=Ur-markaren testua:
remove-watermark.submit=Ezabatu ur-marka
#Change permissions
permissions.title=Aldatu baimenak
permissions.header=Aldatu baimenak
permissions.warning=Oharra: baimen hauek aldatzea ezinezkoa izan dadin, gomendatzen da pasahitz batekin konfiguratzea pasahitza aldatzeko orriaren bitartez
permissions.selectText.1=Hautatu PDFa baimenak aldatzeko
permissions.selectText.2=Baimenak, ezarri beharrekoak
permissions.selectText.3=Galarazi dokumentuaren mihiztaketa
permissions.selectText.4=Galarazi edukia ateratzea
permissions.selectText.5=Galarazi ateratzea irisgarritasunerako
permissions.selectText.6=Galarazi inprimakia betetzea
permissions.selectText.7=Galarazi aldaketak egitea
permissions.selectText.8=Galarazi oharrak aldatzea
permissions.selectText.9=Galarazi inprimatzea
permissions.selectText.10=Galarazi zenbait formatu inprimatzea
permissions.submit=Aldatu
#remove password
removePassword.title=Ezabatu pasahitza
removePassword.header=Ezabatu pasahitza (desenkriptatu)
removePassword.selectText.1=Hautatu PDFa desenkriptatzeko
removePassword.selectText.2=Pasahitza
removePassword.submit=Ezabatu
#changeMetadata
changeMetadata.title=Izenburua:
changeMetadata.header=Aldatu metadatuak
changeMetadata.selectText.1=Editatu aldatu nahi dituzun aldagaiak
changeMetadata.selectText.2=Ezabatu metadatu guztiak
changeMetadata.selectText.3=Erakutsi metadatu pertsonalizatuak:
changeMetadata.author=Egilea:
changeMetadata.creationDate=Sortze-data (aaaa/MM/dd HH:mm:ss):
changeMetadata.creator=Sortzailea:
changeMetadata.keywords=Gako-hitzak:
changeMetadata.modDate=Aldatze-data (aaaa/MM/dd HH:mm:ss):
changeMetadata.producer=Ekoizlea:
changeMetadata.subject=Gaia:
changeMetadata.title=Izenburua:
changeMetadata.trapped=Trapped:
changeMetadata.selectText.4=Beste metadatu batzuk:
changeMetadata.selectText.5=Gehitu metadatu pertsonalizatuen sarrera
changeMetadata.submit=Aldatu
#xlsToPdf
xlsToPdf.title=Excela PDF bihurtu
xlsToPdf.header=Excela PDF bihurtu
xlsToPdf.selectText.1=Hautatu Excel XLSren edo XLSXren kalkulu-orria bihurtzeko
xlsToPdf.convert=Bikurtu
#pdfToPDFA
pdfToPDFA.title=PDFa PDF/A bihurtu
pdfToPDFA.header=PDFa PDF/A bihurtu
pdfToPDFA.credit=Zerbitzu honek OCRmyPDF erabiltzen du PDFak PDF/A bihurtzeko
pdfToPDFA.submit=Bihurtu
#PDFToWord
PDFToWord.title=PDFa Word bihurtu
PDFToWord.header=PDFa Word bihurtu
PDFToWord.selectText.1=Irteerako fitxategiaren formatua
PDFToWord.credit=Zerbitzu honek LibreOffice erabiltzen du fitxategiak bihurtzeko
PDFToWord.submit=Bihurtu
#PDFToPresentation
PDFToPresentation.title=PDFa aurkezpen bihurtu
PDFToPresentation.header=PDFa aurkezpen bihurtu
PDFToPresentation.selectText.1=Irteerako fitxategiaren formatua
PDFToPresentation.credit=Zerbitzu honek LibreOffice erabiltzen du fitxategiak bihurtzeko
PDFToPresentation.submit=Bihurtu
#PDFToText
PDFToText.title=PDFa TXT/RTF bihurtu
PDFToText.header=PDFa TXT/RTF bihurtu
PDFToText.selectText.1=Irteerako fitxategiaren formatua
PDFToText.credit=Zerbitzu honek LibreOffice erabiltzen du fitxategiak bihurtzeko
PDFToText.submit=Bihurtu
#PDFToHTML
PDFToHTML.title=PDFa HTML bihurtu
PDFToHTML.header=PDFa HTML bihurtu
PDFToHTML.credit=Zerbitzu honek LibreOffice erabiltzen du fitxategiak bihurtzeko
PDFToHTML.submit=Bihurtu
#PDFToXML
PDFToXML.title=PDFa XML bihurtu
PDFToXML.header=PDFa XML bihurtu
PDFToXML.credit=Zerbitzu honek LibreOffice erabiltzen du fitxategiak bihurtzeko
PDFToXML.submit=Bihurtu

View File

@@ -1,11 +1,7 @@
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#
# Translated by Google Translate #
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl=right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr language.direction=ltr
pdfPrompt=Choisir PDF pdfPrompt=Choisir PDF
@@ -24,116 +20,456 @@ close=Fermer
filesSelected=fichiers sélectionnés filesSelected=fichiers sélectionnés
noFavourites=Aucun favori ajouté noFavourites=Aucun favori ajouté
bored=Ennuyé d'attendre ? bored=Ennuyé d'attendre ?
############# alphabet=Alphabet
# HOME-PAGE # downloadPdf=Télécharger le PDF
############# text=Texte
home.desc=Votre guichet unique hébergé localement pour tous vos besoins PDF. font=Police
selectFillter=-- Select --
pageNum=numéro de page
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
#############
# NAVBAR #
#############
navbar.convert=Convertir navbar.convert=Convertir
navbar.security=Sécurité navbar.security=Sécurité
navbar.other=Autre navbar.other=Autre
navbar.darkmode=Mode sombre navbar.darkmode=Mode sombre
navbar.pageOps=Opérations de page navbar.pageOps=Opérations de page
navbar.settings=Paramètres
#############
# SETTINGS #
#############
settings.title=Paramètres
settings.update=Mise à jour disponible
settings.appVersion=Version de l'application :
settings.downloadOption.title=Choisissez l'option de téléchargement (pour les téléchargements sans fichier unique) :
settings.downloadOption.1=Ouvrir dans la même fenêtre
settings.downloadOption.2=Ouvrir dans une nouvelle fenêtre
settings.downloadOption.3=Fichier téléchargé
settings.zipThreshold=Zip les fichiers lorsque le nombre de fichiers téléchargés dépasse
#############
# HOME-PAGE #
#############
home.desc=Votre guichet unique hébergé localement pour tous vos besoins PDF.
home.multiTool.title=Multi-outil PDF home.multiTool.title=Multi-outil PDF
home.multiTool.desc=Fusionner, faire pivoter, réorganiser et supprimer des pages home.multiTool.desc=Fusionner, faire pivoter, réorganiser et supprimer des pages
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
home.merge.title=Fusionnez home.merge.title=Fusionnez
home.merge.desc=Fusionnez facilement plusieurs PDF en un seul. home.merge.desc=Fusionnez facilement plusieurs PDF en un seul.
merge.tags=merge,Page operations,Back end,server side
home.split.title=Fractionner home.split.title=Fractionner
home.split.desc=Diviser les PDF en plusieurs documents home.split.desc=Diviser les PDF en plusieurs documents
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=Tourner home.rotate.title=Tourner
home.rotate.desc=Faites pivoter facilement vos PDF. home.rotate.desc=Faites pivoter facilement vos PDF.
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
home.imageToPdf.title=Image au format PDF home.imageToPdf.title=Image au format PDF
home.imageToPdf.desc=Convertir une image (PNG, JPEG, GIF) en PDF. home.imageToPdf.desc=Convertir une image (PNG, JPEG, GIF) en PDF.
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=PDF vers image home.pdfToImage.title=PDF vers image
home.pdfToImage.desc=Convertir un PDF en image. (PNG, JPEG, GIF) home.pdfToImage.desc=Convertir un PDF en image. (PNG, JPEG, GIF)
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=Organisateur home.pdfOrganiser.title=Organisateur
home.pdfOrganiser.desc=Supprimer/Réorganiser les pages dans n'importe quel ordre home.pdfOrganiser.desc=Supprimer/Réorganiser les pages dans n'importe quel ordre
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=Ajouter une image au PDF home.addImage.title=Ajouter une image au PDF
home.addImage.desc=Ajoute une image à un emplacement défini sur le PDF (Travail en cours) home.addImage.desc=Ajoute une image à un emplacement défini sur le PDF (Travail en cours)
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
home.watermark.title=Ajouter un filigrane home.watermark.title=Ajouter un filigrane
home.watermark.desc=Ajoutez un filigrane personnalisé à votre document PDF. home.watermark.desc=Ajoutez un filigrane personnalisé à votre document PDF.
##########################
home.remove-watermark.title=Supprimer le filigrane ### TODO: Translate ###
home.remove-watermark.desc=Supprimez les filigranes de votre document PDF. ##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.permissions.title=Modifier les autorisations home.permissions.title=Modifier les autorisations
home.permissions.desc=Modifier les permissions de votre document PDF home.permissions.desc=Modifier les permissions de votre document PDF
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
home.removePages.title=Supprimer home.removePages.title=Supprimer
home.removePages.desc=Supprimez les pages inutiles de votre document PDF. home.removePages.desc=Supprimez les pages inutiles de votre document PDF.
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
home.addPassword.title=Ajouter un mot de passe home.addPassword.title=Ajouter un mot de passe
home.addPassword.desc=Cryptez votre document PDF avec un mot de passe. home.addPassword.desc=Cryptez votre document PDF avec un mot de passe.
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
home.removePassword.title=Supprimer le mot de passe home.removePassword.title=Supprimer le mot de passe
home.removePassword.desc=Supprimez la protection par mot de passe de votre document PDF. home.removePassword.desc=Supprimez la protection par mot de passe de votre document PDF.
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=Compresser home.compressPdfs.title=Compresser
home.compressPdfs.desc=Compressez les PDF pour réduire leur taille de fichier. home.compressPdfs.desc=Compressez les PDF pour réduire leur taille de fichier.
##########################
### TODO: Translate ###
##########################
compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=Modifier les métadonnées home.changeMetadata.title=Modifier les métadonnées
home.changeMetadata.desc=Modifier/Supprimer/Ajouter des métadonnées d'un document PDF home.changeMetadata.desc=Modifier/Supprimer/Ajouter des métadonnées d'un document PDF
##########################
### TODO: Translate ###
##########################
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=Convertir un fichier en PDF home.fileToPDF.title=Convertir un fichier en PDF
home.fileToPDF.desc=Convertissez presque n\u2019importe quel fichier en PDF (DOCX, PNG, XLS, PPT, TXT et plus) home.fileToPDF.desc=Convertissez presque n\u2019importe quel fichier en PDF (DOCX, PNG, XLS, PPT, TXT et plus)
##########################
### TODO: Translate ###
##########################
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=Exécuter l'OCR sur les scans PDF et/ou de nettoyage home.ocr.title=Exécuter l'OCR sur les scans PDF et/ou de nettoyage
home.ocr.desc=Le nettoyage analyse et détecte le texte des images dans un PDF et le rajoute en tant que texte. home.ocr.desc=Le nettoyage analyse et détecte le texte des images dans un PDF et le rajoute en tant que texte.
##########################
### TODO: Translate ###
##########################
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
home.extractImages.title=Extraire les images home.extractImages.title=Extraire les images
home.extractImages.desc=Extrait toutes les images d\u2019un PDF et les enregistre au format zip home.extractImages.desc=Extrait toutes les images d\u2019un PDF et les enregistre au format zip
##########################
### TODO: Translate ###
##########################
extractImages.tags=picture,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=Convertir PDF en PDF/A home.pdfToPDFA.title=Convertir PDF en PDF/A
home.pdfToPDFA.desc=Convertir un PDF en PDF/A pour un stockage à long terme home.pdfToPDFA.desc=Convertir un PDF en PDF/A pour un stockage à long terme
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=PDF vers Word home.PDFToWord.title=PDF vers Word
home.PDFToWord.desc=Convertir les formats PDF en Word (DOC, DOCX et ODT) home.PDFToWord.desc=Convertir les formats PDF en Word (DOC, DOCX et ODT)
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=PDF vers présentation home.PDFToPresentation.title=PDF vers présentation
home.PDFToPresentation.desc=Convertir des PDF en formats de présentation (PPT, PPTX et ODP) home.PDFToPresentation.desc=Convertir des PDF en formats de présentation (PPT, PPTX et ODP)
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=PDF vers texte/RTF home.PDFToText.title=PDF vers texte/RTF
home.PDFToText.desc=Convertir un PDF au format Texte ou RTF home.PDFToText.desc=Convertir un PDF au format Texte ou RTF
##########################
### TODO: Translate ###
##########################
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDF vers HTML home.PDFToHTML.title=PDF vers HTML
home.PDFToHTML.desc=Convertir le PDF au format HTML home.PDFToHTML.desc=Convertir le PDF au format HTML
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=PDF vers XML home.PDFToXML.title=PDF vers XML
home.PDFToXML.desc=Convertir le PDF au format XML home.PDFToXML.desc=Convertir le PDF au format XML
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=Détecter/diviser les photos numérisées home.ScannerImageSplit.title=Détecter/diviser les photos numérisées
home.ScannerImageSplit.desc=Divise plusieurs photos à partir d'une photo/PDF home.ScannerImageSplit.desc=Divise plusieurs photos à partir d'une photo/PDF
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title=Signe home.sign.title=Signe
home.sign.desc=Ajoute une signature au PDF par dessin, texte ou image home.sign.desc=Ajoute une signature au PDF par dessin, texte ou image
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=Aplatir home.flatten.title=Aplatir
home.flatten.desc=Supprimer tous les éléments et formulaires interactifs d'un PDF home.flatten.desc=Supprimer tous les éléments et formulaires interactifs d'un PDF
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title=Réparer home.repair.title=Réparer
home.repair.desc=Essaye de réparer un PDF corrompu/cassé home.repair.desc=Essaye de réparer un PDF corrompu/cassé
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
home.removeBlanks.title=Supprimer les pages vierges home.removeBlanks.title=Supprimer les pages vierges
home.removeBlanks.desc=Détecte et supprime les pages vierges d'un document home.removeBlanks.desc=Détecte et supprime les pages vierges d'un document
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title=Comparer home.compare.title=Comparer
home.compare.desc=Compare et affiche les différences entre 2 documents PDF home.compare.desc=Compare et affiche les différences entre 2 documents PDF
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
downloadPdf=Télécharger le PDF home.certSign.title=Sign with Certificate
text=Texte home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
font=Police ##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Multi-Page Layout
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
##########################
### TODO: Translate ###
##########################
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=Adjust page size/scale
home.scalePages.desc=Change the size/scale of page and/or its contents.
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
##########################
### TODO: Translate ###
##########################
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
##########################
### TODO: Translate ###
##########################
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
##########################
### TODO: Translate ###
##########################
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
##########################
### TODO: Translate ###
##########################
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
##########################
### TODO: Translate ###
##########################
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
##########################
### TODO: Translate ###
##########################
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
##########################
### TODO: Translate ###
##########################
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Multi Page Layout
pageLayout.header=Multi Page Layout
pageLayout.pagesPerSheet=Pages per sheet:
pageLayout.submit=Submit
#scalePages
scalePages.title=Adjust page-scale
scalePages.header=Adjust page-scale
scalePages.pageSize=Size of a page of the document.
scalePages.scaleFactor=Zoom level (crop) of a page.
scalePages.submit=Submit
#certSign
certSign.title=Signature du certificat
certSign.header=Signer un PDF avec votre certificat (Travail en cours)
certSign.selectPDF=Sélectionnez un fichier PDF à signer :
certSign.selectKey=Sélectionnez votre fichier de clé privée (format PKCS#8, peut être .pem ou .der) :
certSign.selectCert=Sélectionnez votre fichier de certificat (format X.509, peut être .pem ou .der) :
certSign.selectP12=Sélectionnez votre fichier de magasin de clés PKCS#12 (.p12 ou .pfx) (facultatif, s'il est fourni, il doit contenir votre clé privée et votre certificat) :
certSign.certType=Type de certificat
certSign.password=Entrez votre mot de passe de keystore ou de clé privée (le cas échéant) :
certSign.showSig=Afficher la signature
certSign.reason=Raison
certSign.location=Emplacement
certSign.name=Nom
certSign.submit=Signer le PDF
#removeBlanks
removeBlanks.title=Supprimer les blancs removeBlanks.title=Supprimer les blancs
removeBlanks.header=Supprimer les pages vierges removeBlanks.header=Supprimer les pages vierges
removeBlanks.threshold=Seuil : removeBlanks.threshold=Seuil :
@@ -142,12 +478,16 @@ removeBlanks.whitePercent=Pourcentage blanc (%) :
removeBlanks.whitePercentDesc=Pourcentage de page qui doit être blanche pour être supprimée removeBlanks.whitePercentDesc=Pourcentage de page qui doit être blanche pour être supprimée
removeBlanks.submit=Supprimer les blancs removeBlanks.submit=Supprimer les blancs
#compare
compare.title=Comparer compare.title=Comparer
compare.header=Comparer des PDF compare.header=Comparer des PDF
compare.document.1=Document 1 compare.document.1=Document 1
compare.document.2=Document 2 compare.document.2=Document 2
compare.submit=Comparer compare.submit=Comparer
#sign
sign.title=Signe sign.title=Signe
sign.header=Signer des PDF sign.header=Signer des PDF
sign.upload=Télécharger l'image sign.upload=Télécharger l'image
@@ -156,14 +496,20 @@ sign.text=Saisie de texte
sign.clear=Effacer sign.clear=Effacer
sign.add=Ajouter sign.add=Ajouter
#repair
repair.title=Réparer repair.title=Réparer
repair.header=Réparer les PDF repair.header=Réparer les PDF
repair.submit=Réparer repair.submit=Réparer
#flatten
flatten.title=Aplatir flatten.title=Aplatir
flatten.header=Aplatir les PDF flatten.header=Aplatir les PDF
flatten.submit=Aplatir flatten.submit=Aplatir
#ScannerImageSplit
ScannerImageSplit.selectText.1=Seuil d'angle : ScannerImageSplit.selectText.1=Seuil d'angle :
ScannerImageSplit.selectText.2=Définit l'angle absolu minimum requis pour la rotation de l'image (par défaut : 10). ScannerImageSplit.selectText.2=Définit l'angle absolu minimum requis pour la rotation de l'image (par défaut : 10).
ScannerImageSplit.selectText.3=Tolérance : ScannerImageSplit.selectText.3=Tolérance :
@@ -175,16 +521,6 @@ ScannerImageSplit.selectText.8=Définit le seuil de zone de contour minimum pour
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 : 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).
navbar.settings=Paramètres
settings.title=Paramètres
settings.update=Mise à jour disponible
settings.appVersion=Version de l'application :
settings.downloadOption.title=Choisissez l'option de téléchargement (pour les téléchargements sans fichier unique) :
settings.downloadOption.1=Ouvrir dans la même fenêtre
settings.downloadOption.2=Ouvrir dans une nouvelle fenêtre
settings.downloadOption.3=Fichier téléchargé
settings.zipThreshold=Zip les fichiers lorsque le nombre de fichiers téléchargés dépasse
#OCR #OCR
ocr.title=OCR / Nettoyage de numérisation ocr.title=OCR / Nettoyage de numérisation
@@ -206,11 +542,13 @@ ocr.credit=Ce service utilise OCRmyPDF et Tesseract pour l'OCR.
ocr.submit=Traiter PDF avec OCR ocr.submit=Traiter PDF avec OCR
#extractImages
extractImages.title=Extraire les images extractImages.title=Extraire les images
extractImages.header=Extraire les images extractImages.header=Extraire les images
extractImages.selectText=Sélectionner le format d'image pour convertir les images extraites en extractImages.selectText=Sélectionner le format d'image pour convertir les images extraites en
extractImages.submit=Extraire extractImages.submit=Extraire
#File to PDF #File to PDF
fileToPDF.title=Fichier au format PDF fileToPDF.title=Fichier au format PDF
fileToPDF.header=Convertir n'importe quel fichier au format PDF fileToPDF.header=Convertir n'importe quel fichier au format PDF
@@ -219,38 +557,39 @@ fileToPDF.supportedFileTypes=Les types de fichiers pris en charge doivent inclur
fileToPDF.submit=Convertir en PDF fileToPDF.submit=Convertir en PDF
#compress
compress.title=Compresser
compress.header=Compresser le PDF
compress.credit=Ce service utilise Ghostscript pour PDF Compress/Optimisation.
compress.selectText.1=Mode manuel - De 1 à 4
compress.selectText.2=Niveau d'optimisation :
compress.selectText.3=4 (Terrible pour les images de texte)
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 Mo, 10,8 Mo, 25 Ko)
compress.submit=Compresser
#Add image #Add image
addImage.title=Ajouter une image addImage.title=Ajouter une image
addImage.header=Ajouter une image au PDF addImage.header=Ajouter une image au PDF
addImage.everyPage=Chaque page? addImage.everyPage=Chaque page?
addImage.upload=Ajouter une image
addImage.submit=Ajouter une image addImage.submit=Ajouter une image
#compress
compress.title=Compresser
compress.header=Compresser le PDF
compress.credit=Ce service utilise OCRmyPDF pour la compression/optimisation PDF.
compress.selectText.1=Niveau d'optimisation :
compress.selectText.2=0 (pas d'optimisation)
compress.selectText.3=1 (par défaut, optimisation sans perte)
compress.selectText.4=2 (optimisation avec perte)
compress.selectText.5=3 (optimisation avec perte, plus agressive)
compress.selectText.6=Activer l'affichage Web rapide (linéariser PDF)
compress.selectText.7=Activer l'encodage JBIG2 avec perte
compress.submit=Compresser
#merge #merge
merge.title=Fusionner merge.title=Fusionner
merge.header=Fusionner plusieurs PDF (2+) merge.header=Fusionner plusieurs PDF (2+)
merge.submit=Fusionner merge.submit=Fusionner
#pdfOrganiser #pdfOrganiser
pdfOrganiser.title=Organisateur de pages pdfOrganiser.title=Organisateur de pages
pdfOrganiser.header=Organisateur de pages PDF pdfOrganiser.header=Organisateur de pages PDF
pdfOrganiser.submit=Réorganiser les pages pdfOrganiser.submit=Réorganiser les pages
#Outil Multi-fonction
#multiTool
multiTool.title=Multi-outil PDF multiTool.title=Multi-outil PDF
multiTool.header=Outil multiple PDF multiTool.header=Outil multiple PDF
@@ -261,13 +600,15 @@ pageRemover.header=Outil de suppression de pages PDF
pageRemover.pagesToDelete=Pages à supprimer (Entrez une liste de numéros de page séparés par des virgules): pageRemover.pagesToDelete=Pages à supprimer (Entrez une liste de numéros de page séparés par des virgules):
pageRemover.submit=Supprimer des pages pageRemover.submit=Supprimer des pages
#rotate #rotate
rotate.title=Faire pivoter le PDF rotate.title=Faire pivoter le PDF
rotate.header=Faire pivoter le PDF rotate.header=Faire pivoter le PDF
rotate.selectAngle=Sélectionner l'angle de rotation (en multiples de 90 degrés) : rotate.selectAngle=Sélectionner l'angle de rotation (en multiples de 90 degrés) :
rotate.submit=Rotation rotate.submit=Rotation
#Split PDF
#merge
split.title=Fractionner le PDF split.title=Fractionner le PDF
split.header=Diviser le PDF split.header=Diviser le PDF
split.desc.1=Les numéros que vous sélectionnez sont le numéro de page sur lequel vous souhaitez faire un fractionnement. split.desc.1=Les numéros que vous sélectionnez sont le numéro de page sur lequel vous souhaitez faire un fractionnement.
@@ -281,7 +622,8 @@ split.desc.8=Document #6 : Pages 9 et 10
split.splitPages=Entrez les pages sur lesquelles fractionner : split.splitPages=Entrez les pages sur lesquelles fractionner :
split.submit=Diviser split.submit=Diviser
#imageToPDF
#merge
imageToPDF.title=Image au format PDF imageToPDF.title=Image au format PDF
imageToPDF.header=Image au format PDF imageToPDF.header=Image au format PDF
imageToPDF.submit=Convertir imageToPDF.submit=Convertir
@@ -291,7 +633,8 @@ imageToPDF.selectText.3=Logique de fichiers multiples (activé uniquement si vou
imageToPDF.selectText.4=Fusionner en un seul PDF imageToPDF.selectText.4=Fusionner en un seul PDF
imageToPDF.selectText.5=Convertir en PDFs distincts imageToPDF.selectText.5=Convertir en PDFs distincts
#PDF to Image
#pdfToImage
pdfToImage.title=PDF vers image pdfToImage.title=PDF vers image
pdfToImage.header=PDF vers image pdfToImage.header=PDF vers image
pdfToImage.selectText=Format d'image pdfToImage.selectText=Format d'image
@@ -304,6 +647,7 @@ pdfToImage.grey=Niveaux de gris
pdfToImage.blackwhite=Noir et Blanc (Peut perdre des données !) pdfToImage.blackwhite=Noir et Blanc (Peut perdre des données !)
pdfToImage.submit=Convertir pdfToImage.submit=Convertir
#addPassword #addPassword
addPassword.title=Ajouter un mot de passe addPassword.title=Ajouter un mot de passe
addPassword.header=Ajouter un mot de passe (chiffrer) addPassword.header=Ajouter un mot de passe (chiffrer)
@@ -320,8 +664,12 @@ 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'impression addPassword.selectText.12=Empêcher l'impression
addPassword.selectText.13=Empêcher l'impression de différents formats addPassword.selectText.13=Empêcher l'impression de différents formats
addPassword.selectText.14=Owner Password
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
addPassword.selectText.16=Restricts the opening of the document itself
addPassword.submit=Crypter addPassword.submit=Crypter
#watermark #watermark
watermark.title=Ajouter un filigrane watermark.title=Ajouter un filigrane
watermark.header=Ajouter un filigrane watermark.header=Ajouter un filigrane
@@ -334,6 +682,7 @@ watermark.selectText.6=heightSpacer (Espace entre chaque filigrane verticalement
watermark.selectText.7=Opacité (0 % - 100 %) : watermark.selectText.7=Opacité (0 % - 100 %) :
watermark.submit=Ajouter un filigrane watermark.submit=Ajouter un filigrane
#remove-watermark #remove-watermark
remove-watermark.title=Supprimer le filigrane remove-watermark.title=Supprimer le filigrane
remove-watermark.header=Supprimer le filigrane remove-watermark.header=Supprimer le filigrane
@@ -341,7 +690,8 @@ remove-watermark.selectText.1=Sélectionnez le PDF pour supprimer le filigrane :
remove-watermark.selectText.2=Texte du filigrane : remove-watermark.selectText.2=Texte du filigrane :
remove-watermark.submit=Supprimer le filigrane remove-watermark.submit=Supprimer le filigrane
#Change Permissions
#Change permissions
permissions.title=Modifier les autorisations permissions.title=Modifier les autorisations
permissions.header=Modifier les autorisations permissions.header=Modifier les autorisations
permissions.warning=Attention pour que ces permissions soient immuables il est recommandé de les définir avec un mot de passe via la page add-password. permissions.warning=Attention pour que ces permissions soient immuables il est recommandé de les définir avec un mot de passe via la page add-password.
@@ -357,15 +707,17 @@ permissions.selectText.9=Employer pour l'impression
permissions.selectText.10=Empêcher l'impression de différents formats permissions.selectText.10=Empêcher l'impression de différents formats
permissions.submit=Modificateur permissions.submit=Modificateur
#supprimer le mot de passe
#remove password
removePassword.title=Supprimer le mot de passe removePassword.title=Supprimer le mot de passe
removePassword.header=Supprimer le mot de passe (Déchiffrer) removePassword.header=Supprimer le mot de passe (Déchiffrer)
removePassword.selectText.1=Sélectionnez le PDF à déchiffrer removePassword.selectText.1=Sélectionnez le PDF à déchiffrer
removePassword.selectText.2=Mot de passe removePassword.selectText.2=Mot de passe
removePassword.submit=Supprimer removePassword.submit=Supprimer
#Change Metadata
changeMetadata.title=Modifier les métadonnées #changeMetadata
changeMetadata.title=Titre :
changeMetadata.header=Modifier les métadonnées changeMetadata.header=Modifier les métadonnées
changeMetadata.selectText.1=Veuillez modifier les variables que vous souhaitez modifier. changeMetadata.selectText.1=Veuillez modifier les variables que vous souhaitez modifier.
changeMetadata.selectText.2=Supprimer toutes les métadonnées. changeMetadata.selectText.2=Supprimer toutes les métadonnées.
@@ -383,26 +735,30 @@ changeMetadata.selectText.4=Autres métadonnées :
changeMetadata.selectText.5=Ajouter une entrée de métadonnées personnalisées changeMetadata.selectText.5=Ajouter une entrée de métadonnées personnalisées
changeMetadata.submit=Modifier changeMetadata.submit=Modifier
#XLS to PDF
#xlsToPdf
xlsToPdf.title=Excel vers PDF xlsToPdf.title=Excel vers PDF
xlsToPdf.header=Excel en PDF xlsToPdf.header=Excel en PDF
xlsToPdf.selectText.1=Sélectionnez une feuille Excel XLS ou XLSX à convertir. xlsToPdf.selectText.1=Sélectionnez une feuille Excel XLS ou XLSX à convertir.
xlsToPdf.convert=Convertir xlsToPdf.convert=Convertir
#pdfToPDFA
pdfToPDFA.title=PDF vers PDF/A pdfToPDFA.title=PDF vers PDF/A
pdfToPDFA.header=PDF vers PDF/A pdfToPDFA.header=PDF vers PDF/A
pdfToPDFA.credit=Ce service utilise OCRmyPDF pour la conversion PDF/A pdfToPDFA.credit=Ce service utilise OCRmyPDF pour la conversion PDF/A
pdfToPDFA.submit=Convertir pdfToPDFA.submit=Convertir
#PDFToWord
PDFToWord.title=PDF vers Word PDFToWord.title=PDF vers Word
PDFToWord.header=PDF vers Word PDFToWord.header=PDF vers Word
PDFToWord.selectText.1=Format du fichier de sortie PDFToWord.selectText.1=Format du fichier de sortie
PDFToWord.credit=Ce service utilise LibreOffice pour la conversion de fichiers. PDFToWord.credit=Ce service utilise LibreOffice pour la conversion de fichiers.
PDFToWord.submit=Convertir PDFToWord.submit=Convertir
#PDFToPresentation
PDFToPresentation.title=PDF vers présentation PDFToPresentation.title=PDF vers présentation
PDFToPresentation.header=PDF vers présentation PDFToPresentation.header=PDF vers présentation
PDFToPresentation.selectText.1=Format du fichier de sortie PDFToPresentation.selectText.1=Format du fichier de sortie
@@ -410,6 +766,7 @@ PDFToPresentation.credit=Ce service utilise LibreOffice pour la conversion de fi
PDFToPresentation.submit=Convertir PDFToPresentation.submit=Convertir
#PDFToText
PDFToText.title=PDF vers Texte/RTF PDFToText.title=PDF vers Texte/RTF
PDFToText.header=PDF vers texte/RTF PDFToText.header=PDF vers texte/RTF
PDFToText.selectText.1=Format du fichier de sortie PDFToText.selectText.1=Format du fichier de sortie
@@ -417,14 +774,15 @@ PDFToText.credit=Ce service utilise LibreOffice pour la conversion de fichiers.
PDFToText.submit=Convertir PDFToText.submit=Convertir
#PDFToHTML
PDFToHTML.title=PDF vers HTML PDFToHTML.title=PDF vers HTML
PDFToHTML.header=PDF vers HTML PDFToHTML.header=PDF vers HTML
PDFToHTML.credit=Ce service utilise LibreOffice pour la conversion de fichiers. PDFToHTML.credit=Ce service utilise LibreOffice pour la conversion de fichiers.
PDFToHTML.submit=Convertir PDFToHTML.submit=Convertir
#PDFToXML
PDFToXML.title=PDF vers XML PDFToXML.title=PDF vers XML
PDFToXML.header=PDF vers XML PDFToXML.header=PDF vers XML
PDFToXML.credit=Ce service utilise LibreOffice pour la conversion de fichiers. PDFToXML.credit=Ce service utilise LibreOffice pour la conversion de fichiers.
PDFToXML.submit=Convertir PDFToXML.submit=Convertir

View File

@@ -1,7 +1,7 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr = left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr language.direction=ltr
pdfPrompt=Scegli PDF pdfPrompt=Scegli PDF
@@ -20,115 +20,456 @@ close=Chiudi
filesSelected=file selezionati filesSelected=file selezionati
noFavourites=Nessun preferito noFavourites=Nessun preferito
bored=Stanco di aspettare? bored=Stanco di aspettare?
alphabet=Alfabeto
downloadPdf=Scarica PDF
text=Testo
font=Font
selectFillter=-- Seleziona --
pageNum=Numero pagina
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
#############
# NAVBAR #
#############
navbar.convert=Converti
navbar.security=Sicurezza
navbar.other=Altro
navbar.darkmode=Modalità Scura
navbar.pageOps=Modifica pagine
navbar.settings=Impostazioni
#############
# SETTINGS #
#############
settings.title=Impostazioni
settings.update=Aggiornamento disponibile
settings.appVersion=Versione App:
settings.downloadOption.title=Scegli opzione di download (Per file singoli non compressi):
settings.downloadOption.1=Apri in questa finestra
settings.downloadOption.2=Apri in una nuova finestra
settings.downloadOption.3=Scarica file
settings.zipThreshold=Comprimi file in .zip quando il numero di download supera
############# #############
# HOME-PAGE # # HOME-PAGE #
############# #############
home.desc=La tua pagina self-hostata per gestire qualsiasi PDF. home.desc=La tua pagina self-hostata per gestire qualsiasi PDF.
navbar.convert=Converti
navbar.security=Sicurezza
navbar.other=Altro
navbar.darkmode=Modalità Scura
navbar.pageOps=Modifica pagine
home.multiTool.title=Multifunzione PDF home.multiTool.title=Multifunzione PDF
home.multiTool.desc=Unisci, Ruota, Riordina, e Rimuovi pagine home.multiTool.desc=Unisci, Ruota, Riordina, e Rimuovi pagine
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
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=merge,Page operations,Back end,server side
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.
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=Ruota home.rotate.title=Ruota
home.rotate.desc=Ruota un PDF. home.rotate.desc=Ruota un PDF.
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
home.imageToPdf.title=Da immagine a PDF home.imageToPdf.title=Da immagine a PDF
home.imageToPdf.desc=Converti un'immagine (PNG, JPEG, GIF) in PDF. home.imageToPdf.desc=Converti un'immagine (PNG, JPEG, GIF) in PDF.
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=Da PDF a immagine home.pdfToImage.title=Da PDF a immagine
home.pdfToImage.desc=Converti un PDF in un'immagine. (PNG, JPEG, GIF) home.pdfToImage.desc=Converti un PDF in un'immagine. (PNG, JPEG, GIF)
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=Organizza home.pdfOrganiser.title=Organizza
home.pdfOrganiser.desc=Rimuovi/Riordina le pagine in qualsiasi ordine. home.pdfOrganiser.desc=Rimuovi/Riordina le pagine in qualsiasi ordine.
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=Aggiungi Immagine home.addImage.title=Aggiungi Immagine
home.addImage.desc=Aggiungi un'immagine in un punto specifico del PDF (Work in progress) home.addImage.desc=Aggiungi un'immagine in un punto specifico del PDF (Work in progress)
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
home.watermark.title=Aggiungi Filigrana home.watermark.title=Aggiungi Filigrana
home.watermark.desc=Aggiungi una filigrana al tuo PDF. home.watermark.desc=Aggiungi una filigrana al tuo PDF.
##########################
home.remove-watermark.title=Rimuovi Filigrana ### TODO: Translate ###
home.remove-watermark.desc=Rimuovi la filigrana dal tuo PDF. ##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.permissions.title=Cambia Permessi home.permissions.title=Cambia Permessi
home.permissions.desc=Cambia i permessi del tuo PDF. home.permissions.desc=Cambia i permessi del tuo PDF.
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
home.removePages.title=Rimuovi home.removePages.title=Rimuovi
home.removePages.desc=Elimina alcune pagine dal PDF. home.removePages.desc=Elimina alcune pagine dal PDF.
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
home.addPassword.title=Aggiungi Password home.addPassword.title=Aggiungi Password
home.addPassword.desc=Crittografa il tuo PDF con una password. home.addPassword.desc=Crittografa il tuo PDF con una password.
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
home.removePassword.title=Rimuovi Password home.removePassword.title=Rimuovi Password
home.removePassword.desc=Rimuovi la password dal tuo PDF. home.removePassword.desc=Rimuovi la password dal tuo PDF.
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=Comprimi home.compressPdfs.title=Comprimi
home.compressPdfs.desc=Comprimi PDF per ridurne le dimensioni. home.compressPdfs.desc=Comprimi PDF per ridurne le dimensioni.
##########################
### TODO: Translate ###
##########################
compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=Modifica Proprietà home.changeMetadata.title=Modifica Proprietà
home.changeMetadata.desc=Modifica/Aggiungi/Rimuovi le proprietà di un documento PDF. home.changeMetadata.desc=Modifica/Aggiungi/Rimuovi le proprietà di un documento PDF.
##########################
### TODO: Translate ###
##########################
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=Converti file in PDF home.fileToPDF.title=Converti file in PDF
home.fileToPDF.desc=Converti quasi ogni file in PDF (DOCX, PNG, XLS, PPT, TXT e altro) home.fileToPDF.desc=Converti quasi ogni file in PDF (DOCX, PNG, XLS, PPT, TXT e altro)
##########################
### TODO: Translate ###
##########################
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=OCR / Pulisci scansioni home.ocr.title=OCR / Pulisci scansioni
home.ocr.desc=Pulisci scansioni ed estrai testo da immagini, convertendo le immagini in testo puro. home.ocr.desc=Pulisci scansioni ed estrai testo da immagini, convertendo le immagini in testo puro.
##########################
### TODO: Translate ###
##########################
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
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.
##########################
### TODO: Translate ###
##########################
extractImages.tags=picture,photo,save,archive,zip,capture,grab
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.
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=Da PDF a Word home.PDFToWord.title=Da PDF a Word
home.PDFToWord.desc=Converti un PDF nei formati Word (DOC, DOCX e ODT) home.PDFToWord.desc=Converti un PDF nei formati Word (DOC, DOCX e ODT)
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=Da PDF a presentazioni home.PDFToPresentation.title=Da PDF a presentazioni
home.PDFToPresentation.desc=Converti un PDF in presentazioni (PPT, PPTX and ODP) home.PDFToPresentation.desc=Converti un PDF in presentazioni (PPT, PPTX and ODP)
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=Da PDF a testo/RTF home.PDFToText.title=Da PDF a testo/RTF
home.PDFToText.desc=Converti un PDF in testo o RTF. home.PDFToText.desc=Converti un PDF in testo o RTF.
##########################
### TODO: Translate ###
##########################
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=Da PDF ad HTML home.PDFToHTML.title=Da PDF ad HTML
home.PDFToHTML.desc=Converti un PDF in HTML. home.PDFToHTML.desc=Converti un PDF in HTML.
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=Da PDF a XML home.PDFToXML.title=Da PDF a XML
home.PDFToXML.desc=Converti un PDF in XML. home.PDFToXML.desc=Converti un PDF in XML.
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=Trova/Dividi foto scansionate home.ScannerImageSplit.title=Trova/Dividi foto scansionate
home.ScannerImageSplit.desc=Estrai più foto da una singola foto o PDF. home.ScannerImageSplit.desc=Estrai più foto da una singola foto o PDF.
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title=Firma home.sign.title=Firma
home.sign.desc=Aggiungi una firma al PDF da disegno, testo o immagine. home.sign.desc=Aggiungi una firma al PDF da disegno, testo o immagine.
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=Appiattisci home.flatten.title=Appiattisci
home.flatten.desc=Rimuovi tutti gli elementi interattivi e moduli da un PDF. home.flatten.desc=Rimuovi tutti gli elementi interattivi e moduli da un PDF.
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title=Ripara home.repair.title=Ripara
home.repair.desc=Prova a riparare un PDF corrotto. home.repair.desc=Prova a riparare un PDF corrotto.
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
home.removeBlanks.title=Rimuovi pagine vuote home.removeBlanks.title=Rimuovi pagine vuote
home.removeBlanks.desc=Trova e rimuovi pagine vuote da un PDF. home.removeBlanks.desc=Trova e rimuovi pagine vuote da un PDF.
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title=Compara home.compare.title=Compara
home.compare.desc=Vedi e compara le differenze tra due PDF. home.compare.desc=Vedi e compara le differenze tra due PDF.
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
downloadPdf=Scarica PDF home.certSign.title=Sign with Certificate
text=Testo home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
font=Font ##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Multi-Page Layout
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
##########################
### TODO: Translate ###
##########################
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=Adjust page size/scale
home.scalePages.desc=Change the size/scale of page and/or its contents.
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
##########################
### TODO: Translate ###
##########################
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
##########################
### TODO: Translate ###
##########################
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
##########################
### TODO: Translate ###
##########################
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
##########################
### TODO: Translate ###
##########################
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
##########################
### TODO: Translate ###
##########################
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
##########################
### TODO: Translate ###
##########################
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
##########################
### TODO: Translate ###
##########################
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Multi Page Layout
pageLayout.header=Multi Page Layout
pageLayout.pagesPerSheet=Pages per sheet:
pageLayout.submit=Submit
#scalePages
scalePages.title=Adjust page-scale
scalePages.header=Adjust page-scale
scalePages.pageSize=Size of a page of the document.
scalePages.scaleFactor=Zoom level (crop) of a page.
scalePages.submit=Submit
#certSign
certSign.title=Firma del certificato
certSign.header=Firma un PDF con il tuo certificato (Lavoro in corso)
certSign.selectPDF=Seleziona un file PDF per la firma:
certSign.selectKey=Seleziona il file della tua chiave privata (formato PKCS#8, potrebbe essere .pem o .der):
certSign.selectCert=Seleziona il tuo file di certificato (formato X.509, potrebbe essere .pem o .der):
certSign.selectP12=Selezionare il file keystore PKCS#12 (.p12 o .pfx) (facoltativo, se fornito, dovrebbe contenere la chiave privata e il certificato):
certSign.certType=Tipo di certificato
certSign.password=Inserisci la tua password dell'archivio chiavi o della chiave privata (se presente):
certSign.showSig=Mostra firma
certSign.reason=Motivo
certSign.location=Posizione
certSign.name=Nome
certSign.submit=Firma PDF
#removeBlanks
removeBlanks.title=Rimuovi spazi vuoti removeBlanks.title=Rimuovi spazi vuoti
removeBlanks.header=Rimuovi pagine vuote removeBlanks.header=Rimuovi pagine vuote
removeBlanks.threshold=Soglia: removeBlanks.threshold=Soglia:
@@ -137,12 +478,16 @@ removeBlanks.whitePercent=Percentuale di bianco (%):
removeBlanks.whitePercentDesc=Percentuale della pagina che deve essere bianca per venire rimossa removeBlanks.whitePercentDesc=Percentuale della pagina che deve essere bianca per venire rimossa
removeBlanks.submit=Rimuovi removeBlanks.submit=Rimuovi
#compare
compare.title=Compara compare.title=Compara
compare.header=Compara PDF compare.header=Compara PDF
compare.document.1=Documento 1 compare.document.1=Documento 1
compare.document.2=Documento 2 compare.document.2=Documento 2
compare.submit=Compara compare.submit=Compara
#sign
sign.title=Firma sign.title=Firma
sign.header=Firma PDF sign.header=Firma PDF
sign.upload=Carica immagine sign.upload=Carica immagine
@@ -151,14 +496,20 @@ sign.text=Testo
sign.clear=Cancella sign.clear=Cancella
sign.add=Aggiungi sign.add=Aggiungi
#repair
repair.title=Ripara repair.title=Ripara
repair.header=Ripara PDF repair.header=Ripara PDF
repair.submit=Ripara repair.submit=Ripara
#flatten
flatten.title=Appiattisci flatten.title=Appiattisci
flatten.header=Appiattisci PDF flatten.header=Appiattisci PDF
flatten.submit=Appiattisci flatten.submit=Appiattisci
#ScannerImageSplit
ScannerImageSplit.selectText.1=Soglia angolo: ScannerImageSplit.selectText.1=Soglia angolo:
ScannerImageSplit.selectText.2=Imposta il minimo angolo richiesto perché l'immagine venga ruotata (default: 10). ScannerImageSplit.selectText.2=Imposta il minimo angolo richiesto perché l'immagine venga ruotata (default: 10).
ScannerImageSplit.selectText.3=Tolleranza: ScannerImageSplit.selectText.3=Tolleranza:
@@ -170,19 +521,6 @@ ScannerImageSplit.selectText.8=Imposta l'area minima del contorno di una foto
ScannerImageSplit.selectText.9=Spessore bordo: ScannerImageSplit.selectText.9=Spessore bordo:
ScannerImageSplit.selectText.10=Imposta lo spessore del bordo aggiunto o rimosso per prevenire bordi bianchi nel risultato (default: 1). ScannerImageSplit.selectText.10=Imposta lo spessore del bordo aggiunto o rimosso per prevenire bordi bianchi nel risultato (default: 1).
navbar.settings=Impostazioni
settings.title=Impostazioni
settings.update=Aggiornamento disponibile
settings.appVersion=Versione App:
settings.downloadOption.title=Scegli opzione di download (Per file singoli non compressi):
settings.downloadOption.1=Apri in questa finestra
settings.downloadOption.2=Apri in una nuova finestra
settings.downloadOption.3=Scarica file
settings.zipThreshold=Comprimi file in .zip quando il numero di download supera
#OCR #OCR
ocr.title=OCR / Pulisci scansioni ocr.title=OCR / Pulisci scansioni
@@ -204,7 +542,7 @@ ocr.credit=Questo servizio utilizza OCRmyPDF e Tesseract per l'OCR.
ocr.submit=Scansiona testo nel PDF con OCR ocr.submit=Scansiona testo nel PDF con OCR
#extractImages
extractImages.title=Estrai immagini extractImages.title=Estrai immagini
extractImages.header=Estrai immagini extractImages.header=Estrai immagini
extractImages.selectText=Seleziona il formato in cui salvare le immagini estratte extractImages.selectText=Seleziona il formato in cui salvare le immagini estratte
@@ -222,21 +560,20 @@ fileToPDF.submit=Converti in PDF
#compress #compress
compress.title=Comprimi compress.title=Comprimi
compress.header=Comprimi PDF compress.header=Comprimi PDF
compress.credit=Questo servizio utilizza OCRmyPDF per la compressione e ottimizzazione. compress.credit=Questo servizio utilizza Ghostscript per la compressione/ottimizzazione dei PDF.
compress.selectText.1=Livello di ottimizzazione: compress.selectText.1=Modalità manuale - Da 1 a 4
compress.selectText.2=0 (Nessuna compressione) compress.selectText.2=Livello di ottimizzazione:
compress.selectText.3=1 (Default, nessuna perdita di qualità) compress.selectText.3=4 (Terribile per le immagini di testo)
compress.selectText.4=2 (Perdita di qualità) compress.selectText.4=Modalità automatica - Regola automaticamente la qualità per ottenere le dimensioni esatte del PDF
compress.selectText.5=3 (Perdita di qualità, più aggressivo) compress.selectText.5=Dimensioni PDF previste (ad es. 25 MB, 10,8 MB, 25 KB)
compress.selectText.6=Visualizzazione rapida sul web (linearizza PDF)
compress.selectText.7=Attiva codifica JBIG2 (lossy)
compress.submit=Comprimi compress.submit=Comprimi
#Add image #Add image
addImage.title=Aggiungi Immagine addImage.title=Aggiungi Immagine
addImage.header=Aggiungi un'immagine ad un PDF. addImage.header=Aggiungi un'immagine ad un PDF
addImage.everyPage=Ogni pagina? addImage.everyPage=Ogni pagina?
addImage.upload=Aggiungi immagine
addImage.submit=Aggiungi immagine addImage.submit=Aggiungi immagine
@@ -245,11 +582,13 @@ merge.title=Unisci
merge.header=Unisci 2 o più PDF merge.header=Unisci 2 o più PDF
merge.submit=Unisci merge.submit=Unisci
#pdfOrganiser #pdfOrganiser
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
#multiTool #multiTool
multiTool.title=Multifunzione PDF multiTool.title=Multifunzione PDF
multiTool.header=Multifunzione PDF multiTool.header=Multifunzione PDF
@@ -261,6 +600,7 @@ 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
#rotate #rotate
rotate.title=Ruota PDF rotate.title=Ruota PDF
rotate.header=Ruota PDF rotate.header=Ruota PDF
@@ -268,9 +608,7 @@ rotate.selectAngle=Scegli angolo di rotazione (in multipli di 90 gradi):
rotate.submit=Ruota rotate.submit=Ruota
#merge
#split
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
@@ -285,7 +623,7 @@ split.splitPages=Inserisci pagine a cui dividere:
split.submit=Dividi split.submit=Dividi
#imageToPDF #merge
imageToPDF.title=Immagine a PDF imageToPDF.title=Immagine a PDF
imageToPDF.header=Immagine a PDF imageToPDF.header=Immagine a PDF
imageToPDF.submit=Converti imageToPDF.submit=Converti
@@ -295,6 +633,7 @@ imageToPDF.selectText.3=Logica multi-file (funziona solo se ci sono più immagin
imageToPDF.selectText.4=Unisci in un unico PDF imageToPDF.selectText.4=Unisci in un unico PDF
imageToPDF.selectText.5=Converti in PDF separati imageToPDF.selectText.5=Converti in PDF separati
#pdfToImage #pdfToImage
pdfToImage.title=PDF a immagine pdfToImage.title=PDF a immagine
pdfToImage.header=PDF a immagine pdfToImage.header=PDF a immagine
@@ -308,6 +647,7 @@ pdfToImage.grey=Scala di grigi
pdfToImage.blackwhite=Bianco e Nero (potresti perdere dettagli!) pdfToImage.blackwhite=Bianco e Nero (potresti perdere dettagli!)
pdfToImage.submit=Converti pdfToImage.submit=Converti
#addPassword #addPassword
addPassword.title=Aggiungi Password addPassword.title=Aggiungi Password
addPassword.header=Aggiungi password (crittografa) addPassword.header=Aggiungi password (crittografa)
@@ -324,8 +664,12 @@ addPassword.selectText.10=Previeni modifiche
addPassword.selectText.11=Previeni annotazioni addPassword.selectText.11=Previeni annotazioni
addPassword.selectText.12=Previeni stampa addPassword.selectText.12=Previeni stampa
addPassword.selectText.13=Previeni stampa in diversi formati addPassword.selectText.13=Previeni stampa in diversi formati
addPassword.selectText.14=Owner Password
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
addPassword.selectText.16=Restricts the opening of the document itself
addPassword.submit=Crittografa addPassword.submit=Crittografa
#watermark #watermark
watermark.title=Aggiungi Filigrana watermark.title=Aggiungi Filigrana
watermark.header=Aggiungi filigrana watermark.header=Aggiungi filigrana
@@ -338,6 +682,7 @@ watermark.selectText.6=spazio verticale (tra ogni filigrana):
watermark.selectText.7=Opacità (0% - 100%): watermark.selectText.7=Opacità (0% - 100%):
watermark.submit=Aggiungi Filigrana watermark.submit=Aggiungi Filigrana
#remove-watermark #remove-watermark
remove-watermark.title=Rimuovi Filigrana remove-watermark.title=Rimuovi Filigrana
remove-watermark.header=Rimuovi filigrana remove-watermark.header=Rimuovi filigrana
@@ -345,6 +690,7 @@ remove-watermark.selectText.1=Seleziona PDF da cui rimuovere la filigrana:
remove-watermark.selectText.2=Testo: remove-watermark.selectText.2=Testo:
remove-watermark.submit=Rimuovi Filigrana remove-watermark.submit=Rimuovi Filigrana
#Change permissions #Change permissions
permissions.title=Cambia Permessi permissions.title=Cambia Permessi
permissions.header=Cambia permessi permissions.header=Cambia permessi
@@ -361,6 +707,7 @@ permissions.selectText.9=Previeni stampa
permissions.selectText.10=Previeni stampa in diversi formati permissions.selectText.10=Previeni stampa in diversi formati
permissions.submit=Cambia Permessi permissions.submit=Cambia Permessi
#remove password #remove password
removePassword.title=Rimuovi Password removePassword.title=Rimuovi Password
removePassword.header=Rimuovi password (de-crittografa) removePassword.header=Rimuovi password (de-crittografa)
@@ -368,7 +715,9 @@ removePassword.selectText.1=Seleziona PDF da decrittare
removePassword.selectText.2=Password removePassword.selectText.2=Password
removePassword.submit=Rimuovi Password removePassword.submit=Rimuovi Password
changeMetadata.title=Cambia Proprietà
#changeMetadata
changeMetadata.title=Titolo:
changeMetadata.header=Cambia Proprietà changeMetadata.header=Cambia Proprietà
changeMetadata.selectText.1=Imposta i dati che vuoi cambiare changeMetadata.selectText.1=Imposta i dati che vuoi cambiare
changeMetadata.selectText.2=Cancella tutte le proprietà changeMetadata.selectText.2=Cancella tutte le proprietà
@@ -386,27 +735,30 @@ 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à
#xlsToPdf
xlsToPdf.title=Da Excel a PDF xlsToPdf.title=Da Excel a PDF
xlsToPdf.header=Da Excel a PDF xlsToPdf.header=Da Excel a PDF
xlsToPdf.selectText.1=Seleziona un foglio XLS o XLSX da convertire xlsToPdf.selectText.1=Seleziona un foglio XLS o XLSX da convertire
xlsToPdf.convert=Converti xlsToPdf.convert=Converti
#pdfToPDFA
pdfToPDFA.title=Da PDF a PDF/A pdfToPDFA.title=Da PDF a PDF/A
pdfToPDFA.header=Da PDF a PDF/A pdfToPDFA.header=Da PDF a PDF/A
pdfToPDFA.credit=Questo servizio utilizza 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
#PDFToWord
PDFToWord.title=Da PDF a Word PDFToWord.title=Da PDF a Word
PDFToWord.header=Da PDF a Word PDFToWord.header=Da PDF a Word
PDFToWord.selectText.1=Formato file di output PDFToWord.selectText.1=Formato file di output
PDFToWord.credit=Questo servizio utilizza LibreOffice per la conversione. PDFToWord.credit=Questo servizio utilizza LibreOffice per la conversione.
PDFToWord.submit=Converti PDFToWord.submit=Converti
#PDFToPresentation
PDFToPresentation.title=Da PDF a presentazione PDFToPresentation.title=Da PDF a presentazione
PDFToPresentation.header=Da PDF a presentazione PDFToPresentation.header=Da PDF a presentazione
PDFToPresentation.selectText.1=Formato file di output PDFToPresentation.selectText.1=Formato file di output
@@ -414,6 +766,7 @@ PDFToPresentation.credit=Questo servizio utilizza LibreOffice per la conversione
PDFToPresentation.submit=Converti PDFToPresentation.submit=Converti
#PDFToText
PDFToText.title=Da PDF a testo/RTF PDFToText.title=Da PDF a testo/RTF
PDFToText.header=Da PDF a testo/RTF PDFToText.header=Da PDF a testo/RTF
PDFToText.selectText.1=Formato file di output PDFToText.selectText.1=Formato file di output
@@ -421,11 +774,14 @@ PDFToText.credit=Questo servizio utilizza LibreOffice per la conversione.
PDFToText.submit=Converti PDFToText.submit=Converti
#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 LibreOffice per la conversione.
PDFToHTML.submit=Converti PDFToHTML.submit=Converti
#PDFToXML
PDFToXML.title=Da PDF a XML PDFToXML.title=Da PDF a XML
PDFToXML.header=Da PDF a XML PDFToXML.header=Da PDF a XML
PDFToXML.credit=Questo servizio utilizza LibreOffice per la conversione. PDFToXML.credit=Questo servizio utilizza LibreOffice per la conversione.

View File

@@ -0,0 +1,824 @@
###########
# Generic #
###########
# the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr
pdfPrompt=PDFを選択
multiPdfPrompt=PDFを選択 (2つ以上)
multiPdfDropPrompt=PDFを選択 (又はドラッグ&ドロップ)
imgPrompt=画像を選択
genericSubmit=送信
processTimeWarning=警告:この処理はファイルサイズによって1分程度かかることがあります
pageOrderPrompt=ページ順序 (ページ番号をカンマ区切り又は2n+1のような関数で入力):
goToPage=移動
true=True
false=False
unknown=不明
save=保存
close=閉じる
filesSelected=選択されたファイル
noFavourites=お気に入りはありません
bored=待ち時間が退屈
alphabet=\u30A2\u30EB\u30D5\u30A1\u30D9\u30C3\u30C8
downloadPdf=PDFをダウンロード
text=テキスト
font=フォント
selectFillter=-- 選択 --
pageNum=ページ番号
##########################
### TODO: Translate ###
##########################
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=PDFにパスワードが設定されてますが、パスワードが入力されてないか間違ってます。
#############
# NAVBAR #
#############
navbar.convert=変換
navbar.security=セキュリティ
navbar.other=その他
navbar.darkmode=ダークモード
navbar.pageOps=ページ操作
navbar.settings=設定
#############
# SETTINGS #
#############
settings.title=設定
settings.update=利用可能なアップデート
settings.appVersion=Appバージョン:
settings.downloadOption.title=ダウンロードオプション (zip以外の単一ファイル):
settings.downloadOption.1=同じウィンドウで開く
settings.downloadOption.2=新しいウィンドウで開く
settings.downloadOption.3=ファイルをダウンロード
settings.zipThreshold=このファイル数を超えたときにファイルを圧縮する
#############
# HOME-PAGE #
#############
home.desc=PDFのあらゆるニーズに対応するローカルホスティングされた総合窓口です。
home.multiTool.title=PDFマルチツール
home.multiTool.desc=ページの結合、回転、並べ替え、削除します。
##########################
### TODO: Translate ###
##########################
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move
home.merge.title=結合
home.merge.desc=複数のPDFを1つに結合します。
##########################
### TODO: Translate ###
##########################
merge.tags=merge,Page operations,Back end,server side
home.split.title=分割
home.split.desc=PDFを複数のドキュメントに分割します。
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=回転
home.rotate.desc=PDFを回転します。
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
home.imageToPdf.title=画像をPDFに変換
home.imageToPdf.desc=画像 (PNG, JPEG, GIF) をPDFに変換します。
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=PDFを画像に変換
home.pdfToImage.desc=PDFを画像 (PNG, JPEG, GIF) に変換します。
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=整理
home.pdfOrganiser.desc=ページの削除/並べ替えします。
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=画像の追加
home.addImage.desc=PDF上の任意の場所に画像を追加します。
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
home.watermark.title=透かしの追加
home.watermark.desc=PDFに独自の透かしを追加します。
##########################
### TODO: Translate ###
##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.permissions.title=権限の変更
home.permissions.desc=PDFの権限を変更します。
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
home.removePages.title=削除
home.removePages.desc=PDFから不要なページを削除します。
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
home.addPassword.title=パスワードの追加
home.addPassword.desc=PDFをパスワードで暗号化します。
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
home.removePassword.title=パスワードの削除
home.removePassword.desc=PDFからパスワードの削除します。
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=圧縮
home.compressPdfs.desc=PDFを圧縮してファイルサイズを小さくします。
##########################
### TODO: Translate ###
##########################
compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=メタデータの変更
home.changeMetadata.desc=PDFのメタデータを変更/削除/追加します。
##########################
### TODO: Translate ###
##########################
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=ファイルをPDFに変換
home.fileToPDF.desc=ほぼすべてのファイルをPDFに変換します。 (DOCX, PNG, XLS, PPT, TXTなど)
##########################
### TODO: Translate ###
##########################
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=OCR / クリーンアップ
home.ocr.desc=クリーンアップはPDF内の画像からテキストを検出してテキストとして再追加します。
##########################
### TODO: Translate ###
##########################
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
home.extractImages.title=画像の抽出
home.extractImages.desc=PDFからすべての画像を抽出してzipで保存します。
##########################
### TODO: Translate ###
##########################
extractImages.tags=picture,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=PDFをPDF/Aに変換
home.pdfToPDFA.desc=長期保存のためにPDFをPDF/Aに変換。
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=PDFをWordに変換
home.PDFToWord.desc=PDFをWord形式に変換します。 (DOC, DOCX および ODT)
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=PDFをプレゼンテーションに変換
home.PDFToPresentation.desc=PDFをプレゼンテーション形式に変換します。 (PPT, PPTX および ODP)
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=PDFをText/RTFに変換
home.PDFToText.desc=PDFをTextまたはRTF形式に変換します。
##########################
### TODO: Translate ###
##########################
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDFをHTMLに変換
home.PDFToHTML.desc=PDFをHTML形式に変換します。
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=PDFをXMLに変換
home.PDFToXML.desc=PDFをXML形式に変換します。
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=スキャンされた画像の検出/分割
home.ScannerImageSplit.desc=1枚の画像/PDFから複数の写真を分割します。
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title=署名
home.sign.desc=手書き、テキストまたは画像によってPDFに署名を追加します。
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=平坦化
home.flatten.desc=PDFからインタラクティブな要素とフォームをすべて削除します。
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title=修復
home.repair.desc=破損したPDFの修復を試みます。
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
home.removeBlanks.title=空白ページの削除
home.removeBlanks.desc=ドキュメントから空白ページを検出して削除します。
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title=比較
home.compare.desc=2つのPDFを比較して表示します。
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
home.certSign.title=証明書による署名
home.certSign.desc=証明書/キーを使用してPDFに署名します。 (PEM/P12)
##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=マルチページレイアウト
home.pageLayout.desc=PDFの複数のページを1ページに結合します。
##########################
### TODO: Translate ###
##########################
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=ページの縮尺の調整
home.scalePages.desc=ページやコンテンツの縮尺を変更します。
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
##########################
### TODO: Translate ###
##########################
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
pipeline.tags=automate,sequence,scripted,batch-process
##########################
### TODO: Translate ###
##########################
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
add-page-numbers.tags=paginate,label,organize,index
##########################
### TODO: Translate ###
##########################
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
auto-rename.tags=auto-detect,header-based,organize,relabel
##########################
### TODO: Translate ###
##########################
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
adjust-contrast.tags=color-correction,tune,modify,enhance
##########################
### TODO: Translate ###
##########################
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
crop.tags=trim,shrink,edit,shape
##########################
### TODO: Translate ###
##########################
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
##########################
### TODO: Translate ###
##########################
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
##########################
### TODO: Translate ###
##########################
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
##########################
### TODO: Translate ###
##########################
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
##########################
### TODO: Translate ###
##########################
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
##########################
### TODO: Translate ###
##########################
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
##########################
### TODO: Translate ###
##########################
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
##########################
### TODO: Translate ###
##########################
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
##########################
### TODO: Translate ###
##########################
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
##########################
### TODO: Translate ###
##########################
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
##########################
### TODO: Translate ###
##########################
pipeline.title=Pipeline
#pageLayout
pageLayout.title=マルチページレイアウト
pageLayout.header=マルチページレイアウト
pageLayout.pagesPerSheet=1枚あたりのページ数:
pageLayout.submit=送信
#scalePages
scalePages.title=ページの縮尺の調整
scalePages.header=ページの縮尺の調整
scalePages.pageSize=1ページのサイズ
scalePages.scaleFactor=1ページの拡大レベル (トリミング)。
scalePages.submit=送信
#certSign
certSign.title=証明書による署名
certSign.header=証明書を使用してPDFに署名します。 (進行中)
certSign.selectPDF=署名するPDFファイルを選択:
certSign.selectKey=秘密キーファイルを選択 (PKCS#8形式、.pemまたは.der) :
certSign.selectCert=証明書ファイルを選択 (X.509形式、.pemまたは.der) :
certSign.selectP12=PKCS#12キーストアファイルを選択 (.p12または.pfx) (オプション。指定する場合は秘密キーと証明書が含まれている必要があります。):
certSign.certType=証明書の種類
certSign.password=キーストアまたは秘密キーのパスワードを入力 (ある場合) :
certSign.showSig=署名を表示
certSign.reason=理由
certSign.location=場所
certSign.name=名前
certSign.submit=PDFに署名
#removeBlanks
removeBlanks.title=空白の削除
removeBlanks.header=空白ページの削除
removeBlanks.threshold=しきい値 :
removeBlanks.thresholdDesc=白色ピクセルの白さを決めるためのしきい値
removeBlanks.whitePercent=白比率
removeBlanks.whitePercentDesc=削除するページの白の割合
removeBlanks.submit=空白ページの削除
#compare
compare.title=比較
compare.header=PDFの比較
compare.document.1=ドキュメント 1
compare.document.2=ドキュメント 2
compare.submit=比較
#sign
sign.title=署名
sign.header=PDFに署名
sign.upload=画像をアップロード
sign.draw=署名を書く
sign.text=テキスト入力
sign.clear=クリア
sign.add=追加
#repair
repair.title=修復
repair.header=PDFを修復
repair.submit=修復
#flatten
flatten.title=平坦化
flatten.header=PDFを平坦化する
flatten.submit=平坦化
#ScannerImageSplit
ScannerImageSplit.selectText.1=角度のしきい値:
ScannerImageSplit.selectText.2=画像を回転させるために必要な絶対角度の最小値を設定 (初期値:10)。
ScannerImageSplit.selectText.3=許容範囲:
ScannerImageSplit.selectText.4=推定された背景色周辺のカラーバリエーションの範囲を決定 (初期値:30)。
ScannerImageSplit.selectText.5=最小面積:
ScannerImageSplit.selectText.6=画像の最小面積のしきい値を設定 (初期値:10000)。
ScannerImageSplit.selectText.7=最小輪郭面積:
ScannerImageSplit.selectText.8=画像の最小の輪郭面積のしきい値を設定。
ScannerImageSplit.selectText.9=境界線サイズ:
ScannerImageSplit.selectText.10=出力に白い縁取りが出ないように追加・削除される境界線の大きさを設定 (初期値:1)。
#OCR
ocr.title=OCR / クリーンアップ
ocr.header=クリーンアップ / OCR (光学式文字認識)
ocr.selectText.1=PDF内で検出される言語を選択 (リストされているものは現在検出されているものです):
ocr.selectText.2=OCR処理されたPDFと一緒に、OCRしたテキストを含むテキストファイルを作成する
ocr.selectText.3=斜めにスキャンされたページを回転させて修正する
ocr.selectText.4=ページをきれいにして背景ノイズの中からテキストを検出しにくくする。(出力は変わりません)
ocr.selectText.5=ページをきれいにして背景ノイズの中からテキストを検出しにくくし、出力はクリーンアップを維持する。
ocr.selectText.6=インタラクティブなテキストを含むページを無視し、画像ページのみをOCRする
ocr.selectText.7=強制OCR、全てのページで元のテキスト要素を全て削除してOCRする
ocr.selectText.8=Normal (PDFにテキストが含まれている場合はエラーになります。)
ocr.selectText.9=追加設定
ocr.selectText.10=OCRモード
ocr.selectText.11=OCR後に画像を削除する (すべての画像を削除します。変換ステップの一部である場合にのみ有効です)。
ocr.selectText.12=レンダリングタイプ (高度)
ocr.help=他の言語でこれを使用する方法やDocker以外で使用する方法についてはこのドキュメントをお読みください。
ocr.credit=本サービスにはOCRにOCRmyPDFとTesseractを使用しています。
ocr.submit=OCRでPDFを処理する
#extractImages
extractImages.title=画像の抽出
extractImages.header=画像の抽出
extractImages.selectText=抽出した画像のフォーマットを選択
extractImages.submit=抽出
#File to PDF
fileToPDF.title=ファイルをPDFに変換
fileToPDF.header=あらゆるファイルをPDFに変換
fileToPDF.credit=本サービスはファイル変換にLibreOfficeとUnoconvを使用しています。
fileToPDF.supportedFileTypes=サポートされるファイル形式には以下が含まれますが、完全な更新リストについてはLibreOfficeのドキュメントを参照してください。
fileToPDF.submit=PDFを変換
#compress
compress.title=圧縮
compress.header=PDFを圧縮
compress.credit=本サービスはPDFの圧縮/最適化にGhostscriptを使用しています。
compress.selectText.1=手動モード - 1 から 4
compress.selectText.2=品質レベル:
compress.selectText.3=4 (テキスト画像は最悪)
compress.selectText.4=自動モード - PDFを正確なサイズにするために品質を自動調整する。
compress.selectText.5=PDFサイズ (例 25MB, 10.8MB, 25KB)
compress.submit=圧縮
#Add image
addImage.title=画像の追加
addImage.header=PDFに画像を追加
addImage.everyPage=全ページ?
addImage.upload=画像の追加
addImage.submit=画像の追加
#merge
merge.title=結合
merge.header=複数のPDFを結合 (2ファイル以上)
merge.submit=結合
#pdfOrganiser
pdfOrganiser.title=整理
pdfOrganiser.header=PDFページの整理
pdfOrganiser.submit=ページの整理
#multiTool
multiTool.title=PDFマルチツール
multiTool.header=PDFマルチツール
#pageRemover
pageRemover.title=ページ削除
pageRemover.header=PDFページ削除
pageRemover.pagesToDelete=削除するページ (ページ番号のカンマ区切りリストを入力してください):
pageRemover.submit=ページ削除
#rotate
rotate.title=PDFの回転
rotate.header=PDFの回転
rotate.selectAngle=回転角度を選択 (90度の倍数):
rotate.submit=回転
#merge
split.title=PDFの分割
split.header=PDFの分割
split.desc.1=選択する番号は分割するページ番号です。
split.desc.2=したがって、1,3,7-8を選択すると、10ページのドキュメントが以下のように6つのPDFに分割されることになります。
split.desc.3=ドキュメント #1: ページ 1
split.desc.4=ドキュメント #2: ページ 2, 3
split.desc.5=ドキュメント #3: ページ 4, 5, 6
split.desc.6=ドキュメント #4: ページ 7
split.desc.7=ドキュメント #5: ページ 8
split.desc.8=ドキュメント #6: ページ 9, 10
split.splitPages=分割するページ番号を入力:
split.submit=分割
#merge
imageToPDF.title=画像をPDFに変換
imageToPDF.header=画像をPDFに変換
imageToPDF.submit=変換
imageToPDF.selectText.1=フィットするように引き伸ばす
imageToPDF.selectText.2=PDFの自動回転
imageToPDF.selectText.3=マルチファイルの処理 (複数の画像を操作する場合に有効になります)
imageToPDF.selectText.4=1つのPDFに結合
imageToPDF.selectText.5=個別のPDFに変換
#pdfToImage
pdfToImage.title=PDFを画像に変換
pdfToImage.header=PDFを画像に変換
pdfToImage.selectText=画像の形式
pdfToImage.singleOrMultiple=画像出力タイプ
pdfToImage.single=単一の大きな画像
pdfToImage.multi=複数の画像
pdfToImage.colorType=カラーモード
pdfToImage.color=カラー
pdfToImage.grey=グレースケール
pdfToImage.blackwhite=白黒 (データが失われる可能性があります!)
pdfToImage.submit=変換
#addPassword
addPassword.title=パスワードの追加
addPassword.header=パスワードの追加 (暗号化)
addPassword.selectText.1=暗号化するPDFを選択
addPassword.selectText.2=ユーザーパスワード
addPassword.selectText.3=暗号化キーの長さ
addPassword.selectText.4=値が大きいほど強力ですが、値が小さいほど互換性が高くなります。
addPassword.selectText.5=権限の設定 (所有者パスワードとの併用をおすすめします)
addPassword.selectText.6=ドキュメントの組立を禁止
addPassword.selectText.7=コンテンツの抽出を禁止
addPassword.selectText.8=アクセシビリティのための抽出を禁止
addPassword.selectText.9=フォームへの入力を禁止
addPassword.selectText.10=変更を禁止
addPassword.selectText.11=注釈の変更を禁止
addPassword.selectText.12=印刷を禁止
addPassword.selectText.13=異なる形式の印刷を禁止
addPassword.selectText.14=所有者パスワード
addPassword.selectText.15=ドキュメントを開いた後に実行できる操作を制限します (すべてのリーダーでサポートされているわけではありません)
addPassword.selectText.16=ドキュメントを開くことを制限します
addPassword.submit=暗号化
#watermark
watermark.title=透かしの追加
watermark.header=透かしの追加
watermark.selectText.1=透かしを追加するPDFを選択:
watermark.selectText.2=透かしのテキスト:
watermark.selectText.3=文字サイズ:
watermark.selectText.4=回転 (0-360):
watermark.selectText.5=幅スペース (各透かし間の水平方向のスペース):
watermark.selectText.6=高さスペース (各透かし間の垂直方向のスペース):
watermark.selectText.7=不透明度 (0% - 100%):
watermark.submit=透かしを追加
#remove-watermark
remove-watermark.title=透かしの削除
remove-watermark.header=透かしの削除
remove-watermark.selectText.1=透かしを削除するPDFを選択:
remove-watermark.selectText.2=透かしのテキスト:
remove-watermark.submit=透かしを削除
#Change permissions
permissions.title=権限の変更
permissions.header=権限の変更
permissions.warning=警告、これらの権限を変更できないようにするため、パスワードの追加ページでパスワードを設定することを推奨します。
permissions.selectText.1=権限を変更するPDFを選択
permissions.selectText.2=権限の設定
permissions.selectText.3=ドキュメントの組立を禁止
permissions.selectText.4=コンテンツの抽出を禁止
permissions.selectText.5=アクセシビリティのための抽出を禁止
permissions.selectText.6=フォームへの入力を禁止
permissions.selectText.7=変更を禁止
permissions.selectText.8=注釈の変更を禁止
permissions.selectText.9=印刷を禁止
permissions.selectText.10=異なる形式の印刷を禁止
permissions.submit=変更
#remove password
removePassword.title=パスワードの削除
removePassword.header=パスワードの削除 (復号化)
removePassword.selectText.1=復号化するPDFを選択
removePassword.selectText.2=パスワード
removePassword.submit=削除
#changeMetadata
changeMetadata.title=タイトル:
changeMetadata.header=メタデータの変更
changeMetadata.selectText.1=変更したい変数を編集してください
changeMetadata.selectText.2=すべてのメタデータを削除
changeMetadata.selectText.3=カスタムメタデータを表示
changeMetadata.author=著者:
changeMetadata.creationDate=作成日 (yyyy/MM/dd HH:mm:ss):
changeMetadata.creator=作成者:
changeMetadata.keywords=キーワード:
changeMetadata.modDate=変更日 (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=プロデューサー:
changeMetadata.subject=主題:
changeMetadata.title=タイトル:
changeMetadata.trapped=トラッピング:
changeMetadata.selectText.4=その他のメタデータ:
changeMetadata.selectText.5=カスタムメタデータの追加
changeMetadata.submit=変更
#xlsToPdf
xlsToPdf.title=ExcelをPDFに変換
xlsToPdf.header=ExcelをPDFに変換
xlsToPdf.selectText.1=変換するXLSまたはXLSX Execlシートを選択
xlsToPdf.convert=変換
#pdfToPDFA
pdfToPDFA.title=PDFをPDF/Aに変換
pdfToPDFA.header=PDFをPDF/Aに変換
pdfToPDFA.credit=本サービスはPDF/Aの変換にOCRmyPDFを使用しています。
pdfToPDFA.submit=変換
#PDFToWord
PDFToWord.title=PDFをWordに変換
PDFToWord.header=PDFをWordに変換
PDFToWord.selectText.1=出力ファイル形式
PDFToWord.credit=本サービスはファイル変換にLibreOfficeを使用しています。
PDFToWord.submit=変換
#PDFToPresentation
PDFToPresentation.title=PDFをプレゼンテーションに変換
PDFToPresentation.header=PDFをプレゼンテーションに変換
PDFToPresentation.selectText.1=出力ファイル形式
PDFToPresentation.credit=本サービスはファイル変換にLibreOfficeを使用しています。
PDFToPresentation.submit=変換
#PDFToText
PDFToText.title=PDFをText/RTFに変換
PDFToText.header=PDFをText/RTFに変換
PDFToText.selectText.1=出力ファイル形式
PDFToText.credit=本サービスはファイル変換にLibreOfficeを使用しています。
PDFToText.submit=変換
#PDFToHTML
PDFToHTML.title=PDFをHTMLに変換
PDFToHTML.header=PDFをHTMLに変換
PDFToHTML.credit=本サービスはファイル変換にLibreOfficeを使用しています。
PDFToHTML.submit=変換
#PDFToXML
PDFToXML.title=PDFをXMLに変換
PDFToXML.header=PDFをXMLに変換
PDFToXML.credit=本サービスはファイル変換にLibreOfficeを使用しています。
PDFToXML.submit=変換

View File

@@ -0,0 +1,788 @@
###########
# Generic #
###########
# the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr
pdfPrompt=PDF 선택
multiPdfPrompt=PDF 선택(2개 이상)
multiPdfDropPrompt=사용할 모든 PDF를 선택(또는 드래그 앤 드롭)하세요
imgPrompt=이미지 선택
genericSubmit=제출
processTimeWarning=경고: 파일 크기에 따라 1분 정도 소요될 수 있습니다
pageOrderPrompt=페이지 순서(쉼표로 구분된 페이지 번호 목록 입력):
goToPage=이동
true=
false=거짓
unknown=알 수 없음
save=저장
close=닫기
filesSelected=개 파일 선택됨
noFavourites=즐겨찾기 없음
bored=기다리는 게 지루하신가요?
alphabet=\uC54C\uD30C\uBCB3
downloadPdf=PDF 다운로드
text=텍스트
font=폰트
selectFillter=-- 선택 --
pageNum=페이지 번호
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
#############
# NAVBAR #
#############
navbar.convert=변환
navbar.security=보안
navbar.other=기타
navbar.darkmode=다크 모드
navbar.pageOps=Page Operations
navbar.settings=설정
#############
# SETTINGS #
#############
settings.title=설정
settings.update=업데이트 가능
settings.appVersion=앱 버전:
settings.downloadOption.title=다운로드 옵션 선택 (zip 파일이 아닌 단일 파일 다운로드 시):
settings.downloadOption.1=현재 창에서 열기
settings.downloadOption.2=새 창에서 열기
settings.downloadOption.3=다운로드
settings.zipThreshold=다운로드한 파일 수가 초과된 경우 파일 압축하기
#############
# HOME-PAGE #
#############
home.desc=당신의 PDF에 필요한 모든 것이 있는 로컬 호스팅된 원스톱 숍입니다.
home.multiTool.title=PDF 멀티 툴
home.multiTool.desc=페이지를 병합, 회전, 재배열, 제거하세요.
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
home.merge.title=병합
home.merge.desc=여러 개의 PDF를 쉽게 하나로 합치세요.
merge.tags=merge,Page operations,Back end,server side
home.split.title=분할
home.split.desc=PDF를 여러 개의 문서로 분할하세요.
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=회전
home.rotate.desc=PDF를 쉽게 회전하세요.
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
home.imageToPdf.title=Image to PDF
home.imageToPdf.desc=이미지(PNG, JPEG, GIF)를 PDF로 변환하세요.
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=PDF to Image
home.pdfToImage.desc=PDF를 이미지(PNG, JPEG, GIF)로 변환하세요.
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=정렬
home.pdfOrganiser.desc=페이지를 원하는 순서대로 제거/재배열하세요.
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=사진 추가
home.addImage.desc=PDF의 설정된 위치에 이미지를 추가하세요.(개발 중)
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
home.watermark.title=워터마크 추가
home.watermark.desc=PDF 문서에 사용자 지정 워터마크를 추가하세요.
##########################
### TODO: Translate ###
##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.permissions.title=권한 변경
home.permissions.desc=PDF 문서의 권한을 변경하세요.
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
home.removePages.title=제거
home.removePages.desc=PDF 문서에서 원치 않는 페이지를 제거하세요.
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
home.addPassword.title=비밀번호 추가
home.addPassword.desc=PDF 문서를 비밀번호로 암호화하세요.
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
home.removePassword.title=비밀번호 제거
home.removePassword.desc=PDF 문서에서 비밀번호를 제거하세요.
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=압축
home.compressPdfs.desc=파일 크기를 줄이기 위해 PDF 문서를 압축하세요.
##########################
### TODO: Translate ###
##########################
compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=메타데이터 변경
home.changeMetadata.desc=PDF 문서의 메타데이터를 수정/제거/추가하세요.
##########################
### TODO: Translate ###
##########################
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=파일을 PDF로 변환
home.fileToPDF.desc=거의 모든 파일을 PDF로 변환하세요(DOCX, PNG, XLS, PPT, TXT 등)
##########################
### TODO: Translate ###
##########################
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=OCR / 깔끔하게 스캔
home.ocr.desc=깔끔하게 스캔하고 PDF 내의 이미지에서 텍스트를 감지하여 텍스트로 다시 추가합니다.
##########################
### TODO: Translate ###
##########################
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
home.extractImages.title=이미지 추출
home.extractImages.desc=PDF에서 모든 이미지를 추출하여 zip으로 저장합니다.
##########################
### TODO: Translate ###
##########################
extractImages.tags=picture,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=PDF to PDF/A
home.pdfToPDFA.desc=장기 보관을 위해 PDF를 PDF/A 문서로 변환하세요.
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=PDF to Word
home.PDFToWord.desc=PDF를 Word 형식으로 변환하세요. (DOC, DOCX, ODT)
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=PDF to 프리젠테이션
home.PDFToPresentation.desc=PDF를 프리젠테이션 형식으로 변환하세요. (PPT, PPTX, ODP)
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=PDF to 텍스트/RTF
home.PDFToText.desc=PDF를 텍스트 또는 RTF 형식으로 변환하세요.
##########################
### TODO: Translate ###
##########################
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDF to HTML
home.PDFToHTML.desc=PDF를 HTML 형식으로 변환하세요.
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=PDF to XML
home.PDFToXML.desc=PDF를 XML 형식으로 변환하세요.
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=스캔한 사진 감지/분할
home.ScannerImageSplit.desc=사진/PDF 내에서 여러 장의 사진을 분할합니다.
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title=서명
home.sign.desc=PDF에 그림, 텍스트, 이미지로 서명을 추가합니다.
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=합치기
home.flatten.desc=PDF에서 모든 인터랙션 요소와 양식을 제거하세요.
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title=복구
home.repair.desc=손상된 PDF의 복구를 시도합니다.
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
home.removeBlanks.title=빈 페이지 제거
home.removeBlanks.desc=문서에서 빈 페이지를 감지하고 제거합니다.
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title=비교
home.compare.desc=2개의 PDF 문서를 비교하고 차이를 표시합니다.
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
home.certSign.title=인증서로 서명
home.certSign.desc=PDF에 인증서/키로 서명합니다. (PEM/P12)
##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Multi-Page Layout
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
##########################
### TODO: Translate ###
##########################
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=Adjust page size/scale
home.scalePages.desc=Change the size/scale of page and/or its contents.
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
##########################
### TODO: Translate ###
##########################
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
##########################
### TODO: Translate ###
##########################
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
##########################
### TODO: Translate ###
##########################
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
##########################
### TODO: Translate ###
##########################
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
##########################
### TODO: Translate ###
##########################
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
##########################
### TODO: Translate ###
##########################
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
##########################
### TODO: Translate ###
##########################
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Multi Page Layout
pageLayout.header=Multi Page Layout
pageLayout.pagesPerSheet=Pages per sheet:
pageLayout.submit=Submit
#scalePages
scalePages.title=Adjust page-scale
scalePages.header=Adjust page-scale
scalePages.pageSize=Size of a page of the document.
scalePages.scaleFactor=Zoom level (crop) of a page.
scalePages.submit=Submit
#certSign
certSign.title=인증서로 서명
certSign.header=PDF에 당신의 인증서로 서명하세요 (개발 중)
certSign.selectPDF=서명할 PDF를 선택하세요:
certSign.selectKey=개인 키 파일을 선택하세요 (PKCS#8 형식, .pem 또는 .der):
certSign.selectCert=인증서 파일을 선택하세요 (X.509 형식, .pem 또는 .der):
certSign.selectP12=PKCS#12 키 저장소 파일을 선택하세요 (.p12 or .pfx) (선택 사항, 선택할 경우, 개인 키와 인증서를 포함하고 있어야 합니다):
certSign.certType=인증서 유형
certSign.password=키 저장소 또는 개인 키 비밀번호를 입력하세요 (있는 경우):
certSign.showSig=서명 보기
certSign.reason=이유
certSign.location=위치
certSign.name=이름
certSign.submit=PDF 서명
#removeBlanks
removeBlanks.title=빈 페이지 제거
removeBlanks.header=빈 페이지 제거
removeBlanks.threshold=임계값:
removeBlanks.thresholdDesc=흰색 픽셀이 얼마나 흰색이어야 하는지를 결정하는 임계값
removeBlanks.whitePercent=흰색 비율 (%):
removeBlanks.whitePercentDesc=제거될 페이지의 흰색 픽셀 비율
removeBlanks.submit=빈 페이지 제거
#compare
compare.title=비교
compare.header=PDF 비교
compare.document.1=문서 1
compare.document.2=문서 2
compare.submit=비교
#sign
sign.title=서명
sign.header=PDF에 서명
sign.upload=이미지 업로드
sign.draw=서명 그리기
sign.text=텍스트 입력
sign.clear=초기화
sign.add=추가
#repair
repair.title=복구
repair.header=PDF 복구
repair.submit=복구
#flatten
flatten.title=합치기
flatten.header=PDF 합치기
flatten.submit=합치기
#ScannerImageSplit
ScannerImageSplit.selectText.1=각도 임계값:
ScannerImageSplit.selectText.2=이미지를 회전하는 데 필요한 최소 절대 각도를 설정합니다(기본값: 10).
ScannerImageSplit.selectText.3=오차 범위:
ScannerImageSplit.selectText.4=예상 배경색 주변의 색상 변화 범위를 결정합니다(기본값: 30).
ScannerImageSplit.selectText.5=최소 면적:
ScannerImageSplit.selectText.6=사진의 최소 면적 임계값을 설정합니다 (기본값: 10000).
ScannerImageSplit.selectText.7=최소 윤곽 영역:
ScannerImageSplit.selectText.8=사진의 최소 윤곽선 영역 임계값을 설정합니다.
ScannerImageSplit.selectText.9=테두리 크기:
ScannerImageSplit.selectText.10=출력에서 흰색 테두리를 방지하기 위해 추가 및 제거되는 테두리의 크기를 설정합니다(기본값: 1).
#OCR
ocr.title=OCR / 깔끔하게 스캔
ocr.header=깔끔하게 스캔 / OCR (광학 문자 인식)
ocr.selectText.1=PDF에서 감지할 언어를 선택하십시오 (현재 감지된 언어 목록):
ocr.selectText.2=OCR 텍스트가 포함된 텍스트 파일을 OCR 처리된 PDF와 함께 생성
ocr.selectText.3=비뚤어진 각도로 스캔한 페이지를 다시 제자리로 돌려 올바른 페이지로 스캔
ocr.selectText.4=페이지를 깨끗하게 정리하여 OCR이 배경의 이물질에서 텍스트를 찾을 가능성 줄이기 (출력 변경 없음)
ocr.selectText.5=페이지를 깨끗하게 정리하여 OCR이 배경의 이물질에서 텍스트를 찾을 가능성 줄이기 (출력 변경)
ocr.selectText.6=인터랙티브 텍스트가 있는 페이지는 건너뛰고 이미지만 OCR
ocr.selectText.7=OCR 강제(모든 페이지에서 원본 텍스트 제거하고 OCR로 대체)
ocr.selectText.8=일반 (PDF에 텍스트가 포함된 경우 오류 발생)
ocr.selectText.9=추가 설정
ocr.selectText.10=OCR 모드
ocr.selectText.11=OCR 후 이미지 제거(모든 이미지 제거, 변환 단계의 일부인 경우에만 유용)
ocr.selectText.12=렌더 유형(고급)
ocr.help=다른 언어 또는 Docker에 포함되지 않은 언어에 대해 사용하는 방법에 대해서는 이 문서를 참조하세요.
ocr.credit=이 서비스는 OCR에 OCRmyPDF와 Tesseract를 사용합니다.
ocr.submit=OCR로 PDF 처리
#extractImages
extractImages.title=이미지 추출
extractImages.header=이미지 추출
extractImages.selectText=추출된 이미지를 변환할 이미지 형식을 선택하세요.
extractImages.submit=추출
#File to PDF
fileToPDF.title=File to PDF
fileToPDF.header=모든 파일을 PDF로 변환
fileToPDF.credit=이 서비스는 파일 변환에 LibreOffice와 Unoconv를 사용합니다.
fileToPDF.supportedFileTypes=지원되는 파일 형식은 아래와 같지만, 지원되는 형식의 전체 업데이트 목록은 LibreOffice 설명서를 참조하세요.
fileToPDF.submit=PDF로 변환
#compress
compress.title=압축
compress.header=PDF 압축
compress.credit=이 서비스는 PDF 압축/최적화를 위해 Ghostscript를 사용합니다.
compress.selectText.1=수동 모드 - 1에서 4
compress.selectText.2=최적화 수준:
compress.selectText.3=4 (텍스트 이미지에 적합하지 않음)
compress.selectText.4=자동 - 정확한 크기의 PDF를 얻기 위해 품질 자동 조정
compress.selectText.5=예상 PDF 크기 (예: 25MB, 10.8MB, 25KB)
compress.submit=압축
#Add image
addImage.title=이미지 추가
addImage.header=PDF에 이미지 추가
addImage.everyPage=모든 페이지에 적용
addImage.upload=이미지 추가
addImage.submit=이미지 추가
#merge
merge.title=병합
merge.header=여러 개의 PDF 병합 (2개 이상)
merge.submit=병합
#pdfOrganiser
pdfOrganiser.title=페이지 정렬 도구
pdfOrganiser.header=PDF 페이지 정렬
pdfOrganiser.submit=페이지 재정렬
#multiTool
multiTool.title=PDF 멀티 툴
multiTool.header=PDF 멀티 툴
#pageRemover
pageRemover.title=페이지 제거 도구
pageRemover.header=PDF 페이지 제거 도구
pageRemover.pagesToDelete=제거할 페이지 (쉼표로 구분된 페이지 번호 입력):
pageRemover.submit=페이지 제거
#rotate
rotate.title=PDF 회전
rotate.header=PDF 회전
rotate.selectAngle=회전 각도 선택 (90도의 배수로):
rotate.submit=회전
#merge
split.title=PDF 분할
split.header=PDF 분할
split.desc.1=선택한 번호는 분할할 페이지 번호입니다.
split.desc.2=예를 들어, 1,3,7-8을 선택하면 10페이지 문서를 아래와 같이 6개의 별도의 PDF로 분할하게 됩니다.
split.desc.3=문서 #1: 페이지 1
split.desc.4=문서 #2: 페이지 2, 3
split.desc.5=문서 #3: 페이지 4, 5, 6
split.desc.6=문서 #4: 페이지 7
split.desc.7=문서 #5: 페이지 8
split.desc.8=문서 #6: 페이지 9, 10
split.splitPages=분할할 페이지 입력:
split.submit=분할
#merge
imageToPDF.title=이미지를 PDF로 변환
imageToPDF.header=이미지를 PDF로 변환
imageToPDF.submit=변환하기
imageToPDF.selectText.1=맞춤 크기로 늘리기
imageToPDF.selectText.2=PDF 자동 회전
imageToPDF.selectText.3=다중 파일 로직 (여러 이미지로 작업하는 경우에만 활성화됨)
imageToPDF.selectText.4=단일 PDF로 병합
imageToPDF.selectText.5=별도의 PDF로 변환
#pdfToImage
pdfToImage.title=PDF를 이미지로 변환
pdfToImage.header=PDF를 이미지로 변환
pdfToImage.selectText=이미지 형식
pdfToImage.singleOrMultiple=이미지 결과 유형
pdfToImage.single=단일 큰 이미지
pdfToImage.multi=여러 이미지
pdfToImage.colorType=색상 유형
pdfToImage.color=컬러
pdfToImage.grey=그레이스케일
pdfToImage.blackwhite=흑백 (데이터 손실 가능성 있음!)
pdfToImage.submit=변환하기
#addPassword
addPassword.title=암호 추가
addPassword.header=암호 추가 (암호화)
addPassword.selectText.1=암호화할 PDF 선택
addPassword.selectText.2=암호
addPassword.selectText.3=암호화 키 길이
addPassword.selectText.4=값이 높을수록 강력하지만, 값이 낮을수록 호환성이 더 좋습니다.
addPassword.selectText.5=설정할 권한
addPassword.selectText.6=문서 조립 방지
addPassword.selectText.7=콘텐츠 추출 방지
addPassword.selectText.8=접근성을 위한 추출 방지
addPassword.selectText.9=양식 작성 방지
addPassword.selectText.10=수정 방지
addPassword.selectText.11=주석 수정 방지
addPassword.selectText.12=인쇄 방지
addPassword.selectText.13=다른 형식으로 인쇄 방<>
addPassword.selectText.14=Owner Password
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
addPassword.selectText.16=Restricts the opening of the document itself<6C>
addPassword.submit=암호화
#watermark
watermark.title=워터마크 추가
watermark.header=워터마크 추가
watermark.selectText.1=워터마크를 추가할 PDF 선택:
watermark.selectText.2=워터마크 텍스트:
watermark.selectText.3=폰트 크기:
watermark.selectText.4=회전 각도 (0-360):
watermark.selectText.5=가로 간격 (각 워터마크 사이의 가로 공간):
watermark.selectText.6=세로 간격 (각 워터마크 사이의 세로 공간):
watermark.selectText.7=투명도 (0% - 100%):
watermark.submit=워터마크 추가
#remove-watermark
remove-watermark.title=워터마크 제거
remove-watermark.header=워터마크 제거
remove-watermark.selectText.1=워터마크를 제거할 PDF 선택:
remove-watermark.selectText.2=워터마크 텍스트:
remove-watermark.submit=워터마크 제거
#Change permissions
permissions.title=권한 변경
permissions.header=권한 변경
permissions.warning=이 권한을 변경할 수 없도록 하기 위해서는 암호를 사용하여 비밀번호 추가 페이지에서 설정하는 것이 좋습니다.
permissions.selectText.1=권한을 변경할 PDF 선택
permissions.selectText.2=설정할 권한
permissions.selectText.3=문서 조립 방지
permissions.selectText.4=콘텐츠 추출 방지
permissions.selectText.5=접근성을 위한 추출 방지
permissions.selectText.6=양식 작성 방지
permissions.selectText.7=수정 방지
permissions.selectText.8=주석 수정 방지
permissions.selectText.9=인쇄 방지
permissions.selectText.10=다른 형식으로 인쇄 방지
permissions.submit=변경
#remove password
removePassword.title=암호 제거
removePassword.header=암호 제거 (복호화)
removePassword.selectText.1=복호화할 PDF 선택
removePassword.selectText.2=암호
removePassword.submit=제거
#changeMetadata
changeMetadata.title=제목:
changeMetadata.header=메타데이터 변경
changeMetadata.selectText.1=변경하려는 변수를 편집해주세요
changeMetadata.selectText.2=모든 메타데이터 삭제
changeMetadata.selectText.3=사용자 정의 메타데이터 표시:
changeMetadata.author=저자:
changeMetadata.creationDate=작성일 (yyyy/MM/dd HH:mm:ss):
changeMetadata.creator=제작자:
changeMetadata.keywords=키워드:
changeMetadata.modDate=수정일 (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=생성자:
changeMetadata.subject=주제:
changeMetadata.title=제목:
changeMetadata.trapped=잠긴 상태:
changeMetadata.selectText.4=기타 메타데이터:
changeMetadata.selectText.5=사용자 정의 메타데이터 항목 추가
changeMetadata.submit=변경
#xlsToPdf
xlsToPdf.title=Excel to PDF
xlsToPdf.header=Excel을 PDF로 변환
xlsToPdf.selectText.1=변환할 XLS 또는 XLSX Excel 시트 선택
xlsToPdf.convert=변환하기
#pdfToPDFA
pdfToPDFA.title=PDF To PDF/A
pdfToPDFA.header=PDF를 PDF/A로 변환
pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 OCRmyPDF를 사용합니다.
pdfToPDFA.submit=변환
#PDFToWord
PDFToWord.title=PDF to Word
PDFToWord.header=PDF를 Word로 변환
PDFToWord.selectText.1=출력 파일 형식
PDFToWord.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다.
PDFToWord.submit=변환
#PDFToPresentation
PDFToPresentation.title=PDF to Presentation
PDFToPresentation.header=PDF를 프레젠테이션으로 변환
PDFToPresentation.selectText.1=출력 파일 형식
PDFToPresentation.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다.
PDFToPresentation.submit=변환
#PDFToText
PDFToText.title=PDF to RTF (Text)
PDFToText.header=PDF를 텍스트/RTF로 변환
PDFToText.selectText.1=출력 파일 형식
PDFToText.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다.
PDFToText.submit=변환
#PDFToHTML
PDFToHTML.title=PDF to HTML
PDFToHTML.header=PDF를 HTML로 변환
PDFToHTML.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다.
PDFToHTML.submit=변환
#PDFToXML
PDFToXML.title=PDF to XML
PDFToXML.header=PDF를 XML로 변환
PDFToXML.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다.
PDFToXML.submit=변환

View File

@@ -1,134 +1,475 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr = left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr language.direction=ltr
pdfPrompt=Wybierz PDF pdfPrompt=Wybierz PDF
multiPdfPrompt=Wybierz PDF (2+) multiPdfPrompt=Wybierz PDF (2+)
multiPdfDropPrompt=Wybierz (lub przeciągnij i puść) wszystkie pliki PDF multiPdfDropPrompt=Wybierz (lub przeciągnij i puść) wszystkie dokumenty PDF
imgPrompt=Wybierz obraz(y) imgPrompt=Wybierz obraz(y)
genericSubmit=Wyślij genericSubmit=Wyślij
processTimeWarning=Ostrzeżenie: Ten proces może potrwać do minuty, w zależności od rozmiaru pliku processTimeWarning=Ostrzeżenie: Ten proces może potrwać do minuty, w zależności od rozmiaru pliku
pageOrderPrompt=Kolejność stron (wprowadź listę numerów stron oddzielonych przecinkami) : pageOrderPrompt=Kolejność stron (wprowadź listę numerów stron oddzielonych przecinkami) :
goToPage=Idź goToPage=Idź
true=Prawda true=Tak
false=Fałsz false=Nie
unknown=Nieznany unknown=Nieznany
save=Zapisz save=Zapisz
close=Zamknij close=Zamknij
filesSelected=wybrane pliki filesSelected=wybrane pliki
noFavourites=Nie dodano ulubionych noFavourites=Nie dodano ulubionych
bored=Znudzony czekaniem? bored=Znudzony czekaniem?
############# alphabet=Alfabet
# HOME-PAGE # downloadPdf=Pobierz PDF
############# text=Tekst
home.desc=Twoja lokalna aplikacja do kompleksowej obsługi Twoich potrzeb związanych z plikami PDF. font=Czcionka
selectFillter=-- Wybierz --
pageNum=Numer strony
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=Dokument PDF jest zabezpieczony hasłem, musisz podać prawidłowe hasło.
#############
# NAVBAR #
#############
navbar.convert=Konwertuj navbar.convert=Konwertuj
navbar.security=Bezpieczeństwo navbar.security=Bezpieczeństwo
navbar.other=Inne navbar.other=Inne
navbar.darkmode=Tryb nocny navbar.darkmode=Tryb nocny
navbar.pageOps=Operacje strony navbar.pageOps=Strony
navbar.settings=Ustawienia
home.multiTool.title=Wielofunkcyjne narzędzie PDF #############
# SETTINGS #
#############
settings.title=Ustawienia
settings.update=Dostępna aktualizacja
settings.appVersion=Wersia aplikacji:
settings.downloadOption.title=Wybierz opcję pobierania (w przypadku pobierania pojedynczych plików innych niż ZIP):
settings.downloadOption.1=Otwórz w tym samym oknie
settings.downloadOption.2=Otwórz w nowym oknie
settings.downloadOption.3=Pobierz plik
settings.zipThreshold=Spakuj pliki, gdy liczba pobranych plików przekroczy
#############
# HOME-PAGE #
#############
home.desc=Twoja lokalna aplikacja do kompleksowej obsługi Twoich potrzeb związanych z dokumentami PDF.
home.multiTool.title=Multi narzędzie PDF
home.multiTool.desc=Łącz, dziel, obracaj, zmieniaj kolejność i usuwaj strony home.multiTool.desc=Łącz, dziel, obracaj, zmieniaj kolejność i usuwaj strony
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
home.merge.title=Połącz home.merge.title=Połącz
home.merge.desc=Łatwe łączenie wielu plików PDF w jeden. home.merge.desc=Łatwe łączenie wielu dokumentów PDF w jeden.
merge.tags=merge,Page operations,Back end,server side
home.split.title=Podziel home.split.title=Podziel
home.split.desc=Podziel pliki PDF na wiele dokumentów home.split.desc=Podziel dokument PDF na wiele dokumentów
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=Obróć home.rotate.title=Obróć
home.rotate.desc=Łatwo obracaj pliki PDF. home.rotate.desc=Łatwo obracaj dokumenty PDF.
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
home.imageToPdf.title=Obraz na PDF home.imageToPdf.title=Obraz na PDF
home.imageToPdf.desc=Konwertuj obraz (PNG, JPEG, GIF) do formatu PDF. home.imageToPdf.desc=Konwertuj obraz (PNG, JPEG, GIF) do dokumentu PDF.
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=PDF na Obraz home.pdfToImage.title=PDF na Obraz
home.pdfToImage.desc=Konwertuj plik PDF na obraz (PNG, JPEG, GIF). home.pdfToImage.desc=Konwertuj plik PDF na obraz (PNG, JPEG, GIF).
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=Uporządkuj home.pdfOrganiser.title=Uporządkuj
home.pdfOrganiser.desc=Usuń/Zmień kolejność stron w dowolnej kolejności home.pdfOrganiser.desc=Usuń/Zmień kolejność stron w dowolnej kolejności
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=Dodaj obraz home.addImage.title=Dodaj obraz
home.addImage.desc=Dodaje obraz do wybranej lokalizacji w dokumencie PDF (komponent w budowie) home.addImage.desc=Dodaje obraz w wybranym miejscu w dokumencie PDF (moduł w budowie)
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
home.watermark.title=Dodaj znak wodny home.watermark.title=Dodaj znak wodny
home.watermark.desc=Dodaj niestandardowy znak wodny do dokumentu PDF. home.watermark.desc=Dodaj niestandardowy znak wodny do dokumentu PDF.
##########################
home.remove-watermark.title=Usuń znak wodny ### TODO: Translate ###
home.remove-watermark.desc=Usuń znaki wodne z dokumentu PDF. ##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.permissions.title=Zmień uprawnienia home.permissions.title=Zmień uprawnienia
home.permissions.desc=Zmień uprawnienia dokumentu PDF home.permissions.desc=Zmień uprawnienia dokumentu PDF
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
home.removePages.title=Usuń home.removePages.title=Usuń
home.removePages.desc=Usuń niechciane strony z dokumentu PDF. home.removePages.desc=Usuń niechciane strony z dokumentu PDF.
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
home.addPassword.title=Dodaj hasło home.addPassword.title=Dodaj hasło
home.addPassword.desc=Zaszyfruj dokument PDF za pomocą hasła. home.addPassword.desc=Zaszyfruj dokument PDF za pomocą hasła.
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
home.removePassword.title=Usuń hasło home.removePassword.title=Usuń hasło
home.removePassword.desc=Usuń ochronę hasłem z dokumentu PDF. home.removePassword.desc=Usuń ochronę hasłem z dokumentu PDF.
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=Kompresuj home.compressPdfs.title=Kompresuj
home.compressPdfs.desc=Kompresuj dokumenty PDF, aby zmniejszyć ich rozmiar. home.compressPdfs.desc=Kompresuj dokumenty PDF, aby zmniejszyć ich rozmiar.
##########################
### TODO: Translate ###
##########################
compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=Zmień metadane home.changeMetadata.title=Zmień metadane
home.changeMetadata.desc=Zmień/Usuń/Dodaj metadane z dokumentu PDF home.changeMetadata.desc=Zmień/Usuń/Dodaj metadane w dokumencie PDF
##########################
### TODO: Translate ###
##########################
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=Konwertuj plik do formatu PDF home.fileToPDF.title=Konwertuj plik do PDF
home.fileToPDF.desc=Konwertuj prawie każdy plik do formatu PDF (DOCX, PNG, XLS, PPT, TXT i więcej) home.fileToPDF.desc=Konwertuj dowolny plik do dokumentu PDF (DOCX, PNG, XLS, PPT, TXT i więcej)
##########################
### TODO: Translate ###
##########################
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=OCR / Zamiana na tekst home.ocr.title=OCR / Zamiana na tekst
home.ocr.desc=OCR skanuje i wykrywa tekst z obrazów w pliku PDF i zamienia go na tekst. home.ocr.desc=OCR skanuje i wykrywa tekst z obrazów w dokumencie PDF i zamienia go na tekst.
##########################
### TODO: Translate ###
##########################
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
home.extractImages.title=Wyodrębnij obrazy home.extractImages.title=Wyodrębnij obrazy
home.extractImages.desc=Wyodrębnia wszystkie obrazy z pliku PDF i zapisuje je w formacie zip home.extractImages.desc=Wyodrębnia wszystkie obrazy z dokumentu PDF i zapisuje je w wybranym formacie
##########################
### TODO: Translate ###
##########################
extractImages.tags=picture,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=PDF na PDF/A home.pdfToPDFA.title=PDF na PDF/A
home.pdfToPDFA.desc=Konwertuj pliki PDF na PDF/A w celu długoterminowego przechowywania home.pdfToPDFA.desc=Konwertuj dokument PDF na PDF/A w celu długoterminowego przechowywania
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=PDF na Word home.PDFToWord.title=PDF na Word
home.PDFToWord.desc=Konwertuj pliki PDF na formaty Microsoft Word (DOC, DOCX i ODT) home.PDFToWord.desc=Konwertuj dokument PDF na formaty Word (DOC, DOCX i ODT)
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=PDF na Prezentację home.PDFToPresentation.title=PDF na Prezentację
home.PDFToPresentation.desc=Konwertuj pliki PDF na formaty prezentacji (PPT, PPTX i ODP) home.PDFToPresentation.desc=Konwertuj dokument PDF na formaty prezentacji (PPT, PPTX i ODP)
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=PDF na Tekst/RTF home.PDFToText.title=PDF na Tekst/RTF
home.PDFToText.desc=Konwertuj PDF na tekst lub format RTF home.PDFToText.desc=Konwertuj dokument PDF na tekst lub format RTF
##########################
### TODO: Translate ###
##########################
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDF na HTML home.PDFToHTML.title=PDF na HTML
home.PDFToHTML.desc=Konwertuj PDF na format HTML home.PDFToHTML.desc=Konwertuj dokument PDF na format HTML
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=PDF na XML home.PDFToXML.title=PDF na XML
home.PDFToXML.desc=Konwertuj PDF na format XML home.PDFToXML.desc=Konwertuj dokument PDF na format XML
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=Wykryj/Podziel zeskanowane zdjęcia home.ScannerImageSplit.title=Wykryj/Podziel zeskanowane zdjęcia
home.ScannerImageSplit.desc=Podziel na wiele zdjęć z jednego zdjęcia/PDF home.ScannerImageSplit.desc=Podziel na wiele zdjęć z jednego zdjęcia/PDF
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title=Podpis home.sign.title=Podpis
home.sign.desc=Dodaje podpis do pliku PDF za pomocą rysunku, tekstu lub obrazu home.sign.desc=Dodaje podpis do dokument PDF za pomocą rysunku, tekstu lub obrazu
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=Spłaszcz home.flatten.title=Spłaszcz
home.flatten.desc=Usuń wszystkie interaktywne elementy i formularze z pliku PDF home.flatten.desc=Usuń wszystkie interaktywne elementy i formularze z dokumentu PDF
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title=Napraw home.repair.title=Napraw
home.repair.desc=Spróbuj naprawić uszkodzony plik PDF home.repair.desc=Spróbuj naprawić uszkodzony dokument PDF
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
home.removeBlanks.title=Usuń puste strony home.removeBlanks.title=Usuń puste strony
home.removeBlanks.desc=Wykrywa i usuwa puste strony z dokumentu PDF home.removeBlanks.desc=Wykrywa i usuwa puste strony z dokumentu PDF
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title=Porównaj home.compare.title=Porównaj
home.compare.desc=Porównuje i pokazuje różnice między 2 dokumentami PDF home.compare.desc=Porównuje i pokazuje różnice między dwoma dokumentami PDF
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
downloadPdf=Pobierz PDF home.certSign.title=Podpisz certyfikatem
text=Tekst home.certSign.desc=Podpisz dokument PDF za pomocą certyfikatu/klucza prywatnego (PEM/P12)
font=Czcionka ##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Układ wielu stron
home.pageLayout.desc=Scal wiele stron dokumentu PDF w jedną stronę
##########################
### TODO: Translate ###
##########################
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=Dopasuj rozmiar stron
home.scalePages.desc=Dopasuj rozmiar stron wybranego dokumentu PDF
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
##########################
### TODO: Translate ###
##########################
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
##########################
### TODO: Translate ###
##########################
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
##########################
### TODO: Translate ###
##########################
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
##########################
### TODO: Translate ###
##########################
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
##########################
### TODO: Translate ###
##########################
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
##########################
### TODO: Translate ###
##########################
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
##########################
### TODO: Translate ###
##########################
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Układ wielu stron
pageLayout.header=Układ wielu stron
pageLayout.pagesPerSheet=Stron na jednym arkuszu:
pageLayout.submit=Wykonaj
#scalePages
scalePages.title=Dopasuj rozmiar stron
scalePages.header=Dopasuj rozmiar stron
scalePages.pageSize=Rozmiar stron dokumentu:
scalePages.scaleFactor=Poziom powiększenia (przycięcia) stron:
scalePages.submit=Wykonaj
#certSign
certSign.title=Podpisywanie certyfikatem
certSign.header=Podpisz dokument PDF certyfikatem prywatnym (moduł w budowie)
certSign.selectPDF=Wybierz dokument PDF do podpisania:
certSign.selectKey=Wybierz plik klucza prywatnego (format PKCS#8, może to być .pem lub .der):
certSign.selectCert=Wybierz plik certyfikatu (format X.509, może to być .pem lub .der):
certSign.selectP12=Wybierz plik magazynu kluczy PKCS#12 (.p12 lub .pfx) (opcjonalnie, jeśli jest podany, powinien zawierać klucz prywatny i certyfikat):
certSign.certType=Typ certyfikatu
certSign.password=Wprowadź hasło do magazynu kluczy lub klucza prywatnego (jeśli istnieje):
certSign.showSig=Wyświetl podpis
certSign.reason=Organizacja
certSign.location=Lokalizacja
certSign.name=Nazwa
certSign.submit=Podpisz PDF
#removeBlanks
removeBlanks.title=Usuń puste removeBlanks.title=Usuń puste
removeBlanks.header=Usuń puste strony removeBlanks.header=Usuń puste strony
removeBlanks.threshold=Próg: removeBlanks.threshold=Próg:
@@ -137,28 +478,38 @@ removeBlanks.whitePercent=Procent białego (%):
removeBlanks.whitePercentDesc=Procent strony, która musi być biała, aby została usunięta removeBlanks.whitePercentDesc=Procent strony, która musi być biała, aby została usunięta
removeBlanks.submit=Usuń puste removeBlanks.submit=Usuń puste
#compare
compare.title=Porównaj compare.title=Porównaj
compare.header=Porównaj PDF(y) compare.header=Porównaj PDF(y)
compare.document.1=Dokument 1 compare.document.1=Dokument 1
compare.document.2=Dokument 2 compare.document.2=Dokument 2
compare.submit=Porównaj compare.submit=Porównaj
#sign
sign.title=Podpis sign.title=Podpis
sign.header=Dodaj podpis do PDF(a) sign.header=Dodaj podpis do dokumentu PDF
sign.upload=Wczytaj opbraz sign.upload=Wczytaj opbraz
sign.draw=Narysuj podpis sign.draw=Narysuj podpis
sign.text=Wprowadź tekst sign.text=Wprowadź tekst
sign.clear=Wyczyść sign.clear=Wyczyść
sign.add=Dodaj sign.add=Dodaj
#repair
repair.title=Napraw repair.title=Napraw
repair.header=Napraw PDF(y) repair.header=Napraw dokument(y) PDF
repair.submit=Napraw repair.submit=Napraw
#flatten
flatten.title=Spłaszcz flatten.title=Spłaszcz
flatten.header=Spłaszcz PDF(y) flatten.header=Spłaszcz dokument(y) PDF
flatten.submit=Spłaszcz flatten.submit=Spłaszcz
#ScannerImageSplit
ScannerImageSplit.selectText.1=Próg kąta: ScannerImageSplit.selectText.1=Próg kąta:
ScannerImageSplit.selectText.2=Ustawia minimalny kąt bezwzględny wymagany do obrócenia obrazu (domyślnie: 10). ScannerImageSplit.selectText.2=Ustawia minimalny kąt bezwzględny wymagany do obrócenia obrazu (domyślnie: 10).
ScannerImageSplit.selectText.3=Tolerancja: ScannerImageSplit.selectText.3=Tolerancja:
@@ -170,28 +521,15 @@ ScannerImageSplit.selectText.8=Ustawia próg minimalnego obszaru konturu dla zdj
ScannerImageSplit.selectText.9=Rozmiar obramowania: ScannerImageSplit.selectText.9=Rozmiar obramowania:
ScannerImageSplit.selectText.10=Ustawia rozmiar dodawanego i usuwanego obramowania, aby uniknąć białych obramowań na wyjściu (domyślnie: 1). ScannerImageSplit.selectText.10=Ustawia rozmiar dodawanego i usuwanego obramowania, aby uniknąć białych obramowań na wyjściu (domyślnie: 1).
navbar.settings=Ustawienia
settings.title=Ustawienia
settings.update=Dostępna aktualizacja
settings.appVersion=Wersia aplikacji:
settings.downloadOption.title=Wybierz opcję pobierania (w przypadku pobierania pojedynczych plików innych niż ZIP):
settings.downloadOption.1=Otwórz w tym samym oknie
settings.downloadOption.2=Otwórz w nowym oknie
settings.downloadOption.3=Pobierz plik
settings.zipThreshold=Spakuj pliki, gdy liczba pobranych plików przekroczy
#OCR #OCR
ocr.title=OCR / Zamiana na tekst ocr.title=OCR / Zamiana na tekst
ocr.header=OCR / Zamiana na tekst (optyczne rozpoznawanie znaków) ocr.header=OCR / Zamiana na tekst (optyczne rozpoznawanie znaków)
ocr.selectText.1=Wybierz języki, które mają zostać wykryte w pliku PDF (te z listy to języki, które są obecnie wykrywane): ocr.selectText.1=Wybierz języki, które mają zostać wykryte w dokumencie PDF (te z listy to języki, które są obecnie wykrywane):
ocr.selectText.2=Utwórz plik tekstowy zawierający tekst OCR wraz z plikiem PDF z OCR ocr.selectText.2=Utwórz plik tekstowy zawierający tekst OCR oraz dokument PDF z OCR
ocr.selectText.3=Prawidłowe strony zostały zeskanowane pod przekrzywionym kątem przez obrócenie ich z powrotem na miejsce ocr.selectText.3=Prawidłowe strony zostały zeskanowane pod przekrzywionym kątem przez obrócenie ich z powrotem na miejsce
ocr.selectText.4=Wyczyść stronę, więc jest mniej prawdopodobne, że OCR znajdzie tekst w szumie tła. (Brak zmiany wyjścia) ocr.selectText.4=Wyczyść stronę, więc jest mniej prawdopodobne że OCR znajdzie tekst w obrazie tła. (Brak zmiany wyjścia)
ocr.selectText.5=Wyczyść stronę, więc jest mniej prawdopodobne, że OCR znajdzie tekst w szumie tła, utrzymuje porządek na wyjściu. ocr.selectText.5=Wyczyść stronę, więc jest mniej prawdopodobne że OCR znajdzie tekst w obrazie tła, utrzymuje porządek na wyjściu.
ocr.selectText.6=Ignoruje strony zawierające interaktywny tekst, tylko strony OCR, które są obrazami ocr.selectText.6=Ignoruje strony zawierające interaktywny tekst, tylko strony OCR, które są obrazami
ocr.selectText.7=Wymuś OCR, każda strona usunie wszystkie oryginalne elementy tekstowe ocr.selectText.7=Wymuś OCR, każda strona usunie wszystkie oryginalne elementy tekstowe
ocr.selectText.8=Normalny (wystąpi błąd, jeśli plik PDF zawiera tekst) ocr.selectText.8=Normalny (wystąpi błąd, jeśli plik PDF zawiera tekst)
@@ -204,16 +542,16 @@ ocr.credit=Ta usługa używa OCRmyPDF i Tesseract do OCR.
ocr.submit=Przetwarzaj PDF za pomocą OCR ocr.submit=Przetwarzaj PDF za pomocą OCR
#extractImages
extractImages.title=Wyodrębnij obrazy extractImages.title=Wyodrębnij obrazy
extractImages.header=Wyodrębnij obrazy extractImages.header=Wyodrębnij obrazy
extractImages.selectText=Wybierz format obrazu, aby przekonwertować wyodrębnione obrazy extractImages.selectText=Wybierz format obrazu, na który chcesz przekonwertować wyodrębniony obraz.
extractImages.submit=Wyodrębnij extractImages.submit=Wyodrębnij
#File to PDF #File to PDF
fileToPDF.title=Plik na PDF fileToPDF.title=Plik na PDF
fileToPDF.header=Konwertuj kady plik na PDF fileToPDF.header=Konwertuj dowolny plik na dokument PDF
fileToPDF.credit=Ta usługa używa LibreOffice i Unoconv do konwersji plików. fileToPDF.credit=Ta usługa używa LibreOffice i Unoconv do konwersji plików.
fileToPDF.supportedFileTypes=Obsługiwane typy plików powinny być zgodne z poniższymi, jednak pełną zaktualizowaną listę obsługiwanych formatów można znaleźć w dokumentacji LibreOffice fileToPDF.supportedFileTypes=Obsługiwane typy plików powinny być zgodne z poniższymi, jednak pełną zaktualizowaną listę obsługiwanych formatów można znaleźć w dokumentacji LibreOffice
fileToPDF.submit=Konwertuj na PDF fileToPDF.submit=Konwertuj na PDF
@@ -222,14 +560,12 @@ fileToPDF.submit=Konwertuj na PDF
#compress #compress
compress.title=Kompresuj compress.title=Kompresuj
compress.header=Kompresuj PDF compress.header=Kompresuj PDF
compress.credit=Ta usługa wykorzystuje OCRmyPDF do kompresji/optymalizacji PDF. compress.credit=Ta usługa używa Ghostscript do kompresji/optymalizacji PDF.
compress.selectText.1=Poziom optymalizacji: compress.selectText.1=Tryb ręczny - Od 1 do 4
compress.selectText.2=0 (Brak optymalizacji) compress.selectText.2=Poziom optymalizacji:
compress.selectText.3=1 (Domyślna, bezstratna optymalizacja) compress.selectText.3=4 (Straszne dla obrazów tekstowych)
compress.selectText.4=2 (Stratna optymalizacja) compress.selectText.4=Tryb automatyczny - Automatycznie dostosowuje jakość, aby uzyskać dokładny rozmiar pliku PDF
compress.selectText.5=3 (Stratna optymalizacja, bardziej agresywna) compress.selectText.5=Oczekiwany rozmiar pliku PDF (np. 25 MB, 10,8 MB, 25 KB)
compress.selectText.6=Włącz szybki podgląd w Internecie (linearyzacja PDF)
compress.selectText.7=Włącz stratne kodowanie JBIG2
compress.submit=Kompresuj compress.submit=Kompresuj
@@ -237,42 +573,44 @@ compress.submit=Kompresuj
addImage.title=Dodaj obraz addImage.title=Dodaj obraz
addImage.header=Dodaj obraz do PDF addImage.header=Dodaj obraz do PDF
addImage.everyPage=Każda strona? addImage.everyPage=Każda strona?
addImage.upload=Dodaj obraz
addImage.submit=Dodaj obraz addImage.submit=Dodaj obraz
#merge #merge
merge.title=Połącz merge.title=Połącz
merge.header=Połącz wiele plików PDF (2+) merge.header=Połącz wiele dokumentów PDF (2+)
merge.submit=Połącz merge.submit=Połącz
#pdfOrganiser #pdfOrganiser
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
#multiTool #multiTool
multiTool.title=Wielofunkcyjne narzędzie PDF multiTool.title=Multi narzędzie PDF
multiTool.header=Wielofunkcyjne narzędzie PDF multiTool.header=Multi narzędzie PDF
#pageRemover #pageRemover
pageRemover.title=Narzędzie do usuwania stron pageRemover.title=Narzędzie do usuwania stron
pageRemover.header=Narzędzie do usuwania stron w plikach 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
#rotate #rotate
rotate.title=Obróć plik PDF rotate.title=Obróć dokument PDF
rotate.header=Obróć plik PDF rotate.header=Obróć dokument PDF
rotate.selectAngle=Wybierz kąt obrotu (domyślnie 90 stopni): rotate.selectAngle=Wybierz kąt obrotu (domyślnie 90 stopni):
rotate.submit=Obróć rotate.submit=Obróć
#merge #merge
split.title=Podziel plik PDF split.title=Podziel dokument PDF
split.header=Podziel plik 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-8 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
@@ -292,8 +630,9 @@ imageToPDF.submit=Konwertuj
imageToPDF.selectText.1=Rozciągnij, aby dopasować imageToPDF.selectText.1=Rozciągnij, aby dopasować
imageToPDF.selectText.2=Automatyczne obracanie PDF imageToPDF.selectText.2=Automatyczne obracanie PDF
imageToPDF.selectText.3=Logika wielu plików (dostępna tylko w przypadku pracy z wieloma obrazami) imageToPDF.selectText.3=Logika wielu plików (dostępna tylko w przypadku pracy z wieloma obrazami)
imageToPDF.selectText.4=Połącz w jeden plik PDF imageToPDF.selectText.4=Połącz w jeden dokument PDF
imageToPDF.selectText.5=Konwertuj na osobne pliki PDF imageToPDF.selectText.5=Konwertuj na osobne dokumenty PDF
#pdfToImage #pdfToImage
pdfToImage.title=PDF na Obraz pdfToImage.title=PDF na Obraz
@@ -308,6 +647,7 @@ pdfToImage.grey=Odcień szarości
pdfToImage.blackwhite=Czarno-biały (może spowodować utratę danych!) pdfToImage.blackwhite=Czarno-biały (może spowodować utratę danych!)
pdfToImage.submit=Konwertuj pdfToImage.submit=Konwertuj
#addPassword #addPassword
addPassword.title=Dodaj hasło addPassword.title=Dodaj hasło
addPassword.header=Dodaj hasło (zaszyfruj) addPassword.header=Dodaj hasło (zaszyfruj)
@@ -324,32 +664,38 @@ addPassword.selectText.10=Zablokuj modyfikacje
addPassword.selectText.11=Zablokuj modyfikacje adnotacji addPassword.selectText.11=Zablokuj modyfikacje adnotacji
addPassword.selectText.12=Zablokuj drukowanie addPassword.selectText.12=Zablokuj drukowanie
addPassword.selectText.13=Zablokuj drukowanie różnych formatów addPassword.selectText.13=Zablokuj drukowanie różnych formatów
addPassword.selectText.14=Owner Password
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
addPassword.selectText.16=Restricts the opening of the document itself
addPassword.submit=Zablokuj addPassword.submit=Zablokuj
#watermark #watermark
watermark.title=Dodaj znak wodny watermark.title=Dodaj znak wodny
watermark.header=Dodaj znak wodny watermark.header=Dodaj znak wodny
watermark.selectText.1=Wybierz plik PDF, do którego chcesz dodać znak wodny: watermark.selectText.1=Wybierz dokument PDF, do którego chcesz dodać znak wodny:
watermark.selectText.2=Treść znaku wodnego: watermark.selectText.2=Treść znaku wodnego:
watermark.selectText.3=Rozmiar czcionki: watermark.selectText.3=Rozmiar czcionki:
watermark.selectText.4=Obrót (0-360): watermark.selectText.4=Obrót (0-360):
watermark.selectText.5=odstępy poziomo (odstęp między każdym znakiem wodnym w poziomie): watermark.selectText.5=Odstęp w poziomie (odstęp między każdym znakiem wodnym w poziomie):
watermark.selectText.6=odstępy pionowo (odstęp między każdym znakiem wodnym w pionie): watermark.selectText.6=Odstęp w pionie (odstęp między każdym znakiem wodnym w pionie):
watermark.selectText.7=Nieprzezroczystość (0% - 100%): watermark.selectText.7=Nieprzezroczystość (0% - 100%):
watermark.submit=Dodaj znak wodny watermark.submit=Dodaj znak wodny
#remove-watermark #remove-watermark
remove-watermark.title=Usuń znak wodny remove-watermark.title=Usuń znak wodny
remove-watermark.header=Usuń znak wodny remove-watermark.header=Usuń znak wodny
remove-watermark.selectText.1=Wybierz PDF, aby usunąć znak wodny z: remove-watermark.selectText.1=Wybierz dokument PDF, aby usunąć znak wodny z:
remove-watermark.selectText.2=Treść zanku wodnego: remove-watermark.selectText.2=Treść zanku wodnego:
remove-watermark.submit=Usuń znak wodny remove-watermark.submit=Usuń znak wodny
#Change permissions #Change permissions
permissions.title=Zmień uprawnienia permissions.title=Zmień uprawnienia
permissions.header=Zmień uprawnienia permissions.header=Zmień uprawnienia
permissions.warning=Ostrzeżenie, aby te uprawnienia były zablokowane, zaleca się ustawienie hasła na stronie dodawania hasła permissions.warning=Ostrzeżenie, aby te uprawnienia były zablokowane, zaleca się ustawienie hasła na stronie dodawania hasła
permissions.selectText.1=Wybierz PDF, aby zmienić uprawnienia permissions.selectText.1=Wybierz dokument PDF, aby zmienić uprawnienia
permissions.selectText.2=Uprawnienia do zmian permissions.selectText.2=Uprawnienia do zmian
permissions.selectText.3=Zablokuj zmiany w dokumencie permissions.selectText.3=Zablokuj zmiany w dokumencie
permissions.selectText.4=Zablokuj zmiany w treści permissions.selectText.4=Zablokuj zmiany w treści
@@ -361,52 +707,58 @@ permissions.selectText.9=Zablokuj drukowanie
permissions.selectText.10=Zablokuj drukowanie różnych formatów permissions.selectText.10=Zablokuj drukowanie różnych formatów
permissions.submit=Zmień permissions.submit=Zmień
#remove password #remove password
removePassword.title=Usuń hasło removePassword.title=Usuń hasło
removePassword.header=Usuń hasło (odszyfruj) removePassword.header=Usuń hasło (odszyfruj)
removePassword.selectText.1=Wybierz plik PDF do odszyfrowania removePassword.selectText.1=Wybierz dokument PDF do odszyfrowania
removePassword.selectText.2=Hasło removePassword.selectText.2=Hasło
removePassword.submit=Usuń removePassword.submit=Usuń
changeMetadata.title=Zmień metadane
#changeMetadata
changeMetadata.title=Tytuł:
changeMetadata.header=Zmień metadane changeMetadata.header=Zmień metadane
changeMetadata.selectText.1=Edytuj zmienne, które chcesz zmienić changeMetadata.selectText.1=Edytuj zmienne, które chcesz zmienić
changeMetadata.selectText.2=Usuń wszystkie metadane changeMetadata.selectText.2=Usuń wszystkie metadane
changeMetadata.selectText.3=Pokaż niestandardowe metadane: changeMetadata.selectText.3=Pokaż niestandardowe metadane:
changeMetadata.author=Autor: changeMetadata.author=Autor:
changeMetadata.creationDate=Data utworzenia (dd/MM/yyyy HH:mm:ss): changeMetadata.creationDate=Data utworzenia (yyyy/MM/dd HH:mm:ss):
changeMetadata.creator=Twórca: changeMetadata.creator=Twórca:
changeMetadata.keywords=Słowa kluczowe: changeMetadata.keywords=Słowa kluczowe:
changeMetadata.modDate=Data modyfikacji (dd/MM/yyyy HH:mm:ss): changeMetadata.modDate=Data modyfikacji (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=Producent: changeMetadata.producer=Producent:
changeMetadata.subject=Temat: changeMetadata.subject=Temat:
changeMetadata.title=Tytuł: changeMetadata.title=Tytuł:
changeMetadata.trapped=Uwięziony: changeMetadata.trapped=Zablokowany:
changeMetadata.selectText.4=Inne metadane: changeMetadata.selectText.4=Inne metadane:
changeMetadata.selectText.5=Dodaj niestandardowy wpis w metadanych changeMetadata.selectText.5=Dodaj niestandardowy wpis w metadanych
changeMetadata.submit=Zmień changeMetadata.submit=Zmień
#xlsToPdf
xlsToPdf.title=Excel na PDF xlsToPdf.title=Excel na PDF
xlsToPdf.header=Excel na PDF xlsToPdf.header=Excel na PDF
xlsToPdf.selectText.1=Wybierz arkusz Microsoft Excel XLS lub XLSX do konwersji xlsToPdf.selectText.1=Wybierz arkusz Microsoft Excel XLS lub XLSX do konwersji
xlsToPdf.convert=Konwertuj xlsToPdf.convert=Konwertuj
#pdfToPDFA
pdfToPDFA.title=PDF na PDF/A pdfToPDFA.title=PDF na PDF/A
pdfToPDFA.header=PDF na PDF/A pdfToPDFA.header=PDF na PDF/A
pdfToPDFA.credit=Ta usługa używa OCRmyPDF do konwersji PDF/A pdfToPDFA.credit=Ta usługa używa OCRmyPDF do konwersji PDF/A
pdfToPDFA.submit=Konwertuj pdfToPDFA.submit=Konwertuj
#PDFToWord
PDFToWord.title=PDF na Word PDFToWord.title=PDF na Word
PDFToWord.header=PDF na Word PDFToWord.header=PDF na Word
PDFToWord.selectText.1=Format pliku wyjściowego PDFToWord.selectText.1=Format pliku wyjściowego
PDFToWord.credit=Ta usługa używa LibreOffice do konwersji plików. PDFToWord.credit=Ta usługa używa LibreOffice do konwersji plików.
PDFToWord.submit=Konwertuj PDFToWord.submit=Konwertuj
#PDFToPresentation
PDFToPresentation.title=PDF na Prezentację PDFToPresentation.title=PDF na Prezentację
PDFToPresentation.header=PDF na Prezentację PDFToPresentation.header=PDF na Prezentację
PDFToPresentation.selectText.1=Format pliku wyjściowego PDFToPresentation.selectText.1=Format pliku wyjściowego
@@ -414,6 +766,7 @@ PDFToPresentation.credit=Ta usługa używa LibreOffice do konwersji plików.
PDFToPresentation.submit=Konwertuj PDFToPresentation.submit=Konwertuj
#PDFToText
PDFToText.title=PDF na Tekst/RTF PDFToText.title=PDF na Tekst/RTF
PDFToText.header=PDF na Tekst/RTF PDFToText.header=PDF na Tekst/RTF
PDFToText.selectText.1=Format pliku wyjściowego PDFToText.selectText.1=Format pliku wyjściowego
@@ -421,11 +774,14 @@ PDFToText.credit=Ta usługa używa LibreOffice do konwersji plików.
PDFToText.submit=Konwertuj PDFToText.submit=Konwertuj
#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 LibreOffice do konwersji plików.
PDFToHTML.submit=Konwertuj PDFToHTML.submit=Konwertuj
#PDFToXML
PDFToXML.title=PDF na XML PDFToXML.title=PDF na XML
PDFToXML.header=PDF na XML PDFToXML.header=PDF na XML
PDFToXML.credit=Ta usługa używa LibreOffice do konwersji plików. PDFToXML.credit=Ta usługa używa LibreOffice do konwersji plików.

View File

@@ -0,0 +1,788 @@
###########
# Generic #
###########
# the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr
pdfPrompt=Selecione PDF(s)
multiPdfPrompt=Selecione PDFs (2+)
multiPdfDropPrompt=Selecione (ou arraste e solte) todos os PDFs necessários
imgPrompt=Selecione a(s) imagem(ns)
genericSubmit=Enviar
processTimeWarning=Aviso: esse processo pode levar até um minuto, dependendo do tamanho do arquivo
pageOrderPrompt=Ordem das páginas (digite uma lista separada por vírgulas de números de página):
goToPage=Ir
true=Verdadeiro
false=Falso
unknown=Desconhecido
save=Salvar
close=Fechar
filesSelected=arquivos selecionados
noFavourites=Nenhum favorito adicionado
bored=Entediado esperando?
alphabet=Alfabeto
downloadPdf=baixar PDF
text=Texto
font=Fonte
selectFillter=-- Selecione --
pageNum=Número de página
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
#############
# NAVBAR #
#############
navbar.convert=Converter
navbar.security=Segurança
navbar.other=Outro
navbar.darkmode=Modo Escuro
navbar.pageOps=Operações de página
navbar.settings=Configurações
#############
# SETTINGS #
#############
settings.title=Configurações
settings.update=Atualização disponível
settings.appVersion=Versão do aplicativo:
settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de arquivo único):
settings.downloadOption.1=Abrir na mesma janela
settings.downloadOption.2=Abrir em nova janela
settings.downloadOption.3=⇬ Fazer download do arquivo
settings.zipThreshold=Compactar arquivos quando o número de arquivos baixados exceder
#############
# HOME-PAGE #
#############
home.desc=Seu melhor utilitário para as necessidades de PDF.
home.multiTool.title=Multiferramenta de PDF
home.multiTool.desc=Mesclar, girar, reorganizar e remover páginas
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
home.merge.title=mesclar
home.merge.desc=Mescle facilmente vários PDFs em um.
merge.tags=merge,Page operations,Back end,server side
home.split.title=Dividir
home.split.desc=Dividir PDFs em vários documentos
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=Girar
home.rotate.desc=Gire facilmente seus PDFs.
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
home.imageToPdf.title=Imagem para PDF
home.imageToPdf.desc=Converta uma imagem (PNG, JPEG, GIF) em PDF.
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=PDF para imagem
home.pdfToImage.desc=Converta um PDF em uma imagem. (PNG, JPG, GIF)
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=Organizar
home.pdfOrganiser.desc=Remova/reorganize as páginas em qualquer ordem
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=Adicionar imagem
home.addImage.desc=Adiciona uma imagem em um local definido no PDF (trabalho em andamento)
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
home.watermark.title=Adicione uma Marca d'água
home.watermark.desc=Adicione uma marca d'água personalizada ao seu documento PDF.
##########################
### TODO: Translate ###
##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.permissions.title=Alterar permissões
home.permissions.desc=Altere as permissões do seu documento PDF
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
home.removePages.title=Remover
home.removePages.desc=Exclua as páginas indesejadas do seu documento PDF.
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
home.addPassword.title=Adicionar senha
home.addPassword.desc=Criptografe seu documento PDF com uma senha.
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
home.removePassword.title=Remover senha
home.removePassword.desc=Remova a proteção por senha do seu documento PDF.
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=Comprimir
home.compressPdfs.desc=Comprima PDFs para reduzir o tamanho do arquivo.
##########################
### TODO: Translate ###
##########################
compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=Alterar metadados
home.changeMetadata.desc=Alterar/remover/adicionar metadados de um documento PDF
##########################
### TODO: Translate ###
##########################
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=Converter arquivo para PDF
home.fileToPDF.desc=Converta praticamente qualquer arquivo em PDF (DOCX, PNG, XLS, PPT, TXT e mais)
##########################
### TODO: Translate ###
##########################
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=OCR / Varreduras de limpeza
home.ocr.desc=A limpeza verifica e detecta texto de imagens em um PDF e o adiciona novamente como texto.
##########################
### TODO: Translate ###
##########################
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
home.extractImages.title=Extrair imagens
home.extractImages.desc=Extrai todas as imagens de um PDF e as salva em zip
##########################
### TODO: Translate ###
##########################
extractImages.tags=picture,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=PDF para PDF/A
home.pdfToPDFA.desc=Converta PDF para PDF/A para armazenamento de longo prazo
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=PDF para Word
home.PDFToWord.desc=Converter PDF para formatos Word (DOC, DOCX e ODT)
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=PDF para apresentação
home.PDFToPresentation.desc=Converter PDF para formatos de apresentação (PPT, PPTX e ODP)
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=PDF para Texto/RTF
home.PDFToText.desc=Converter PDF em formato de texto ou RTF
##########################
### TODO: Translate ###
##########################
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDF para HTML
home.PDFToHTML.desc=Converter PDF para o formato HTML
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=PDF para XML
home.PDFToXML.desc=Converter PDF para o formato XML
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=Detectar/dividir fotos digitalizadas
home.ScannerImageSplit.desc=Divide várias fotos de dentro de uma foto/PDF
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title=Sinal
home.sign.desc=Adiciona assinatura ao PDF por desenho, texto ou imagem
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=achatar
home.flatten.desc=Remova todos os elementos e formulários interativos de um PDF
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title=Reparar
home.repair.desc=Tenta reparar um PDF corrompido/quebrado
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
home.removeBlanks.title=Remover páginas em branco
home.removeBlanks.desc=Detecta e remove páginas em branco de um documento
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title=Comparar
home.compare.desc=Compara e mostra as diferenças entre 2 documentos PDF
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
home.certSign.title=Assinar com certificado
home.certSign.desc=Assina um PDF com um Certificado/Chave (PEM/P12)
##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Multi-Page Layout
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
##########################
### TODO: Translate ###
##########################
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=Adjust page size/scale
home.scalePages.desc=Change the size/scale of page and/or its contents.
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
##########################
### TODO: Translate ###
##########################
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
##########################
### TODO: Translate ###
##########################
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
##########################
### TODO: Translate ###
##########################
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
##########################
### TODO: Translate ###
##########################
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
##########################
### TODO: Translate ###
##########################
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
##########################
### TODO: Translate ###
##########################
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
##########################
### TODO: Translate ###
##########################
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Multi Page Layout
pageLayout.header=Multi Page Layout
pageLayout.pagesPerSheet=Pages per sheet:
pageLayout.submit=Submit
#scalePages
scalePages.title=Adjust page-scale
scalePages.header=Adjust page-scale
scalePages.pageSize=Size of a page of the document.
scalePages.scaleFactor=Zoom level (crop) of a page.
scalePages.submit=Submit
#certSign
certSign.title=Assinatura de certificado
certSign.header=Assine um PDF com seu certificado (Trabalho em andamento)
certSign.selectPDF=Selecione um arquivo PDF para assinatura:
certSign.selectKey=Selecione seu arquivo de chave privada (formato PKCS#8, pode ser .pem ou .der):
certSign.selectCert=Selecione seu arquivo de certificado (formato X.509, pode ser .pem ou .der):
certSign.selectP12=Selecione seu arquivo de armazenamento de chave PKCS#12 (.p12 ou .pfx) (opcional, se fornecido, deve conter sua chave privada e certificado):
certSign.certType=tipo de certificado
certSign.password=Digite seu armazenamento de chave ou senha de chave privada (se houver):
certSign.showSig=Mostrar assinatura
certSign.reason=Razão
certSign.location=Localização
certSign.name=Nome
certSign.submit=Assinar PDF
#removeBlanks
removeBlanks.title=Remover espaços em branco
removeBlanks.header=Remover páginas em branco
removeBlanks.threshold=Limite:
removeBlanks.thresholdDesc=Limiar para determinar quão branco um pixel branco deve ser
removeBlanks.whitePercent=Porcentagem branca (%):
removeBlanks.whitePercentDesc=Porcentagem da página que deve ser branca para ser removida
removeBlanks.submit=Remover espaços em branco
#compare
compare.title=Comparar
compare.header=Comparar PDFs
compare.document.1=Documento 1
compare.document.2=Documento 2
compare.submit=Comparar
#sign
sign.title=Sinal
sign.header=Assinar PDFs
sign.upload=Enviar Imagem
sign.draw=Desenhar Assinatura
sign.text=Entrada de texto
sign.clear=Claro
sign.add=Adicionar
#repair
repair.title=Reparar
repair.header=Reparar PDFs
repair.submit=Reparar
#flatten
flatten.title=achatar
flatten.header=Achatar PDFs
flatten.submit=achatar
#ScannerImageSplit
ScannerImageSplit.selectText.1=Limite de Ângulo:
ScannerImageSplit.selectText.2=Define o ângulo absoluto mínimo necessário para que a imagem seja girada (padrão: 10).
ScannerImageSplit.selectText.3=Tolerância:
ScannerImageSplit.selectText.4=Determina o intervalo de variação de cor em torno da cor de fundo estimada (padrão: 30).
ScannerImageSplit.selectText.5=Área Mínima:
ScannerImageSplit.selectText.6=Define o limite mínimo de área para uma foto (padrão: 10000).
ScannerImageSplit.selectText.7=Área mínima de contorno:
ScannerImageSplit.selectText.8=Define o limite mínimo da área de contorno para uma foto
ScannerImageSplit.selectText.9=Tamanho da Borda:
ScannerImageSplit.selectText.10=Define o tamanho da borda adicionada e removida para evitar bordas brancas na saída (padrão: 1).
#OCR
ocr.title=OCR / Limpeza de digitalização
ocr.header=Varreduras de limpeza / OCR (reconhecimento óptico de caracteres)
ocr.selectText.1=Selecione os idiomas que devem ser detectados no PDF (os listados são os atualmente detectados):
ocr.selectText.2=Produzir arquivo de texto contendo texto OCR ao lado do PDF com OCR
ocr.selectText.3=As páginas corretas foram digitalizadas em um ângulo inclinado girando-as de volta ao lugar
ocr.selectText.4=Limpe a página para que seja menos provável que o OCR encontre o texto no ruído de fundo. (Sem mudança de saída)
ocr.selectText.5=Limpe a página para que seja menos provável que o OCR encontre texto no ruído de fundo, mantendo a limpeza na saída.
ocr.selectText.6=Ignora as páginas que contêm texto interativo, apenas as páginas de OCR que são imagens
ocr.selectText.7=Forçar OCR, irá OCR Todas as páginas removendo todos os elementos de texto originais
ocr.selectText.8=Normal (será um erro se o PDF contiver texto)
ocr.selectText.9=Configurações adicionais
ocr.selectText.10=Modo OCR
ocr.selectText.11=Remova as imagens após o OCR (remove TODAS as imagens, útil apenas se fizer parte da etapa de conversão)
ocr.selectText.12=Tipo de renderização (avançado)
ocr.help=Por favor, leia esta documentação sobre como usar isso para outros idiomas e/ou não usar no docker
ocr.credit=Este serviço usa OCRmyPDF e Tesseract para OCR.
ocr.submit=Processar PDF com OCR
#extractImages
extractImages.title=Extrair Imagens
extractImages.header=Extrair Imagens
extractImages.selectText=Selecione o formato de imagem para converter as imagens extraídas em
extractImages.submit=Extrair
#File to PDF
fileToPDF.title=Arquivo para PDF
fileToPDF.header=Converta qualquer arquivo para PDF
fileToPDF.credit=Este serviço usa LibreOffice e Unoconv para conversão de arquivos.
fileToPDF.supportedFileTypes=Os tipos de arquivo suportados devem incluir o abaixo, no entanto, para obter uma lista atualizada completa de formatos suportados, consulte a documentação do LibreOffice
fileToPDF.submit=Converter para PDF
#compress
compress.title=Comprimir
compress.header=Comprimir PDF
compress.credit=Este serviço usa o Ghostscript para compressão/otimização de PDF.
compress.selectText.1=Modo Manual - De 1 a 4
compress.selectText.2=Nível de otimização:
compress.selectText.3=4 (Péssimo para imagens de texto)
compress.selectText.4=Modo automático - Auto ajusta a qualidade para obter o tamanho exato do PDF
compress.selectText.5=Tamanho esperado do PDF (por exemplo, 25 MB, 10,8 MB, 25 KB)
compress.submit=Comprimir
#Add image
addImage.title=Adicionar imagem
addImage.header=Adicionar imagem ao PDF
addImage.everyPage=Cada página?
addImage.upload=Adicionar imagem
addImage.submit=Adicionar imagem
#merge
merge.title=mesclar
merge.header=Mesclar vários PDFs (2+)
merge.submit=mesclar
#pdfOrganiser
pdfOrganiser.title=Organizador de página
pdfOrganiser.header=Organizador de páginas PDF
pdfOrganiser.submit=Reorganizar páginas
#multiTool
multiTool.title=Multiferramenta de PDF
multiTool.header=Multiferramenta de PDF
#pageRemover
pageRemover.title=Removedor de página
pageRemover.header=Removedor de página PDF
pageRemover.pagesToDelete=Páginas a serem excluídas (digite uma lista separada por vírgulas de números de página):
pageRemover.submit=Excluir páginas
#rotate
rotate.title=Girar PDF
rotate.header=Girar PDF
rotate.selectAngle=Selecione o ângulo de rotação (em múltiplos de 90 graus):
rotate.submit=Girar
#merge
split.title=PDF dividido
split.header=PDF dividido
split.desc.1=Os números que você selecionar são o número da página na qual você deseja fazer uma divisão
split.desc.2=Assim, selecionar 1,3,7-8 dividiria um documento de 10 páginas em 6 PDFS separados com:
split.desc.3=Documento nº 1: página 1
split.desc.4=Documento nº 2: páginas 2 e 3
split.desc.5=Documento nº 3: Página 4, 5 e 6
split.desc.6=Documento nº 4: página 7
split.desc.7=Documento nº 5: página 8
split.desc.8=Documento nº 6: páginas 9 e 10
split.splitPages=Digite as páginas para dividir:
split.submit=Dividir
#merge
imageToPDF.title=Imagem para PDF
imageToPDF.header=Imagem para PDF
imageToPDF.submit=Converter
imageToPDF.selectText.1=Esticar para caber
imageToPDF.selectText.2=Girar PDF automaticamente
imageToPDF.selectText.3=Lógica de vários arquivos (Ativado apenas se estiver trabalhando com várias imagens)
imageToPDF.selectText.4=Mesclar em um único PDF
imageToPDF.selectText.5=Converter em PDFs separados
#pdfToImage
pdfToImage.title=PDF para imagem
pdfToImage.header=PDF para imagem
pdfToImage.selectText=Formato de imagem
pdfToImage.singleOrMultiple=Tipo de resultado de imagem
pdfToImage.single=Imagem grande única
pdfToImage.multi=Imagens múltiplas
pdfToImage.colorType=tipo de cor
pdfToImage.color=Cor
pdfToImage.grey=Escala de cinza
pdfToImage.blackwhite=Preto e branco (pode perder dados!)
pdfToImage.submit=Converter
#addPassword
addPassword.title=Adicionar senha
addPassword.header=Adicionar senha (Criptografar)
addPassword.selectText.1=Selecione PDF para criptografar
addPassword.selectText.2=Senha
addPassword.selectText.3=Comprimento da chave de criptografia
addPassword.selectText.4=Valores mais altos são mais fortes, mas valores mais baixos têm melhor compatibilidade.
addPassword.selectText.5=Permissões para definir
addPassword.selectText.6=Impedir a montagem do documento
addPassword.selectText.7=Impedir a extração de conteúdo
addPassword.selectText.8=Impedir a extração para acessibilidade
addPassword.selectText.9=Impedir o preenchimento do formulário
addPassword.selectText.10=Impedir modificação
addPassword.selectText.11=Impedir a modificação da anotação
addPassword.selectText.12=Impedir a impressão
addPassword.selectText.13=Impedir a impressão de formatos diferentes
addPassword.selectText.14=Owner Password
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
addPassword.selectText.16=Restricts the opening of the document itself
addPassword.submit=criptografar
#watermark
watermark.title=Adicione uma Marca d'água
watermark.header=Adicione uma Marca d'água
watermark.selectText.1=Selecione PDF para adicionar marca d'água a:
watermark.selectText.2=Texto da marca d'água:
watermark.selectText.3=Tamanho da fonte:
watermark.selectText.4=Rotação (0-360):
watermark.selectText.5=widthSpacer (espaço entre cada marca d'água horizontalmente):
watermark.selectText.6=heightSpacer (espaço entre cada marca d'água verticalmente):
watermark.selectText.7=Opacidade (0% - 100%):
watermark.submit=Adicione uma Marca d'água
#remove-watermark
remove-watermark.title=Remover marca d'água
remove-watermark.header=Remover marca d'água
remove-watermark.selectText.1=Selecione PDF para remover a marca d'água de:
remove-watermark.selectText.2=Texto da marca d'água:
remove-watermark.submit=Remover marca d'água
#Change permissions
permissions.title=Alterar permissões
permissions.header=Alterar permissões
permissions.warning=Aviso para que essas permissões sejam inalteráveis, é recomendável defini-las com uma senha por meio da página adicionar senha
permissions.selectText.1=Selecione o PDF para alterar as permissões
permissions.selectText.2=Permissões para definir
permissions.selectText.3=Impedir a montagem do documento
permissions.selectText.4=Impedir a extração de conteúdo
permissions.selectText.5=Impedir extração para acessibilidade
permissions.selectText.6=Impedir o preenchimento do formulário
permissions.selectText.7=Impedir modificações
permissions.selectText.8=Impedir a modificação da anotação
permissions.selectText.9=Impedir a impressão
permissions.selectText.10=Impedir a impressão de formatos diferentes
permissions.submit=Mudar
#remove password
removePassword.title=Remover senha
removePassword.header=Remover senha (Descriptografar)
removePassword.selectText.1=Selecione PDF para descriptografar
removePassword.selectText.2=Senha
removePassword.submit=Remover
#changeMetadata
changeMetadata.title=Título:
changeMetadata.header=Alterar metadados
changeMetadata.selectText.1=Edite as variáveis que deseja alterar
changeMetadata.selectText.2=Excluir todos os metadados
changeMetadata.selectText.3=Mostrar metadados personalizados:
changeMetadata.author=Autor:
changeMetadata.creationDate=Data de Criação (aaaa/MM/dd HH:mm:ss):
changeMetadata.creator=O Criador:
changeMetadata.keywords=Palavras-chave:
changeMetadata.modDate=Data de modificação (aaaa/MM/dd HH:mm:ss):
changeMetadata.producer=Produtor:
changeMetadata.subject=Assunto:
changeMetadata.title=Título:
changeMetadata.trapped=Encurralado:
changeMetadata.selectText.4=Outros metadados:
changeMetadata.selectText.5=Adicionar entrada de metadados personalizados
changeMetadata.submit=Mudar
#xlsToPdf
xlsToPdf.title=Excel para PDF
xlsToPdf.header=Excel para PDF
xlsToPdf.selectText.1=Selecione planilha Excel XLS ou XLSX para converter
xlsToPdf.convert=converter
#pdfToPDFA
pdfToPDFA.title=PDF para PDF/A
pdfToPDFA.header=PDF para PDF/A
pdfToPDFA.credit=Este serviço usa OCRmyPDF para conversão de PDF/A
pdfToPDFA.submit=Converter
#PDFToWord
PDFToWord.title=PDF para Word
PDFToWord.header=PDF para Word
PDFToWord.selectText.1=Formato do arquivo de saída
PDFToWord.credit=Este serviço usa o LibreOffice para conversão de arquivos.
PDFToWord.submit=Converter
#PDFToPresentation
PDFToPresentation.title=PDF para apresentação
PDFToPresentation.header=PDF para apresentação
PDFToPresentation.selectText.1=Formato do arquivo de saída
PDFToPresentation.credit=Este serviço usa o LibreOffice para conversão de arquivos.
PDFToPresentation.submit=Converter
#PDFToText
PDFToText.title=PDF para Texto/RTF
PDFToText.header=PDF para Texto/RTF
PDFToText.selectText.1=Formato do arquivo de saída
PDFToText.credit=Este serviço usa o LibreOffice para conversão de arquivos.
PDFToText.submit=Converter
#PDFToHTML
PDFToHTML.title=PDF para HTML
PDFToHTML.header=PDF para HTML
PDFToHTML.credit=Este serviço usa o LibreOffice para conversão de arquivos.
PDFToHTML.submit=Converter
#PDFToXML
PDFToXML.title=PDF para XML
PDFToXML.header=PDF para XML
PDFToXML.credit=Este serviço usa o LibreOffice para conversão de arquivos.
PDFToXML.submit=Converter

View File

@@ -0,0 +1,788 @@
###########
# Generic #
###########
# the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr
pdfPrompt=Selectează fișiere PDF
multiPdfPrompt=Selectează mai multe fișiere PDF (2+)
multiPdfDropPrompt=Selectează (sau trage și plasează) toate fișierele PDF de care ai nevoie
imgPrompt=Selectează imagini
genericSubmit=Trimite
processTimeWarning=Avertisment: Acest proces poate dura până la un minut în funcție de dimensiunea fișierului
pageOrderPrompt=Ordinea paginilor (Introdu o listă separată prin virgulă de numere de pagină):
goToPage=Mergi la pagină
true=Adevărat
false=Fals
unknown=Necunoscut
save=Salvează
close=Închide
filesSelected=fișiere selectate
noFavourites=Niciun favorit adăugat
bored=Plictisit așteptând?
alphabet=Alfabet
downloadPdf=Descarcă PDF
text=Text
font=Font
selectFillter=-- Selectează --
pageNum=Numărul paginii
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
#############
# NAVBAR #
#############
navbar.convert=Converteste
navbar.security=Securitate
navbar.other=Altele
navbar.darkmode=Mod întunecat
navbar.pageOps=Operații pe pagină
navbar.settings=Setări
#############
# SETTINGS #
#############
settings.title=Setări
settings.update=Actualizare disponibilă
settings.appVersion=Versiune aplicație:
settings.downloadOption.title=Alege opțiunea de descărcare (pentru descărcarea unui singur fișier non-zip):
settings.downloadOption.1=Deschide în aceeași fereastră
settings.downloadOption.2=Deschide într-o fereastră nouă
settings.downloadOption.3=Descarcă fișierul
settings.zipThreshold=Împachetează fișierele când numărul de fișiere descărcate depășește
#############
# HOME-PAGE #
#############
home.desc=Un singur punct de oprire găzduit local pentru toate nevoile tale legate de fișiere PDF.
home.multiTool.title=Instrument multiplu PDF
home.multiTool.desc=Unifică, rotește, rearanjează și elimină pagini
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
home.merge.title=Unifică
home.merge.desc=Unifică cu ușurință mai multe fișiere PDF într-unul singur.
merge.tags=merge,Page operations,Back end,server side
home.split.title=Desparte
home.split.desc=Desparte fișierele PDF în mai multe documente.
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=Rotește
home.rotate.desc=Rotește cu ușurință fișierele PDF.
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
home.imageToPdf.title=Imagine în PDF
home.imageToPdf.desc=Convertește o imagine (PNG, JPEG, GIF) în PDF.
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=PDF în Imagine
home.pdfToImage.desc=Convertește un fișier PDF în imagine (PNG, JPEG, GIF).
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=Organizează
home.pdfOrganiser.desc=Elimină/rearanjează pagini în orice ordine
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=Adaugă imagine
home.addImage.desc=Adaugă o imagine într-o locație specifică pe PDF (în curs de dezvoltare)
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
home.watermark.title=Adaugă Filigran
home.watermark.desc=Adaugă un filigran personalizat la documentul PDF.
##########################
### TODO: Translate ###
##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.permissions.title=Schimbă permisiuni
home.permissions.desc=Schimbă permisiunile documentului PDF
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
home.removePages.title=Elimină
home.removePages.desc=Șterge paginile nedorite din documentul PDF.
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
home.addPassword.title=Adaugă Parolă
home.addPassword.desc=Criptează documentul PDF cu o parolă.
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
home.removePassword.title=Elimină Parola
home.removePassword.desc=Elimină protecția cu parolă din documentul PDF.
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=Comprimă
home.compressPdfs.desc=Comprimă fișierele PDF pentru a reduce dimensiunea lor.
##########################
### TODO: Translate ###
##########################
compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=Schimbă Metadatele
home.changeMetadata.desc=Schimbă/Elimină/Adaugă metadate într-un document PDF.
##########################
### TODO: Translate ###
##########################
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=Convertește fișierul în PDF
home.fileToPDF.desc=Convertește aproape orice fișier în format PDF (DOCX, PNG, XLS, PPT, TXT și altele).
##########################
### TODO: Translate ###
##########################
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=OCR / Curățare scanări
home.ocr.desc=Curăță scanările și detectează textul din imaginile dintr-un PDF și îl adaugă ca text.
##########################
### TODO: Translate ###
##########################
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
home.extractImages.title=Extrage Imagini
home.extractImages.desc=Extrage toate imaginile dintr-un PDF și le salvează într-un fișier zip.
##########################
### TODO: Translate ###
##########################
extractImages.tags=picture,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=PDF în PDF/A
home.pdfToPDFA.desc=Convertește un document PDF în format PDF/A pentru stocare pe termen lung.
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=PDF în Word
home.PDFToWord.desc=Convertește un document PDF în formate Word (DOC, DOCX și ODT).
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=PDF în Prezentare
home.PDFToPresentation.desc=Convertește un document PDF în formate de prezentare (PPT, PPTX și ODP).
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=PDF în Text/RTF
home.PDFToText.desc=Convertește un document PDF în format Text sau RTF.
##########################
### TODO: Translate ###
##########################
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDF în HTML
home.PDFToHTML.desc=Convertește un document PDF în format HTML.
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=PDF în XML
home.PDFToXML.desc=Convertește un document PDF în format XML.
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=Detectează/Împarte poze scanate
home.ScannerImageSplit.desc=Împarte mai multe poze dintr-o poză/PDF.
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title=Semnează
home.sign.desc=Adaugă o semnătură la documentul PDF prin desenare, text sau imagine.
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=Nivelare
home.flatten.desc=Elimină toate elementele interactive și formularele dintr-un PDF.
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title=Repară
home.repair.desc=Încearcă să repare un document PDF corupt/defect.
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
home.removeBlanks.title=Elimină pagini goale
home.removeBlanks.desc=Detectează și elimină paginile goale dintr-un document.
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title=Compară
home.compare.desc=Compară și arată diferențele dintre 2 documente PDF.
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
home.certSign.title=Semnare cu certificat
home.certSign.desc=Semnează un PDF cu un certificat/cheie (PEM/P12)
##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Multi-Page Layout
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
##########################
### TODO: Translate ###
##########################
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=Adjust page size/scale
home.scalePages.desc=Change the size/scale of page and/or its contents.
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
##########################
### TODO: Translate ###
##########################
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
##########################
### TODO: Translate ###
##########################
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
##########################
### TODO: Translate ###
##########################
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
##########################
### TODO: Translate ###
##########################
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
##########################
### TODO: Translate ###
##########################
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
##########################
### TODO: Translate ###
##########################
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
##########################
### TODO: Translate ###
##########################
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Multi Page Layout
pageLayout.header=Multi Page Layout
pageLayout.pagesPerSheet=Pages per sheet:
pageLayout.submit=Submit
#scalePages
scalePages.title=Adjust page-scale
scalePages.header=Adjust page-scale
scalePages.pageSize=Size of a page of the document.
scalePages.scaleFactor=Zoom level (crop) of a page.
scalePages.submit=Submit
#certSign
certSign.title=Semnare certificat
certSign.header=Semnează un fișier PDF cu certificatul tău (În curs de desfășurare)
certSign.selectPDF=Selectează un fișier PDF pentru semnare:
certSign.selectKey=Selectează fișierul cheie privată (format PKCS#8, poate fi .pem sau .der):
certSign.selectCert=Selectează fișierul de certificat (format X.509, poate fi .pem sau .der):
certSign.selectP12=Selectează fișierul de stocare cheie PKCS#12 (.p12 sau .pfx) (Opțional, dacă este furnizat, ar trebui să conțină cheia privată și certificatul tău):
certSign.certType=Tipul certificatului
certSign.password=Introdu parola pentru stocarea cheie sau cheia privată (dacă există):
certSign.showSig=Afișează semnătura
certSign.reason=Motivul
certSign.location=Locația
certSign.name=Numele
certSign.submit=Semnează PDF
#removeBlanks
removeBlanks.title=Elimină pagini goale
removeBlanks.header=Elimină pagini goale
removeBlanks.threshold=Prag:
removeBlanks.thresholdDesc=Prag pentru determinarea cât de alb trebuie să fie un pixel alb
removeBlanks.whitePercent=Procent alb (%):
removeBlanks.whitePercentDesc=Procentul paginii care trebuie să fie alb pentru a fi eliminată
removeBlanks.submit=Elimină pagini goale
#compare
compare.title=Compară
compare.header=Compară PDF-uri
compare.document.1=Document 1
compare.document.2=Document 2
compare.submit=Compară
#sign
sign.title=Semnează
sign.header=Semnează documente PDF
sign.upload=Încarcă Imaginea
sign.draw=Desenează Semnătura
sign.text=Introdu Textul
sign.clear=Curăță
sign.add=Adaugă
#repair
repair.title=Repară
repair.header=Repară documente PDF
repair.submit=Repară
#flatten
flatten.title=Nivelare
flatten.header=Nivelează documente PDF
flatten.submit=Nivelează
#ScannerImageSplit
ScannerImageSplit.selectText.1=Prag unghi:
ScannerImageSplit.selectText.2=Stabilește unghiul absolut minim necesar pentru ca imaginea să fie rotită (implicit: 5).
ScannerImageSplit.selectText.3=Toleranță:
ScannerImageSplit.selectText.4=Determină intervalul de variație a culorii în jurul culorii de fundal estimate (implicit: 20).
ScannerImageSplit.selectText.5=Arie minimă:
ScannerImageSplit.selectText.6=Stabilește pragul minim de arie pentru o fotografie (implicit: 8000).
ScannerImageSplit.selectText.7=Arie minimă a conturului:
ScannerImageSplit.selectText.8=Stabilește pragul minim de arie a conturului pentru o fotografie.
ScannerImageSplit.selectText.9=Mărimea marginii:
ScannerImageSplit.selectText.10=Stabilește mărimea marginii adăugate și eliminate pentru a evita marginile albe în rezultat (implicit: 1).
#OCR
ocr.title=OCR / Curățare scanare
ocr.header=Curățare scanări / OCR (Recunoaștere optică a caracterelor)
ocr.selectText.1=Selectați limbile care trebuie detectate în PDF (Cele listate sunt cele detectate în prezent):
ocr.selectText.2=Produceți un fișier text care conține textul OCR împreună cu PDF-ul OCR
ocr.selectText.3=Corectați paginile care au fost scanate în unghi înclinat prin rotirea lor în poziție corectă
ocr.selectText.4=Curățați pagina astfel încât să fie mai puțin probabil ca OCR-ul să găsească text în zgomotul de fundal. (Nu se schimbă rezultatul)
ocr.selectText.5=Curățați pagina astfel încât să fie mai puțin probabil ca OCR-ul să găsească text în zgomotul de fundal, menține curățarea în rezultat.
ocr.selectText.6=Ignorați paginile care conțin text interactiv, OCR-ul se aplică doar paginilor care sunt imagini
ocr.selectText.7=Forțează OCR-ul, va aplica OCR pe fiecare pagină, înlăturând toate elementele de text originale
ocr.selectText.8=Normal (Va genera eroare dacă PDF-ul conține text)
ocr.selectText.9=Setări suplimentare
ocr.selectText.10=Mod OCR
ocr.selectText.11=Elimină imaginile după OCR (Elimină TOATE imaginile, util doar în etapa de conversie)
ocr.selectText.12=Tip de redare (Avansat)
ocr.help=Citiți documentația pentru a afla cum să utilizați acest serviciu pentru alte limbi și/sau în afara mediului Docker
ocr.credit=Acest serviciu utilizează OCRmyPDF și Tesseract pentru OCR.
ocr.submit=Procesează PDF-ul cu OCR
#extractImages
extractImages.title=Extrage Imagini
extractImages.header=Extrage Imagini
extractImages.selectText=Selectați formatul imaginii în care să se convertească imaginile extrase
extractImages.submit=Extrage
#File to PDF
fileToPDF.title=Fișier în PDF
fileToPDF.header=Convertiți orice fișier în PDF
fileToPDF.credit=Acest serviciu utilizează LibreOffice și Unoconv pentru conversia fișierelor.
fileToPDF.supportedFileTypes=Tipurile de fișiere suportate ar trebui să includă cele de mai jos. Pentru o listă completă și actualizată a formatelor suportate, consultați documentația LibreOffice.
fileToPDF.submit=Convertiți în PDF
#compress
compress.title=Comprimare
compress.header=Comprimare PDF
compress.credit=Acest serviciu utilizează OCRmyPDF pentru comprimarea/optimalizarea PDF-urilor.
compress.selectText.1=Nivel de optimizare:
compress.selectText.2=0 (Fără optimizare)
compress.selectText.3=1 (Implicit, optimizare fără pierdere)
compress.selectText.4=2 (Optimizare cu pierdere)
compress.selectText.5=3 (Optimizare cu pierdere, mai agresivă)
compress.submit=Comprimare
#Add image
addImage.title=Adăugare imagine
addImage.header=Adăugare imagine în PDF
addImage.everyPage=Pe fiecare pagină?
addImage.upload=Adăugare imagine
addImage.submit=Adăugare imagine
#merge
merge.title=Unire
merge.header=Unirea mai multor PDF-uri (2+)
merge.submit=Unire
#pdfOrganiser
pdfOrganiser.title=Organizator de pagini
pdfOrganiser.header=Organizator de pagini PDF
pdfOrganiser.submit=Rearanjați paginile
#multiTool
multiTool.title=Instrument PDF multiplu
multiTool.header=Instrument PDF multiplu
#pageRemover
pageRemover.title=Înlăturare pagini
pageRemover.header=Înlăturare pagini din PDF
pageRemover.pagesToDelete=Pagini de șters (Introduceți o listă de numere de pagini separate prin virgulă):
pageRemover.submit=Ștergere pagini
#rotate
rotate.title=Rotește PDF
rotate.header=Rotește PDF
rotate.selectAngle=Selectați un unghi de rotație (în multiplicate de 90 de grade):
rotate.submit=Rotește
#merge
split.title=Împarte PDF
split.header=Împarte PDF
split.desc.1=Numerele pe care le selectați reprezintă numărul paginii pe care doriți să o împărțiți
split.desc.2=Prin urmare, selectând 1,3,7-8, un document cu 10 pagini va fi împărțit în 6 PDF-uri separate, astfel:
split.desc.3=Documentul #1: Pagina 1
split.desc.4=Documentul #2: Paginile 2 și 3
split.desc.5=Documentul #3: Paginile 4, 5 și 6
split.desc.6=Documentul #4: Pagina 7
split.desc.7=Documentul #5: Pagina 8
split.desc.8=Documentul #6: Paginile 9 și 10
split.splitPages=Introduceți paginile pe care să le împărțiți:
split.submit=Împarte
#merge
imageToPDF.title=Imagine în PDF
imageToPDF.header=Imagine în PDF
imageToPDF.submit=Convertă
imageToPDF.selectText.1=Redimensionare pentru a se potrivi
imageToPDF.selectText.2=Rotire automată a PDF-ului
imageToPDF.selectText.3=Logica pentru mai multe fișiere (activată numai dacă se lucrează cu mai multe imagini)
imageToPDF.selectText.4=Unifică într-un singur PDF
imageToPDF.selectText.5=Convertă în PDF-uri separate
#pdfToImage
pdfToImage.title=PDF în Imagine
pdfToImage.header=PDF în Imagine
pdfToImage.selectText=Format imagine
pdfToImage.singleOrMultiple=Tip rezultat imagine
pdfToImage.single=O singură imagine mare
pdfToImage.multi=Mai multe imagini
pdfToImage.colorType=Tip culoare
pdfToImage.color=Culoare
pdfToImage.grey=Scală de gri
pdfToImage.blackwhite=Alb și negru (Poate pierde date!)
pdfToImage.submit=Convertă
#addPassword
addPassword.title=Adăugați parolă
addPassword.header=Adăugați o parolă (Criptare)
addPassword.selectText.1=Selectați PDF-ul pentru criptare
addPassword.selectText.2=Parolă
addPassword.selectText.3=Lungime cheie de criptare
addPassword.selectText.4=Valori mai mari sunt mai puternice, dar valorile mai mici au o compatibilitate mai bună.
addPassword.selectText.5=Permisiuni de setare
addPassword.selectText.6=Preveniți asamblarea documentului
addPassword.selectText.7=Preveniți extragerea conținutului
addPassword.selectText.8=Preveniți extragerea pentru accesibilitate
addPassword.selectText.9=Preveniți completarea formularului
addPassword.selectText.10=Preveniți modificarea
addPassword.selectText.11=Preveniți modificarea adnotărilor
addPassword.selectText.12=Preveniți tipărirea
addPassword.selectText.13=Preveniți tipărirea în formate diferite
addPassword.selectText.14=Owner Password
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
addPassword.selectText.16=Restricts the opening of the document itself
addPassword.submit=Criptare
#watermark
watermark.title=Adăugați Filigran
watermark.header=Adăugați Filigran
watermark.selectText.1=Selectați PDF-ul la care să adăugați filigranul:
watermark.selectText.2=Textul Filigranului:
watermark.selectText.3=Mărimea fontului:
watermark.selectText.4=Rotire (0-360):
watermark.selectText.5=widthSpacer (Spațiu între fiecare filigran pe orizontală):
watermark.selectText.6=heightSpacer (Spațiu între fiecare filigran pe verticală):
watermark.selectText.7=Opacitate (0% - 100%):
watermark.submit=Adăugați Filigran
#remove-watermark
remove-watermark.title=Eliminați Filigran
remove-watermark.header=Eliminați Filigran
remove-watermark.selectText.1=Selectați PDF-ul de la care să eliminați filigranul:
remove-watermark.selectText.2=Textul Filigranului:
remove-watermark.submit=Eliminați Filigran
#Change permissions
permissions.title=Schimbați Permisiunile
permissions.header=Schimbați Permisiunile
permissions.warning=Pentru a face aceste permisiuni neschimbabile, se recomandă să le setați cu o parolă prin intermediul paginii de adăugare a parolei
permissions.selectText.1=Selectați PDF-ul pentru a schimba permisiunile
permissions.selectText.2=Permisiunile de setat
permissions.selectText.3=Preveniți asamblarea documentului
permissions.selectText.4=Preveniți extragerea conținutului
permissions.selectText.5=Preveniți extragerea pentru accesibilitate
permissions.selectText.6=Preveniți completarea formularului
permissions.selectText.7=Preveniți modificarea
permissions.selectText.8=Preveniți modificarea adnotărilor
permissions.selectText.9=Preveniți tipărirea
permissions.selectText.10=Preveniți tipărirea în formate diferite
permissions.submit=Schimbare
#remove password
removePassword.title=Eliminați parola
removePassword.header=Eliminați parola (Decodificați)
removePassword.selectText.1=Selectați PDF-ul pentru decodificare
removePassword.selectText.2=Parolă
removePassword.submit=Eliminați
#changeMetadata
changeMetadata.title=Titlu:
changeMetadata.header=Schimbați Metadatele
changeMetadata.selectText.1=Vă rugăm să editați variabilele pe care doriți să le schimbați
changeMetadata.selectText.2=Ștergeți toate metadatele
changeMetadata.selectText.3=Afișați Metadatele Personalizate:
changeMetadata.author=Autor:
changeMetadata.creationDate=Data creării (yyyy/MM/dd HH:mm:ss):
changeMetadata.creator=Creator:
changeMetadata.keywords=Cuvinte cheie:
changeMetadata.modDate=Data modificării (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=Producător:
changeMetadata.subject=Subiect:
changeMetadata.title=Titlu:
changeMetadata.trapped=Blocat:
changeMetadata.selectText.4=Alte Metadate:
changeMetadata.selectText.5=Adăugați Intrare Metadate Personalizate
changeMetadata.submit=Schimbare
#xlsToPdf
xlsToPdf.title=Excel to PDF
xlsToPdf.header=Excel to PDF
xlsToPdf.selectText.1=Selectați fișierul Excel XLS sau XLSX pentru a converti
xlsToPdf.convert=convert
#pdfToPDFA
pdfToPDFA.title=PDF către PDF/A
pdfToPDFA.header=PDF către PDF/A
pdfToPDFA.credit=Acest serviciu utilizează OCRmyPDF pentru conversia în PDF/A
pdfToPDFA.submit=Convert
#PDFToWord
PDFToWord.title=PDF către Word
PDFToWord.header=PDF către Word
PDFToWord.selectText.1=Format fișier de ieșire
PDFToWord.credit=Acest serviciu utilizează LibreOffice pentru conversia fișierului.
PDFToWord.submit=Convert
#PDFToPresentation
PDFToPresentation.title=PDF către Prezentare
PDFToPresentation.header=PDF către Prezentare
PDFToPresentation.selectText.1=Format fișier de ieșire
PDFToPresentation.credit=Acest serviciu utilizează LibreOffice pentru conversia fișierului.
PDFToPresentation.submit=Convert
#PDFToText
PDFToText.title=PDF către Text/RTF
PDFToText.header=PDF către Text/RTF
PDFToText.selectText.1=Format fișier de ieșire
PDFToText.credit=Acest serviciu utilizează LibreOffice pentru conversia fișierului.
PDFToText.submit=Convert
#PDFToHTML
PDFToHTML.title=PDF către HTML
PDFToHTML.header=PDF către HTML
PDFToHTML.credit=Acest serviciu utilizează LibreOffice pentru conversia fișierului.
PDFToHTML.submit=Convert
#PDFToXML
PDFToXML.title=PDF către XML
PDFToXML.header=PDF către XML
PDFToXML.credit=Acest serviciu utilizează LibreOffice pentru conversia fișierului.
PDFToXML.submit=Convert

View File

@@ -1,7 +1,7 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr = left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr language.direction=ltr
pdfPrompt=Выберите PDF(ы) pdfPrompt=Выберите PDF(ы)
@@ -20,115 +20,456 @@ close=Закрыть
filesSelected=файлов выбрано filesSelected=файлов выбрано
noFavourites=Нет избранного noFavourites=Нет избранного
bored=Скучно ждать? bored=Скучно ждать?
alphabet=\u0430\u043B\u0444\u0430\u0432\u0438\u0442
downloadPdf=Скачать PDF
text=Текст
font=Шрифт
selectFillter=-- Выбрать --
pageNum=номер страницы
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
#############
# NAVBAR #
#############
navbar.convert=Конвертировать
navbar.security=Безопасность
navbar.other=Другое
navbar.darkmode=Темный режим
navbar.pageOps=Операции со страницей
navbar.settings=Настройки
#############
# SETTINGS #
#############
settings.title=Настройки
settings.update=Доступно обновление
settings.appVersion=Версия приложения:
settings.downloadOption.title=Выберите вариант загрузки (для загрузки одного файла без zip):
settings.downloadOption.1=Открыть в том же окне
settings.downloadOption.2=Открыть в новом окне
settings.downloadOption.3=Загрузить файл
settings.zipThreshold=Zip-файлы, когда количество загруженных файлов превышает
############# #############
# HOME-PAGE # # HOME-PAGE #
############# #############
home.desc=Ваш локальный универсальный магазин для всех ваших потребностей в PDF. home.desc=Ваш локальный универсальный магазин для всех ваших потребностей в PDF.
navbar.convert=Конвертировать
navbar.security=Безопасность
navbar.other=Другое
navbar.darkmode=Темный режим
navbar.pageOps=Операции со страницей
home.multiTool.title=Мультиинструмент PDF home.multiTool.title=Мультиинструмент PDF
home.multiTool.desc=Объединение, поворот, изменение порядка и удаление страниц home.multiTool.desc=Объединение, поворот, изменение порядка и удаление страниц
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
home.merge.title=Объединить home.merge.title=Объединить
home.merge.desc=Легко объединяйте несколько PDF-файлов в один. home.merge.desc=Легко объединяйте несколько PDF-файлов в один.
merge.tags=merge,Page operations,Back end,server side
home.split.title=Разделить home.split.title=Разделить
home.split.desc=Разделить PDF-файлы на несколько документов home.split.desc=Разделить PDF-файлы на несколько документов
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=Повернуть home.rotate.title=Повернуть
home.rotate.desc=Легко поворачивайте свои PDF-файлы. home.rotate.desc=Легко поворачивайте свои PDF-файлы.
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
home.imageToPdf.title=Изображение в PDF home.imageToPdf.title=Изображение в PDF
home.imageToPdf.desc=Преобразование изображения (PNG, JPEG, GIF) в PDF. home.imageToPdf.desc=Преобразование изображения (PNG, JPEG, GIF) в PDF.
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=PDF в изображение home.pdfToImage.title=PDF в изображение
home.pdfToImage.desc=Преобразование PDF в изображение. (PNG, JPEG, GIF) home.pdfToImage.desc=Преобразование PDF в изображение. (PNG, JPEG, GIF)
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=Реорганизация home.pdfOrganiser.title=Реорганизация
home.pdfOrganiser.desc=Удалить/переставить страницы в любом порядке home.pdfOrganiser.desc=Удалить/переставить страницы в любом порядке
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=Добавить изображение home.addImage.title=Добавить изображение
home.addImage.desc=Добавляет изображение в заданное место в PDF (в процессе) home.addImage.desc=Добавляет изображение в заданное место в PDF (в процессе)
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
home.watermark.title=Добавить водяной знак home.watermark.title=Добавить водяной знак
home.watermark.desc=Добавьте собственный водяной знак в документ PDF. home.watermark.desc=Добавьте собственный водяной знак в документ PDF.
##########################
home.remove-watermark.title=Удалить водяной знак ### TODO: Translate ###
home.remove-watermark.desc=Удалите водяные знаки из документа PDF. ##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.permissions.title=Изменить разрешения home.permissions.title=Изменить разрешения
home.permissions.desc=Измените разрешения вашего PDF-документа home.permissions.desc=Измените разрешения вашего PDF-документа
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
home.removePages.title=Удаление home.removePages.title=Удаление
home.removePages.desc=Удалите ненужные страницы из документа PDF. home.removePages.desc=Удалите ненужные страницы из документа PDF.
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
home.addPassword.title=Добавить пароль home.addPassword.title=Добавить пароль
home.addPassword.desc=Зашифруйте PDF-документ паролем. home.addPassword.desc=Зашифруйте PDF-документ паролем.
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
home.removePassword.title=Удалить пароль home.removePassword.title=Удалить пароль
home.removePassword.desc=Снимите защиту паролем с вашего PDF-документа. home.removePassword.desc=Снимите защиту паролем с вашего PDF-документа.
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=Сжать home.compressPdfs.title=Сжать
home.compressPdfs.desc=Сжимайте PDF-файлы, чтобы уменьшить их размер. home.compressPdfs.desc=Сжимайте PDF-файлы, чтобы уменьшить их размер.
##########################
### TODO: Translate ###
##########################
compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=Изменить метаданные home.changeMetadata.title=Изменить метаданные
home.changeMetadata.desc=Изменить/удалить/добавить метаданные из документа PDF home.changeMetadata.desc=Изменить/удалить/добавить метаданные из документа PDF
##########################
### TODO: Translate ###
##########################
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=Конвертировать файл в PDF home.fileToPDF.title=Конвертировать файл в PDF
home.fileToPDF.desc=Конвертируйте практически любой файл в PDF (DOCX, PNG, XLS, PPT, TXT и другие) home.fileToPDF.desc=Конвертируйте практически любой файл в PDF (DOCX, PNG, XLS, PPT, TXT и другие)
##########################
### TODO: Translate ###
##########################
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=OCR / Очистка сканирования home.ocr.title=OCR / Очистка сканирования
home.ocr.desc=Очистка сканирования и обнаружение текста на изображениях в PDF-файле и повторно добавляет его как текст. home.ocr.desc=Очистка сканирования и обнаружение текста на изображениях в PDF-файле и повторно добавляет его как текст.
##########################
### TODO: Translate ###
##########################
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
home.extractImages.title=Извлечь изображения home.extractImages.title=Извлечь изображения
home.extractImages.desc=Извлекает все изображения из PDF и сохраняет их в zip home.extractImages.desc=Извлекает все изображения из PDF и сохраняет их в zip
##########################
### TODO: Translate ###
##########################
extractImages.tags=picture,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=PDF в PDF/A home.pdfToPDFA.title=PDF в PDF/A
home.pdfToPDFA.desc=Преобразование PDF в PDF/A для длительного хранения home.pdfToPDFA.desc=Преобразование PDF в PDF/A для длительного хранения
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=PDF в Word home.PDFToWord.title=PDF в Word
home.PDFToWord.desc=Преобразование PDF в форматы Word (DOC, DOCX и ODT) home.PDFToWord.desc=Преобразование PDF в форматы Word (DOC, DOCX и ODT)
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=PDF в презентацию home.PDFToPresentation.title=PDF в презентацию
home.PDFToPresentation.desc=Преобразование PDF в форматы презентаций (PPT, PPTX и ODP) home.PDFToPresentation.desc=Преобразование PDF в форматы презентаций (PPT, PPTX и ODP)
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=PDF в Text/RTF home.PDFToText.title=PDF в Text/RTF
home.PDFToText.desc=Преобразование PDF в текстовый или RTF формат home.PDFToText.desc=Преобразование PDF в текстовый или RTF формат
##########################
### TODO: Translate ###
##########################
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDF в HTML home.PDFToHTML.title=PDF в HTML
home.PDFToHTML.desc=Преобразование PDF в формат HTML home.PDFToHTML.desc=Преобразование PDF в формат HTML
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=PDF в XML home.PDFToXML.title=PDF в XML
home.PDFToXML.desc=Преобразование PDF в формат XML home.PDFToXML.desc=Преобразование PDF в формат XML
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=Обнаружение/разделение отсканированных фотографий home.ScannerImageSplit.title=Обнаружение/разделение отсканированных фотографий
home.ScannerImageSplit.desc=Разделяет несколько фотографий из фото/PDF home.ScannerImageSplit.desc=Разделяет несколько фотографий из фото/PDF
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title=Подпись home.sign.title=Подпись
home.sign.desc=Добавляет подпись в PDF с помощью рисунка, текста или изображения home.sign.desc=Добавляет подпись в PDF с помощью рисунка, текста или изображения
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=Сглаживание home.flatten.title=Сглаживание
home.flatten.desc=Удалить все интерактивные элементы и формы из PDF home.flatten.desc=Удалить все интерактивные элементы и формы из PDF
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title=Ремонт home.repair.title=Ремонт
home.repair.desc=Пытается восстановить поврежденный/сломанный PDF home.repair.desc=Пытается восстановить поврежденный/сломанный PDF
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
home.removeBlanks.title=Удалить пустые страницы home.removeBlanks.title=Удалить пустые страницы
home.removeBlanks.desc=Обнаруживает и удаляет пустые страницы из документа home.removeBlanks.desc=Обнаруживает и удаляет пустые страницы из документа
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title=Сравнение home.compare.title=Сравнение
home.compare.desc=Сравнивает и показывает различия между двумя PDF-документами home.compare.desc=Сравнивает и показывает различия между двумя PDF-документами
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
downloadPdf=Скачать PDF home.certSign.title=Sign with Certificate
text=Текст home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
font=Шрифт ##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Multi-Page Layout
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
##########################
### TODO: Translate ###
##########################
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=Adjust page size/scale
home.scalePages.desc=Change the size/scale of page and/or its contents.
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
##########################
### TODO: Translate ###
##########################
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
##########################
### TODO: Translate ###
##########################
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
##########################
### TODO: Translate ###
##########################
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
##########################
### TODO: Translate ###
##########################
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
##########################
### TODO: Translate ###
##########################
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
##########################
### TODO: Translate ###
##########################
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
##########################
### TODO: Translate ###
##########################
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Multi Page Layout
pageLayout.header=Multi Page Layout
pageLayout.pagesPerSheet=Pages per sheet:
pageLayout.submit=Submit
#scalePages
scalePages.title=Adjust page-scale
scalePages.header=Adjust page-scale
scalePages.pageSize=Size of a page of the document.
scalePages.scaleFactor=Zoom level (crop) of a page.
scalePages.submit=Submit
#certSign
certSign.title=Подписание сертификата
certSign.header=Подпишите PDF своим сертификатом (работа в процессе)
certSign.selectPDF=Выберите файл PDF для подписи:
certSign.selectKey=Выберите файл закрытого ключа (формат PKCS#8, может быть .pem или .der):
certSign.selectCert=Выберите файл сертификата (формат X.509, может быть .pem или .der):
certSign.selectP12=Выберите файл хранилища ключей PKCS#12 (.p12 или .pfx) (необязательно, если он предоставлен, он должен содержать ваш закрытый ключ и сертификат):
certSign.certType=Тип сертификата
certSign.password=Введите пароль от хранилища ключей или личного ключа (если есть):
certSign.showSig=Показать подпись
certSign.reason=Причина
certSign.location=Местоположение
certSign.name=Имя
certSign.submit=Подписать PDF
#removeBlanks
removeBlanks.title=Удалить Пустые removeBlanks.title=Удалить Пустые
removeBlanks.header=Удалить Пустые Страницы removeBlanks.header=Удалить Пустые Страницы
removeBlanks.threshold=Порог: removeBlanks.threshold=Порог:
@@ -137,12 +478,16 @@ removeBlanks.whitePercent=Процент Белого (%):
removeBlanks.whitePercentDesc=Общий процент белого на странице, для удаления removeBlanks.whitePercentDesc=Общий процент белого на странице, для удаления
removeBlanks.submit=Удалить Пустые removeBlanks.submit=Удалить Пустые
#compare
compare.title=Сравнение compare.title=Сравнение
compare.header=Сравнение PDFы compare.header=Сравнение PDFы
compare.document.1=Документ 1 compare.document.1=Документ 1
compare.document.2=Документ 2 compare.document.2=Документ 2
compare.submit=Сравнить compare.submit=Сравнить
#sign
sign.title=Подпись sign.title=Подпись
sign.header=Подписать PDFы sign.header=Подписать PDFы
sign.upload=Загрузить изображение sign.upload=Загрузить изображение
@@ -151,14 +496,20 @@ sign.text=Ввод текста
sign.clear=Очистить sign.clear=Очистить
sign.add=Добавить sign.add=Добавить
#repair
repair.title=Ремонт repair.title=Ремонт
repair.header=Ремонт PDF ов repair.header=Ремонт PDF ов
repair.submit=Ремонт repair.submit=Ремонт
#flatten
flatten.title=Сглаживание flatten.title=Сглаживание
flatten.header=Сглаживание PDF ов flatten.header=Сглаживание PDF ов
flatten.submit=Сгладить flatten.submit=Сгладить
#ScannerImageSplit
ScannerImageSplit.selectText.1=Угловой порог: ScannerImageSplit.selectText.1=Угловой порог:
ScannerImageSplit.selectText.2=Устанавливает минимальный абсолютный угол, необходимый для поворота изображения (по умолчанию: 10). ScannerImageSplit.selectText.2=Устанавливает минимальный абсолютный угол, необходимый для поворота изображения (по умолчанию: 10).
ScannerImageSplit.selectText.3=Допуск: ScannerImageSplit.selectText.3=Допуск:
@@ -170,19 +521,6 @@ ScannerImageSplit.selectText.8=Устанавливает минимальный
ScannerImageSplit.selectText.9=Размер границы: ScannerImageSplit.selectText.9=Размер границы:
ScannerImageSplit.selectText.10=Устанавливает размер добавляемой и удаляемой границы, чтобы предотвратить появление белых границ на выходе (по умолчанию: 1). ScannerImageSplit.selectText.10=Устанавливает размер добавляемой и удаляемой границы, чтобы предотвратить появление белых границ на выходе (по умолчанию: 1).
navbar.settings=Настройки
settings.title=Настройки
settings.update=Доступно обновление
settings.appVersion=Версия приложения:
settings.downloadOption.title=Выберите вариант загрузки (для загрузки одного файла без zip):
settings.downloadOption.1=Открыть в том же окне
settings.downloadOption.2=Открыть в новом окне
settings.downloadOption.3=Загрузить файл
settings.zipThreshold=Zip-файлы, когда количество загруженных файлов превышает
#OCR #OCR
ocr.title=OCR / Очистка сканирования ocr.title=OCR / Очистка сканирования
@@ -204,7 +542,7 @@ ocr.credit=Этот сервис использует OCRmyPDF и Tesseract дл
ocr.submit=Обработка PDF с OCR ocr.submit=Обработка PDF с OCR
#extractImages
extractImages.title=Извлечь изображения extractImages.title=Извлечь изображения
extractImages.header=Извлечь изображения extractImages.header=Извлечь изображения
extractImages.selectText=Выберите формат изображения для преобразования извлеченных изображений в extractImages.selectText=Выберите формат изображения для преобразования извлеченных изображений в
@@ -222,14 +560,12 @@ fileToPDF.submit=Преобразовать в PDF
#compress #compress
compress.title=Сжать compress.title=Сжать
compress.header=Сжать PDF compress.header=Сжать PDF
compress.credit=Этот сервис использует OCRmyPDF для сжатия/оптимизации PDF. compress.credit=Эта служба использует Ghostscript для сжатия/оптимизации PDF.
compress.selectText.1=Уровень оптимизации: compress.selectText.1=Ручной режим - от 1 до 4
compress.selectText.2=0 (Без оптимизации) compress.selectText.2=Уровень оптимизации:
compress.selectText.3=1 (Оптимизация по умолчанию без потерь) compress.selectText.3=4 (Ужасно для текстовых изображений)
compress.selectText.4=2 (Оптимизация с потерями) compress.selectText.4=Автоматический режим - автоматически настраивает качество для получения PDF точного размера
compress.selectText.5=3 (Оптимизация с потерями, более агрессивная) compress.selectText.5=Ожидаемый размер PDF (например, 25 МБ, 10,8 МБ, 25 КБ)
compress.selectText.6=Включить быстрый веб-просмотр (линеаризовать PDF)
compress.selectText.7=Включить кодирование JBIG2 с потерями
compress.submit=Сжать compress.submit=Сжать
@@ -237,6 +573,7 @@ compress.submit=Сжать
addImage.title=Добавить изображение addImage.title=Добавить изображение
addImage.header=Добавить изображение в PDF addImage.header=Добавить изображение в PDF
addImage.everyPage=Каждая страница? addImage.everyPage=Каждая страница?
addImage.upload=Добавить изображение
addImage.submit=Добавить изображение addImage.submit=Добавить изображение
@@ -245,11 +582,13 @@ merge.title=Объединить
merge.header=Объединение нескольких PDF-файлов (2+) merge.header=Объединение нескольких PDF-файлов (2+)
merge.submit=Объединить merge.submit=Объединить
#pdfOrganiser #pdfOrganiser
pdfOrganiser.title=Организатор страниц pdfOrganiser.title=Организатор страниц
pdfOrganiser.header=Организатор PDF-страниц pdfOrganiser.header=Организатор PDF-страниц
pdfOrganiser.submit=Переупорядочить страницы pdfOrganiser.submit=Переупорядочить страницы
#multiTool #multiTool
multiTool.title=Мультиинструмент PDF multiTool.title=Мультиинструмент PDF
multiTool.header=Мультиинструмент PDF multiTool.header=Мультиинструмент PDF
@@ -261,6 +600,7 @@ pageRemover.header=Удаление PDF-страниц
pageRemover.pagesToDelete=Страницы для удаления (введите список номеров страниц через запятую): pageRemover.pagesToDelete=Страницы для удаления (введите список номеров страниц через запятую):
pageRemover.submit=Удалить страницы pageRemover.submit=Удалить страницы
#rotate #rotate
rotate.title=Повернуть PDF rotate.title=Повернуть PDF
rotate.header=Повернуть PDF rotate.header=Повернуть PDF
@@ -268,8 +608,6 @@ rotate.selectAngle=Выберите угол поворота (кратный 90
rotate.submit=Повернуть rotate.submit=Повернуть
#merge #merge
split.title=Разделить PDF split.title=Разделить PDF
split.header=Разделить PDF split.header=Разделить PDF
@@ -295,6 +633,7 @@ imageToPDF.selectText.3=Многофайловая логика (включен
imageToPDF.selectText.4=Объединить в один PDF imageToPDF.selectText.4=Объединить в один PDF
imageToPDF.selectText.5=Преобразование в отдельные PDF-файлы imageToPDF.selectText.5=Преобразование в отдельные PDF-файлы
#pdfToImage #pdfToImage
pdfToImage.title=PDF в изображение pdfToImage.title=PDF в изображение
pdfToImage.header=PDF в изображение pdfToImage.header=PDF в изображение
@@ -308,6 +647,7 @@ pdfToImage.grey=Оттенки серого
pdfToImage.blackwhite=Черно-белый (может потерять данные!) pdfToImage.blackwhite=Черно-белый (может потерять данные!)
pdfToImage.submit=Конвертировать pdfToImage.submit=Конвертировать
#addPassword #addPassword
addPassword.title=Добавить пароль addPassword.title=Добавить пароль
addPassword.header=Добавить пароль (зашифровать) addPassword.header=Добавить пароль (зашифровать)
@@ -324,8 +664,12 @@ addPassword.selectText.10=Предотвратить модификацию
addPassword.selectText.11=Запретить модификацию аннотаций addPassword.selectText.11=Запретить модификацию аннотаций
addPassword.selectText.12=Запретить печать addPassword.selectText.12=Запретить печать
addPassword.selectText.13=Запретить печать разных форматов addPassword.selectText.13=Запретить печать разных форматов
addPassword.selectText.14=Owner Password
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
addPassword.selectText.16=Restricts the opening of the document itself
addPassword.submit=Шифровать addPassword.submit=Шифровать
#watermark #watermark
watermark.title=Добавить водяной знак watermark.title=Добавить водяной знак
watermark.header=Добавить водяной знак watermark.header=Добавить водяной знак
@@ -338,6 +682,7 @@ watermark.selectText.6=heightSpacer (пробел между каждым вод
watermark.selectText.7=Непрозрачность (0% - 100%): watermark.selectText.7=Непрозрачность (0% - 100%):
watermark.submit=Добавить водяной знак watermark.submit=Добавить водяной знак
#remove-watermark #remove-watermark
remove-watermark.title=Удалить водяной знак remove-watermark.title=Удалить водяной знак
remove-watermark.header=Удалить водяной знак remove-watermark.header=Удалить водяной знак
@@ -345,6 +690,7 @@ remove-watermark.selectText.1=Выберите PDF, чтобы удалить в
remove-watermark.selectText.2=Текст водяного знака: remove-watermark.selectText.2=Текст водяного знака:
remove-watermark.submit=Удалить водяной знак remove-watermark.submit=Удалить водяной знак
#Change permissions #Change permissions
permissions.title=Изменить разрешения permissions.title=Изменить разрешения
permissions.header=Изменить разрешения permissions.header=Изменить разрешения
@@ -361,6 +707,7 @@ permissions.selectText.9=Запретить печать
permissions.selectText.10=Запретить печать разных форматов permissions.selectText.10=Запретить печать разных форматов
permissions.submit=Изменить permissions.submit=Изменить
#remove password #remove password
removePassword.title=Удалить пароль removePassword.title=Удалить пароль
removePassword.header=Удалить пароль (Расшифровка) removePassword.header=Удалить пароль (Расшифровка)
@@ -368,7 +715,9 @@ removePassword.selectText.1=Выберите PDF для расшифровки
removePassword.selectText.2=Пароль removePassword.selectText.2=Пароль
removePassword.submit=Удалить removePassword.submit=Удалить
changeMetadata.title=Изменить метаданные
#changeMetadata
changeMetadata.title=Заголовок:
changeMetadata.header=Изменить метаданные changeMetadata.header=Изменить метаданные
changeMetadata.selectText.1=Пожалуйста, отредактируйте переменные, которые вы хотите изменить changeMetadata.selectText.1=Пожалуйста, отредактируйте переменные, которые вы хотите изменить
changeMetadata.selectText.2=Удалить все метаданные changeMetadata.selectText.2=Удалить все метаданные
@@ -386,27 +735,30 @@ changeMetadata.selectText.4=Другие метаданные:
changeMetadata.selectText.5=Добавить пользовательскую запись метаданных changeMetadata.selectText.5=Добавить пользовательскую запись метаданных
changeMetadata.submit=Изменить changeMetadata.submit=Изменить
#xlsToPdf
xlsToPdf.title=Excel в PDF xlsToPdf.title=Excel в PDF
xlsToPdf.header=Excel в PDF xlsToPdf.header=Excel в PDF
xlsToPdf.selectText.1=Выберите книгу Excel XLS или XLSX для преобразования xlsToPdf.selectText.1=Выберите книгу Excel XLS или XLSX для преобразования
xlsToPdf.convert=Конвертировать xlsToPdf.convert=Конвертировать
#pdfToPDFA
pdfToPDFA.title=PDF в PDF/A 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=Конвертировать
#PDFToWord
PDFToWord.title=PDF в 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 для преобразования файлов.
PDFToWord.submit=Конвертировать PDFToWord.submit=Конвертировать
#PDFToPresentation
PDFToPresentation.title=PDF в Презентацию PDFToPresentation.title=PDF в Презентацию
PDFToPresentation.header=PDF в Презентацию PDFToPresentation.header=PDF в Презентацию
PDFToPresentation.selectText.1=Формат выходного файла PDFToPresentation.selectText.1=Формат выходного файла
@@ -414,6 +766,7 @@ PDFToPresentation.credit=Этот сервис использует LibreOffice
PDFToPresentation.submit=Конвертировать PDFToPresentation.submit=Конвертировать
#PDFToText
PDFToText.title=PDF в Text/RTF PDFToText.title=PDF в Text/RTF
PDFToText.header=PDF в Text/RTF PDFToText.header=PDF в Text/RTF
PDFToText.selectText.1=Формат выходного файла PDFToText.selectText.1=Формат выходного файла
@@ -421,24 +774,15 @@ PDFToText.credit=Этот сервис использует LibreOffice для
PDFToText.submit=Конвертировать PDFToText.submit=Конвертировать
#PDFToHTML
PDFToHTML.title=PDF в HTML PDFToHTML.title=PDF в HTML
PDFToHTML.header=PDF в HTML PDFToHTML.header=PDF в HTML
PDFToHTML.credit=Этот сервис использует LibreOffice для преобразования файлов. PDFToHTML.credit=Этот сервис использует LibreOffice для преобразования файлов.
PDFToHTML.submit=Конвертировать PDFToHTML.submit=Конвертировать
#PDFToXML
PDFToXML.title=PDF в XML PDFToXML.title=PDF в XML
PDFToXML.header=PDF в XML PDFToXML.header=PDF в XML
PDFToXML.credit=Этот сервис использует LibreOffice для преобразования файлов. PDFToXML.credit=Этот сервис использует LibreOffice для преобразования файлов.
PDFToXML.submit=Конвертировать PDFToXML.submit=Конвертировать

View File

@@ -1,7 +1,7 @@
########### ###########
# Generisk # # Generic #
########### ###########
# riktningen som språket skrivs (ltr = vänster till höger, rtl = höger till vänster) # the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr language.direction=ltr
pdfPrompt=Välj PDF(er) pdfPrompt=Välj PDF(er)
@@ -12,7 +12,7 @@ genericSubmit=Skicka
processTimeWarning=Varning: Denna process kan ta upp till en minut beroende på filstorlek processTimeWarning=Varning: Denna process kan ta upp till en minut beroende på filstorlek
pageOrderPrompt=Sidordning (Ange en kommaseparerad lista med sidnummer) : pageOrderPrompt=Sidordning (Ange en kommaseparerad lista med sidnummer) :
goToPage=Gå till goToPage=Gå till
sant=Sant true=True
false=Falskt false=Falskt
unknown=Okänt unknown=Okänt
save=Spara save=Spara
@@ -20,115 +20,456 @@ close=Stäng
filesSelected=filer valda filesSelected=filer valda
noFavourites=Inga favoriter har lagts till noFavourites=Inga favoriter har lagts till
bored=Utråkad att vänta? bored=Utråkad att vänta?
############# alphabet=Alfabet
# HEMSIDA # downloadPdf=Ladda ner PDF
############# text=Text
home.desc=Din lokala one-stop-shop för alla dina PDF-behov. font=Teckensnitt
selectFillter=-- Välj --
pageNum=Sidnummer
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
#############
# NAVBAR #
#############
navbar.convert=Konvertera navbar.convert=Konvertera
navbar.security=Säkerhet navbar.security=Säkerhet
navbar.other=Annat navbar.other=Annat
navbar.darkmode=Mörkt läge navbar.darkmode=Mörkt läge
navbar.pageOps=Sidoperationer navbar.pageOps=Sidoperationer
navbar.settings=Inställningar
#############
# SETTINGS #
#############
settings.title=Inställningar
settings.update=Uppdatering tillgänglig
settings.appVersion=Appversion:
settings.downloadOption.title=Välj nedladdningsalternativ (för nedladdning av en fil utan zip):
settings.downloadOption.1=Öppnas i samma fönster
settings.downloadOption.2=Öppna i nytt fönster
settings.downloadOption.3=Ladda ner fil
settings.zipThreshold=Zip-filer när antalet nedladdade filer överskrider
#############
# HOME-PAGE #
#############
home.desc=Din lokala one-stop-shop för alla dina PDF-behov.
home.multiTool.title=PDF Multi-verktyg home.multiTool.title=PDF Multi-verktyg
home.multiTool.desc=Sammanfoga, rotera, ordna om och ta bort sidor home.multiTool.desc=Sammanfoga, rotera, ordna om och ta bort sidor
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
home.merge.title=Sammanfoga home.merge.title=Sammanfoga
home.merge.desc=Sammanfoga enkelt flera PDF-filer till en. home.merge.desc=Sammanfoga enkelt flera PDF-filer till en.
merge.tags=merge,Page operations,Back end,server side
home.split.title=Dela home.split.title=Dela
home.split.desc=Dela upp PDF-filer i flera dokument home.split.desc=Dela upp PDF-filer i flera dokument
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=Rotera home.rotate.title=Rotera
home.rotate.desc=Rotera enkelt dina PDF-filer. home.rotate.desc=Rotera enkelt dina PDF-filer.
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
home.imageToPdf.title=Bild till PDF home.imageToPdf.title=Bild till PDF
home.imageToPdf.desc=Konvertera en bild (PNG, JPEG, GIF) till PDF. home.imageToPdf.desc=Konvertera en bild (PNG, JPEG, GIF) till PDF.
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=PDF till bild home.pdfToImage.title=PDF till bild
home.pdfToImage.desc=Konvertera en PDF till en bild. (PNG, JPEG, GIF) home.pdfToImage.desc=Konvertera en PDF till en bild. (PNG, JPEG, GIF)
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=Ordna home.pdfOrganiser.title=Ordna
home.pdfOrganiser.desc=Ta bort/ordna om sidor i valfri ordning home.pdfOrganiser.desc=Ta bort/ordna om sidor i valfri ordning
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=Lägg till bild home.addImage.title=Lägg till bild
home.addImage.desc=Lägger till en bild på en angiven plats i PDF:en (pågår arbete) home.addImage.desc=Lägger till en bild på en angiven plats i PDF:en (pågår arbete)
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
home.watermark.title=Lägg till vattenstämpel home.watermark.title=Lägg till vattenstämpel
home.watermark.desc=Lägg till en anpassad vattenstämpel till ditt PDF-dokument. home.watermark.desc=Lägg till en anpassad vattenstämpel till ditt PDF-dokument.
##########################
home.remove-watermark.title=Ta bort vattenstämpel ### TODO: Translate ###
home.remove-watermark.desc=Ta bort vattenstämplar från ditt PDF-dokument. ##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.permissions.title=Ändra behörigheter home.permissions.title=Ändra behörigheter
home.permissions.desc=Ändra behörigheterna för ditt PDF-dokument home.permissions.desc=Ändra behörigheterna för ditt PDF-dokument
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
home.removePages.title=Ta bort home.removePages.title=Ta bort
home.removePages.desc=Ta bort oönskade sidor från ditt PDF-dokument. home.removePages.desc=Ta bort oönskade sidor från ditt PDF-dokument.
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
home.addPassword.title=Lägg till lösenord home.addPassword.title=Lägg till lösenord
home.addPassword.desc=Kryptera ditt PDF-dokument med ett lösenord. home.addPassword.desc=Kryptera ditt PDF-dokument med ett lösenord.
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
home.removePassword.title=Ta bort lösenord home.removePassword.title=Ta bort lösenord
home.removePassword.desc=Ta bort lösenordsskydd från ditt PDF-dokument. home.removePassword.desc=Ta bort lösenordsskydd från ditt PDF-dokument.
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=Komprimera home.compressPdfs.title=Komprimera
home.compressPdfs.desc=Komprimera PDF-filer för att minska deras filstorlek. home.compressPdfs.desc=Komprimera PDF-filer för att minska deras filstorlek.
##########################
### TODO: Translate ###
##########################
compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=Ändra metadata home.changeMetadata.title=Ändra metadata
home.changeMetadata.desc=Ändra/ta bort/lägg till metadata från ett PDF-dokument home.changeMetadata.desc=Ändra/ta bort/lägg till metadata från ett PDF-dokument
##########################
### TODO: Translate ###
##########################
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=Konvertera fil till PDF home.fileToPDF.title=Konvertera fil till PDF
home.fileToPDF.desc=Konvertera nästan vilken fil som helst till PDF (DOCX, PNG, XLS, PPT, TXT och mer) home.fileToPDF.desc=Konvertera nästan vilken fil som helst till PDF (DOCX, PNG, XLS, PPT, TXT och mer)
##########################
### TODO: Translate ###
##########################
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=OCR / Rensningsskanningar home.ocr.title=OCR / Rensningsskanningar
home.ocr.desc=Cleanup skannar och upptäcker text från bilder i en PDF och lägger till den igen som text. home.ocr.desc=Cleanup skannar och upptäcker text från bilder i en PDF och lägger till den igen som text.
##########################
### TODO: Translate ###
##########################
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
home.extractImages.title=Extrahera bilder home.extractImages.title=Extrahera bilder
home.extractImages.desc=Extraherar alla bilder från en PDF och sparar dem till zip home.extractImages.desc=Extraherar alla bilder från en PDF och sparar dem till zip
##########################
### TODO: Translate ###
##########################
extractImages.tags=picture,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=PDF till PDF/A home.pdfToPDFA.title=PDF till PDF/A
home.pdfToPDFA.desc=Konvertera PDF till PDF/A för långtidslagring home.pdfToPDFA.desc=Konvertera PDF till PDF/A för långtidslagring
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=PDF till Word home.PDFToWord.title=PDF till Word
home.PDFToWord.desc=Konvertera PDF till Word-format (DOC, DOCX och ODT) home.PDFToWord.desc=Konvertera PDF till Word-format (DOC, DOCX och ODT)
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=PDF till presentation home.PDFToPresentation.title=PDF till presentation
home.PDFToPresentation.desc=Konvertera PDF till presentationsformat (PPT, PPTX och ODP) home.PDFToPresentation.desc=Konvertera PDF till presentationsformat (PPT, PPTX och ODP)
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=PDF till text/RTF home.PDFToText.title=PDF till text/RTF
home.PDFToText.desc=Konvertera PDF till text- eller RTF-format home.PDFToText.desc=Konvertera PDF till text- eller RTF-format
##########################
### TODO: Translate ###
##########################
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDF till HTML home.PDFToHTML.title=PDF till HTML
home.PDFToHTML.desc=Konvertera PDF till HTML-format home.PDFToHTML.desc=Konvertera PDF till HTML-format
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=PDF till XML home.PDFToXML.title=PDF till XML
home.PDFToXML.desc=Konvertera PDF till XML-format home.PDFToXML.desc=Konvertera PDF till XML-format
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=Detektera/Dela skannade foton home.ScannerImageSplit.title=Detektera/Dela skannade foton
home.ScannerImageSplit.desc=Delar flera foton från ett foto/PDF home.ScannerImageSplit.desc=Delar flera foton från ett foto/PDF
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title=Signera home.sign.title=Signera
home.sign.desc=Lägger till signatur till PDF genom ritning, text eller bild home.sign.desc=Lägger till signatur till PDF genom ritning, text eller bild
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=Platta till home.flatten.title=Platta till
home.flatten.desc=Ta bort alla interaktiva element och formulär från en PDF home.flatten.desc=Ta bort alla interaktiva element och formulär från en PDF
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title=Reparera home.repair.title=Reparera
home.repair.desc=Försöker reparera en korrupt/trasig PDF home.repair.desc=Försöker reparera en korrupt/trasig PDF
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
home.removeBlanks.title=Ta bort tomma sidor home.removeBlanks.title=Ta bort tomma sidor
home.removeBlanks.desc=Känner av och tar bort tomma sidor från ett dokument home.removeBlanks.desc=Känner av och tar bort tomma sidor från ett dokument
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title=Jämför home.compare.title=Jämför
home.compare.desc=Jämför och visar skillnaderna mellan 2 PDF-dokument home.compare.desc=Jämför och visar skillnaderna mellan 2 PDF-dokument
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
downloadPdf=Ladda ner PDF home.certSign.title=Sign with Certificate
text=Text home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
font=Teckensnitt ##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Multi-Page Layout
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
##########################
### TODO: Translate ###
##########################
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=Adjust page size/scale
home.scalePages.desc=Change the size/scale of page and/or its contents.
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
##########################
### TODO: Translate ###
##########################
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
##########################
### TODO: Translate ###
##########################
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
##########################
### TODO: Translate ###
##########################
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
##########################
### TODO: Translate ###
##########################
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
##########################
### TODO: Translate ###
##########################
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
##########################
### TODO: Translate ###
##########################
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
##########################
### TODO: Translate ###
##########################
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Multi Page Layout
pageLayout.header=Multi Page Layout
pageLayout.pagesPerSheet=Pages per sheet:
pageLayout.submit=Submit
#scalePages
scalePages.title=Adjust page-scale
scalePages.header=Adjust page-scale
scalePages.pageSize=Size of a page of the document.
scalePages.scaleFactor=Zoom level (crop) of a page.
scalePages.submit=Submit
#certSign
certSign.title=Certifikatsignering
certSign.header=Skriv under en PDF med ditt certifikat (Pågående arbete)
certSign.selectPDF=Välj en PDF-fil för signering:
certSign.selectKey=Välj din privata nyckelfil (PKCS#8-format, kan vara .pem eller .der):
certSign.selectCert=Välj din certifikatfil (X.509-format, kan vara .pem eller .der):
certSign.selectP12=Välj din PKCS#12-nyckellagringsfil (.p12 eller .pfx) (Valfritt, om den tillhandahålls bör den innehålla din privata nyckel och certifikat):
certSign.certType=Certifikattyp
certSign.password=Ange ditt nyckellager eller privata nyckellösenord (om något):
certSign.showSig=Visa signatur
certSign.reason=Anledning
certSign.location=Plats
certSign.name=Namn
certSign.submit=Skriv under PDF
#removeBlanks
removeBlanks.title=Ta bort tomrum removeBlanks.title=Ta bort tomrum
removeBlanks.header=Ta bort tomma sidor removeBlanks.header=Ta bort tomma sidor
removeBlanks.threshold=Tröskel: removeBlanks.threshold=Tröskel:
@@ -137,12 +478,16 @@ removeBlanks.whitePercent=Vit procent (%):
removeBlanks.whitePercentDesc=Procentandel av sidan som måste vara vit för att kunna tas bort removeBlanks.whitePercentDesc=Procentandel av sidan som måste vara vit för att kunna tas bort
removeBlanks.submit=Ta bort tomrum removeBlanks.submit=Ta bort tomrum
#compare
compare.title=Jämför compare.title=Jämför
compare.header=Jämför PDF-filer compare.header=Jämför PDF-filer
compare.document.1=Dokument 1 compare.document.1=Dokument 1
compare.document.2=Dokument 2 compare.document.2=Dokument 2
compare.submit=Jämför compare.submit=Jämför
#sign
sign.title=Signera sign.title=Signera
sign.header=Skriv under PDF-filer sign.header=Skriv under PDF-filer
sign.upload=Ladda upp bild sign.upload=Ladda upp bild
@@ -151,14 +496,20 @@ sign.text=Textinmatning
sign.clear=Rensa sign.clear=Rensa
sign.add=Lägg till sign.add=Lägg till
#repair
repair.title=Reparera repair.title=Reparera
repair.header=Reparera PDF-filer repair.header=Reparera PDF-filer
repair.submit=Reparera repair.submit=Reparera
#flatten
flatten.title=Platta till flatten.title=Platta till
flatten.header=Placera PDF-filer flatten.header=Placera PDF-filer
flatten.submit=Platta till flatten.submit=Platta till
#ScannerImageSplit
ScannerImageSplit.selectText.1=Vinkeltröskel: ScannerImageSplit.selectText.1=Vinkeltröskel:
ScannerImageSplit.selectText.2=Ställer in den minsta absoluta vinkeln som krävs för att bilden ska roteras (standard: 10). ScannerImageSplit.selectText.2=Ställer in den minsta absoluta vinkeln som krävs för att bilden ska roteras (standard: 10).
ScannerImageSplit.selectText.3=Tolerans: ScannerImageSplit.selectText.3=Tolerans:
@@ -170,19 +521,6 @@ ScannerImageSplit.selectText.8=Ställer in minsta tröskelvärde för konturarea
ScannerImageSplit.selectText.9=Kantstorlek: ScannerImageSplit.selectText.9=Kantstorlek:
ScannerImageSplit.selectText.10=Ställer in storleken på kanten som läggs till och tas bort för att förhindra vita kanter i utdata (standard: 1). ScannerImageSplit.selectText.10=Ställer in storleken på kanten som läggs till och tas bort för att förhindra vita kanter i utdata (standard: 1).
navbar.settings=Inställningar
settings.title=Inställningar
settings.update=Uppdatering tillgänglig
settings.appVersion=Appversion:
settings.downloadOption.title=Välj nedladdningsalternativ (för nedladdning av en fil utan zip):
settings.downloadOption.1=Öppnas i samma fönster
settings.downloadOption.2=Öppna i nytt fönster
settings.downloadOption.3=Ladda ner fil
settings.zipThreshold=Zip-filer när antalet nedladdade filer överskrider
#OCR #OCR
ocr.title=OCR / Scan Cleanup ocr.title=OCR / Scan Cleanup
@@ -204,14 +542,14 @@ ocr.credit=Denna tjänst använder OCRmyPDF och Tesseract för OCR.
ocr.submit=Bearbeta PDF med OCR ocr.submit=Bearbeta PDF med OCR
#extractImages
extractImages.title=Extrahera bilder extractImages.title=Extrahera bilder
extractImages.header=Extrahera bilder extractImages.header=Extrahera bilder
extractImages.selectText=Välj bildformat att konvertera extraherade bilder till extractImages.selectText=Välj bildformat att konvertera extraherade bilder till
extractImages.submit=Extrahera extractImages.submit=Extrahera
#Fil till PDF #File to PDF
fileToPDF.title=Fil till PDF fileToPDF.title=Fil till PDF
fileToPDF.header=Konvertera valfri fil till PDF fileToPDF.header=Konvertera valfri fil till PDF
fileToPDF.credit=Denna tjänst använder LibreOffice och Unoconv för filkonvertering. fileToPDF.credit=Denna tjänst använder LibreOffice och Unoconv för filkonvertering.
@@ -219,38 +557,39 @@ fileToPDF.supportedFileTypes=Filtyper som stöds bör inkludera nedanstående me
fileToPDF.submit=Konvertera till PDF fileToPDF.submit=Konvertera till PDF
#komprimera #compress
compress.title=Komprimera compress.title=Komprimera
compress.header=Komprimera PDF compress.header=Komprimera PDF
compress.credit=Denna tjänst använder OCRmyPDF för PDF-komprimering/optimering. compress.credit=Denna tjänst använder Ghostscript för PDF-komprimering/optimering.
compress.selectText.1=Optimeringsnivå: compress.selectText.1=Manuellt läge - Från 1 till 4
compress.selectText.2=0 (Ingen optimering) compress.selectText.2=Optimeringsnivå:
compress.selectText.3=1 (Standard, förlustfri optimering) compress.selectText.3=4 (Fruktansvärt för textbilder)
compress.selectText.4=2 (förlustoptimering) compress.selectText.4=Autoläge - Autojusterar kvaliteten för att få PDF till exakt storlek
compress.selectText.5=3 (förlustoptimering, mer aggressiv) compress.selectText.5=Förväntad PDF-storlek (t.ex. 25MB, 10,8MB, 25KB)
compress.selectText.6=Aktivera snabb webbvy (linjärisera PDF)
compress.selectText.7=Aktivera JBIG2-kodning med förlust
compress.submit=Komprimera compress.submit=Komprimera
#Lägg till bild #Add image
addImage.title=Lägg till bild addImage.title=Lägg till bild
addImage.header=Lägg till bild till PDF addImage.header=Lägg till bild till PDF
addImage.everyPage=Varje sida? addImage.everyPage=Varje sida?
addImage.upload=Lägg till bild
addImage.submit=Lägg till bild addImage.submit=Lägg till bild
#sammanfoga #merge
merge.title=Sammanfoga merge.title=Sammanfoga
merge.header=Slå samman flera PDF-filer (2+) merge.header=Slå samman flera PDF-filer (2+)
merge.submit=Slå samman merge.submit=Slå samman
#pdfArrangör
#pdfOrganiser
pdfOrganiser.title=Sidorganisatör pdfOrganiser.title=Sidorganisatör
pdfOrganiser.header=PDF-sidorganisatör pdfOrganiser.header=PDF-sidorganisatör
pdfOrganiser.submit=Ordna om sidor pdfOrganiser.submit=Ordna om sidor
#multiverktyg
#multiTool
multiTool.title=PDF-multiverktyg multiTool.title=PDF-multiverktyg
multiTool.header=PDF Multi-verktyg multiTool.header=PDF Multi-verktyg
@@ -261,16 +600,15 @@ pageRemover.header=PDF Sidborttagning
pageRemover.pagesToDelete=Sidor att radera (Ange en kommaseparerad lista med sidnummer) : pageRemover.pagesToDelete=Sidor att radera (Ange en kommaseparerad lista med sidnummer) :
pageRemover.submit=Ta bort sidor pageRemover.submit=Ta bort sidor
#rotera
#rotate
rotate.title=Rotera PDF rotate.title=Rotera PDF
rotate.header=Rotera PDF rotate.header=Rotera PDF
rotate.selectAngle=Välj rotationsvinkel (i multipler av 90 grader): rotate.selectAngle=Välj rotationsvinkel (i multipler av 90 grader):
rotate.submit=Rotera rotate.submit=Rotera
#merge
#sammanfoga
split.title=Dela upp PDF split.title=Dela upp PDF
split.header=Dela upp PDF split.header=Dela upp PDF
split.desc.1=Siffrorna du väljer är sidnumret du vill göra en split på split.desc.1=Siffrorna du väljer är sidnumret du vill göra en split på
@@ -285,7 +623,7 @@ split.splitPages=Ange sidor att dela på:
split.submit=Dela split.submit=Dela
#sammanfoga #merge
imageToPDF.title=Bild till PDF imageToPDF.title=Bild till PDF
imageToPDF.header=Bild till PDF imageToPDF.header=Bild till PDF
imageToPDF.submit=Konvertera imageToPDF.submit=Konvertera
@@ -295,6 +633,7 @@ imageToPDF.selectText.3=Multifillogik (Endast aktiverad om man arbetar med flera
imageToPDF.selectText.4=Slå samman till en enda PDF imageToPDF.selectText.4=Slå samman till en enda PDF
imageToPDF.selectText.5=Konvertera till separata PDF-filer imageToPDF.selectText.5=Konvertera till separata PDF-filer
#pdfToImage #pdfToImage
pdfToImage.title=PDF till bild pdfToImage.title=PDF till bild
pdfToImage.header=PDF till bild pdfToImage.header=PDF till bild
@@ -308,6 +647,7 @@ pdfToImage.grey=Gråskala
pdfToImage.blackwhite=Svartvitt (kan förlora data!) pdfToImage.blackwhite=Svartvitt (kan förlora data!)
pdfToImage.submit=Konvertera pdfToImage.submit=Konvertera
#addPassword #addPassword
addPassword.title=Lägg till lösenord addPassword.title=Lägg till lösenord
addPassword.header=Lägg till lösenord (kryptera) addPassword.header=Lägg till lösenord (kryptera)
@@ -324,9 +664,13 @@ addPassword.selectText.10=Förhindra modifiering
addPassword.selectText.11=Förhindra anteckningsändring addPassword.selectText.11=Förhindra anteckningsändring
addPassword.selectText.12=Förhindra utskrift addPassword.selectText.12=Förhindra utskrift
addPassword.selectText.13=Förhindra utskrift av olika format addPassword.selectText.13=Förhindra utskrift av olika format
addPassword.selectText.14=Owner Password
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
addPassword.selectText.16=Restricts the opening of the document itself
addPassword.submit=Kryptera addPassword.submit=Kryptera
#vattenstämpel
#watermark
watermark.title=Lägg till vattenstämpel watermark.title=Lägg till vattenstämpel
watermark.header=Lägg till vattenstämpel watermark.header=Lägg till vattenstämpel
watermark.selectText.1=Välj PDF för att lägga till vattenstämpel till: watermark.selectText.1=Välj PDF för att lägga till vattenstämpel till:
@@ -338,6 +682,7 @@ watermark.selectText.6=heightSpacer (mellanrum mellan varje vattenstämpel verti
watermark.selectText.7=Opacitet (0% - 100%): watermark.selectText.7=Opacitet (0% - 100%):
watermark.submit=Lägg till vattenstämpel watermark.submit=Lägg till vattenstämpel
#remove-watermark #remove-watermark
remove-watermark.title=Ta bort vattenstämpel remove-watermark.title=Ta bort vattenstämpel
remove-watermark.header=Ta bort vattenstämpel remove-watermark.header=Ta bort vattenstämpel
@@ -345,7 +690,8 @@ remove-watermark.selectText.1=Välj PDF för att ta bort vattenstämpel från:
remove-watermark.selectText.2=Vattenstämpeltext: remove-watermark.selectText.2=Vattenstämpeltext:
remove-watermark.submit=Ta bort vattenstämpel remove-watermark.submit=Ta bort vattenstämpel
#Ändra behörigheter
#Change permissions
permissions.title=Ändra behörigheter permissions.title=Ändra behörigheter
permissions.header=Ändra behörigheter permissions.header=Ändra behörigheter
permissions.warning=Varning för att dessa behörigheter ska vara oföränderliga, det rekommenderas att ställa in dem med ett lösenord via sidan Lägg till lösenord permissions.warning=Varning för att dessa behörigheter ska vara oföränderliga, det rekommenderas att ställa in dem med ett lösenord via sidan Lägg till lösenord
@@ -361,14 +707,17 @@ permissions.selectText.9=Förhindra utskrift
permissions.selectText.10=Förhindra utskrift av olika format permissions.selectText.10=Förhindra utskrift av olika format
permissions.submit=Ändra permissions.submit=Ändra
#ta bort lösenord
#remove password
removePassword.title=Ta bort lösenord removePassword.title=Ta bort lösenord
removePassword.header=Ta bort lösenord (Dekryptera) removePassword.header=Ta bort lösenord (Dekryptera)
removePassword.selectText.1=Välj PDF att dekryptera removePassword.selectText.1=Välj PDF att dekryptera
removePassword.selectText.2=Lösenord removePassword.selectText.2=Lösenord
removePassword.submit=Ta bort removePassword.submit=Ta bort
changeMetadata.title=Ändra metadata
#changeMetadata
changeMetadata.title=Titel:
changeMetadata.header=Ändra metadata changeMetadata.header=Ändra metadata
changeMetadata.selectText.1=Redigera de variabler du vill ändra changeMetadata.selectText.1=Redigera de variabler du vill ändra
changeMetadata.selectText.2=Ta bort all metadata changeMetadata.selectText.2=Ta bort all metadata
@@ -386,27 +735,30 @@ changeMetadata.selectText.4=Andra metadata:
changeMetadata.selectText.5=Lägg till anpassad metadatapost changeMetadata.selectText.5=Lägg till anpassad metadatapost
changeMetadata.submit=Ändra changeMetadata.submit=Ändra
#xlsToPdf
xlsToPdf.title=Excel till PDF xlsToPdf.title=Excel till PDF
xlsToPdf.header=Excel till PDF xlsToPdf.header=Excel till PDF
xlsToPdf.selectText.1=Välj XLS eller XLSX Excel-ark att konvertera xlsToPdf.selectText.1=Välj XLS eller XLSX Excel-ark att konvertera
xlsToPdf.convert=konvertera xlsToPdf.convert=konvertera
#pdfToPDFA
pdfToPDFA.title=PDF till PDF/A pdfToPDFA.title=PDF till PDF/A
pdfToPDFA.header=PDF till PDF/A pdfToPDFA.header=PDF till PDF/A
pdfToPDFA.credit=Denna tjänst använder OCRmyPDF för PDF/A-konvertering pdfToPDFA.credit=Denna tjänst använder OCRmyPDF för PDF/A-konvertering
pdfToPDFA.submit=Konvertera pdfToPDFA.submit=Konvertera
#PDFToWord
PDFToWord.title=PDF till Word PDFToWord.title=PDF till Word
PDFToWord.header=PDF till Word PDFToWord.header=PDF till Word
PDFToWord.selectText.1=Utdatafilformat PDFToWord.selectText.1=Utdatafilformat
PDFToWord.credit=Denna tjänst använder LibreOffice för filkonvertering. PDFToWord.credit=Denna tjänst använder LibreOffice för filkonvertering.
PDFToWord.submit=Konvertera PDFToWord.submit=Konvertera
#PDFToPresentation
PDFToPresentation.title=PDF till presentation PDFToPresentation.title=PDF till presentation
PDFToPresentation.header=PDF till presentation PDFToPresentation.header=PDF till presentation
PDFToPresentation.selectText.1=Utdatafilformat PDFToPresentation.selectText.1=Utdatafilformat
@@ -414,6 +766,7 @@ PDFToPresentation.credit=Denna tjänst använder LibreOffice för filkonverterin
PDFToPresentation.submit=Konvertera PDFToPresentation.submit=Konvertera
#PDFToText
PDFToText.title=PDF till text/RTF PDFToText.title=PDF till text/RTF
PDFToText.header=PDF till text/RTF PDFToText.header=PDF till text/RTF
PDFToText.selectText.1=Utdatafilformat PDFToText.selectText.1=Utdatafilformat
@@ -421,24 +774,15 @@ PDFToText.credit=Denna tjänst använder LibreOffice för filkonvertering.
PDFToText.submit=Konvertera PDFToText.submit=Konvertera
#PDFToHTML
PDFToHTML.title=PDF till HTML PDFToHTML.title=PDF till HTML
PDFToHTML.header=PDF till HTML PDFToHTML.header=PDF till HTML
PDFToHTML.credit=Denna tjänst använder LibreOffice för filkonvertering. PDFToHTML.credit=Denna tjänst använder LibreOffice för filkonvertering.
PDFToHTML.submit=Konvertera PDFToHTML.submit=Konvertera
#PDFToXML
PDFToXML.title=PDF till XML PDFToXML.title=PDF till XML
PDFToXML.header=PDF till XML PDFToXML.header=PDF till XML
PDFToXML.credit=Denna tjänst använder LibreOffice för filkonvertering. PDFToXML.credit=Denna tjänst använder LibreOffice för filkonvertering.
PDFToXML.submit=Konvertera PDFToXML.submit=Konvertera

View File

@@ -1,7 +1,7 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr = left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr language.direction=ltr
pdfPrompt=选择PDF pdfPrompt=选择PDF
@@ -20,115 +20,456 @@ close=关闭
filesSelected=\u9009\u62E9\u7684\u6587\u4EF6 filesSelected=\u9009\u62E9\u7684\u6587\u4EF6
noFavourites=\u6CA1\u6709\u6DFB\u52A0\u6536\u85CF\u5939 noFavourites=\u6CA1\u6709\u6DFB\u52A0\u6536\u85CF\u5939
bored=\u65E0\u804A\u7B49\u5F85\uFF1F bored=\u65E0\u804A\u7B49\u5F85\uFF1F
alphabet=\u5B57\u6BCD\u8868
downloadPdf=\u4E0B\u8F7DPDF
text=\u6587\u672C
font=\u5B57\u4F53
selectFillter=-- 选择--
pageNum=页码
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
#############
# NAVBAR #
#############
navbar.convert=转换
navbar.security=安全
navbar.other=其他
navbar.darkmode=暗模式
navbar.pageOps=页面操作
navbar.settings=设置
#############
# SETTINGS #
#############
settings.title=设置
settings.update=可更新
settings.appVersion=应用程序版本:
settings.downloadOption.title=选择下载选项(单个文件非压缩文件):
settings.downloadOption.1=在同一窗口打开
settings.downloadOption.2=在新窗口中打开
settings.downloadOption.3=下载文件
settings.zipThreshold=当下载的文件数量超过限制时,将文件压缩。
############# #############
# HOME-PAGE # # HOME-PAGE #
############# #############
home.desc=您的本地托管一站式服务满足您的所有PDF需求。 home.desc=您的本地托管一站式服务满足您的所有PDF需求。
navbar.convert=转换
navbar.security=安全
navbar.other=其他
navbar.darkmode=暗模式
navbar.pageOps=页面操作
home.multiTool.title=PDF多功能工具 home.multiTool.title=PDF多功能工具
home.multiTool.desc=合并、旋转、重新排列和删除PDF页面 home.multiTool.desc=合并、旋转、重新排列和删除PDF页面
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
home.merge.title=合并 home.merge.title=合并
home.merge.desc=轻松合并多个PDF为一个。 home.merge.desc=轻松合并多个PDF为一个。
merge.tags=merge,Page operations,Back end,server side
home.split.title=拆分 home.split.title=拆分
home.split.desc=将 PDF 拆分为多个文档。 home.split.desc=将 PDF 拆分为多个文档。
##########################
### TODO: Translate ###
##########################
split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=旋转 home.rotate.title=旋转
home.rotate.desc=旋转PDF。 home.rotate.desc=旋转PDF。
##########################
### TODO: Translate ###
##########################
rotate.tags=server side
home.imageToPdf.title=转换图像到PDF home.imageToPdf.title=转换图像到PDF
home.imageToPdf.desc=转换图像PNG, JPEG, GIF到 PDF。 home.imageToPdf.desc=转换图像PNG, JPEG, GIF到 PDF。
##########################
### TODO: Translate ###
##########################
imageToPdf.tags=conversion,img,jpg,picture,photo
home.pdfToImage.title=转换PDF到图像 home.pdfToImage.title=转换PDF到图像
home.pdfToImage.desc=转换PDF到图像PNG, JPEG, GIF home.pdfToImage.desc=转换PDF到图像PNG, JPEG, GIF
##########################
### TODO: Translate ###
##########################
pdfToImage.tags=conversion,img,jpg,picture,photo
home.pdfOrganiser.title=整理 home.pdfOrganiser.title=整理
home.pdfOrganiser.desc=按任何顺序删除/重新排列页面。 home.pdfOrganiser.desc=按任何顺序删除/重新排列页面。
##########################
### TODO: Translate ###
##########################
pdfOrganiser.tags=duplex,even,odd,sort,move
home.addImage.title=在PDF中添加图片 home.addImage.title=在PDF中添加图片
home.addImage.desc=将图像添加到PDF的设定位置上 home.addImage.desc=将图像添加到PDF的设定位置上
##########################
### TODO: Translate ###
##########################
addImage.tags=img,jpg,picture,photo
home.watermark.title=添加水印 home.watermark.title=添加水印
home.watermark.desc=在PDF中添加一个自定义的水印。 home.watermark.desc=在PDF中添加一个自定义的水印。
##########################
home.remove-watermark.title=去除水印 ### TODO: Translate ###
home.remove-watermark.desc=从你的PDF文档中去除水印。 ##########################
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
home.permissions.title=更改权限 home.permissions.title=更改权限
home.permissions.desc=改变你的PDF文档的权限。 home.permissions.desc=改变你的PDF文档的权限。
##########################
### TODO: Translate ###
##########################
permissions.tags=read,write,edit,print
home.removePages.title=删除 home.removePages.title=删除
home.removePages.desc=从你的PDF文档中删除不需要的页面。 home.removePages.desc=从你的PDF文档中删除不需要的页面。
##########################
### TODO: Translate ###
##########################
removePages.tags=Remove pages,delete pages
home.addPassword.title=添加密码 home.addPassword.title=添加密码
home.addPassword.desc=用密码来加密你的PDF文档。 home.addPassword.desc=用密码来加密你的PDF文档。
##########################
### TODO: Translate ###
##########################
addPassword.tags=secure,security
home.removePassword.title=删除密码 home.removePassword.title=删除密码
home.removePassword.desc=从你的PDF文档中移除密码保护。 home.removePassword.desc=从你的PDF文档中移除密码保护。
##########################
### TODO: Translate ###
##########################
removePassword.tags=secure,Decrypt,security,unpassword,delete password
home.compressPdfs.title=压缩 home.compressPdfs.title=压缩
home.compressPdfs.desc=压缩PDF文件以减少其文件大小。 home.compressPdfs.desc=压缩PDF文件以减少其文件大小。
##########################
### TODO: Translate ###
##########################
compressPdfs.tags=squish,small,tiny
home.changeMetadata.title=更改元数据 home.changeMetadata.title=更改元数据
home.changeMetadata.desc=更改/删除/添加PDF文档的元数据。 home.changeMetadata.desc=更改/删除/添加PDF文档的元数据。
##########################
### TODO: Translate ###
##########################
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
home.fileToPDF.title=将文件转换为PDF文件 home.fileToPDF.title=将文件转换为PDF文件
home.fileToPDF.desc=将几乎所有文件转换为PDFDOCX、PNG、XLS、PPT、TXT等 home.fileToPDF.desc=将几乎所有文件转换为PDFDOCX、PNG、XLS、PPT、TXT等
##########################
### TODO: Translate ###
##########################
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
home.ocr.title=运行OCR/清理扫描 home.ocr.title=运行OCR/清理扫描
home.ocr.desc=清理和检测PDF中的文本图像并将其重新添加为文本。 home.ocr.desc=清理和检测PDF中的文本图像并将其重新添加为文本。
##########################
### TODO: Translate ###
##########################
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
home.extractImages.title=提取图像 home.extractImages.title=提取图像
home.extractImages.desc=从PDF中提取所有的图像并将其保存到压缩包中。 home.extractImages.desc=从PDF中提取所有的图像并将其保存到压缩包中。
##########################
### TODO: Translate ###
##########################
extractImages.tags=picture,photo,save,archive,zip,capture,grab
home.pdfToPDFA.title=PDF To PDF/A home.pdfToPDFA.title=PDF To PDF/A
home.pdfToPDFA.desc=将PDF转换为PDF/A以便长期保存 home.pdfToPDFA.desc=将PDF转换为PDF/A以便长期保存
##########################
### TODO: Translate ###
##########################
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
home.PDFToWord.title=PDF to Word home.PDFToWord.title=PDF to Word
home.PDFToWord.desc=将PDF转换为Word格式DOC、DOCX和ODT home.PDFToWord.desc=将PDF转换为Word格式DOC、DOCX和ODT
##########################
### TODO: Translate ###
##########################
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
home.PDFToPresentation.title=PDF To Presentation home.PDFToPresentation.title=PDF To Presentation
home.PDFToPresentation.desc=将PDF转换成演示文稿格式PPT、PPTX和ODP home.PDFToPresentation.desc=将PDF转换成演示文稿格式PPT、PPTX和ODP
##########################
### TODO: Translate ###
##########################
PDFToPresentation.tags=slides,show,office,microsoft
home.PDFToText.title=PDF To Text/RTF home.PDFToText.title=PDF to RTF (Text)
home.PDFToText.desc=将PDF转换为文本或RTF格式 home.PDFToText.desc=将PDF转换为文本或RTF格式
##########################
### TODO: Translate ###
##########################
PDFToText.tags=richformat,richtextformat,rich text format
home.PDFToHTML.title=PDF To HTML home.PDFToHTML.title=PDF To HTML
home.PDFToHTML.desc=将PDF转换为HTML格式 home.PDFToHTML.desc=将PDF转换为HTML格式
##########################
### TODO: Translate ###
##########################
PDFToHTML.tags=web content,browser friendly
home.PDFToXML.title=PDF To XML home.PDFToXML.title=PDF To XML
home.PDFToXML.desc=将PDF转换为XML格式 home.PDFToXML.desc=将PDF转换为XML格式
##########################
### TODO: Translate ###
##########################
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
home.ScannerImageSplit.title=检测/分割扫描的照片 home.ScannerImageSplit.title=检测/分割扫描的照片
home.ScannerImageSplit.desc=从一张照片/PDF中分割出多张照片 home.ScannerImageSplit.desc=从一张照片/PDF中分割出多张照片
##########################
### TODO: Translate ###
##########################
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
home.sign.title=\u6807\u5FD7 home.sign.title=\u6807\u5FD7
home.sign.desc=\u901A\u8FC7\u7ED8\u56FE\u3001\u6587\u672C\u6216\u56FE\u50CF\u5411 PDF \u6DFB\u52A0\u7B7E\u540D home.sign.desc=\u901A\u8FC7\u7ED8\u56FE\u3001\u6587\u672C\u6216\u56FE\u50CF\u5411 PDF \u6DFB\u52A0\u7B7E\u540D
##########################
### TODO: Translate ###
##########################
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
home.flatten.title=\u5C55\u5E73 home.flatten.title=\u5C55\u5E73
home.flatten.desc=\u4ECE PDF \u4E2D\u5220\u9664\u6240\u6709\u4EA4\u4E92\u5143\u7D20\u548C\u8868\u5355 home.flatten.desc=\u4ECE PDF \u4E2D\u5220\u9664\u6240\u6709\u4EA4\u4E92\u5143\u7D20\u548C\u8868\u5355
##########################
### TODO: Translate ###
##########################
flatten.tags=static,deactivate,non-interactive,streamline
home.repair.title=\u4FEE\u590D home.repair.title=\u4FEE\u590D
home.repair.desc=\u5C1D\u8BD5\u4FEE\u590D\u635F\u574F/\u635F\u574F\u7684 PDF home.repair.desc=\u5C1D\u8BD5\u4FEE\u590D\u635F\u574F/\u635F\u574F\u7684 PDF
##########################
### TODO: Translate ###
##########################
repair.tags=fix,restore,correction,recover
home.removeBlanks.title=\u5220\u9664\u7A7A\u767D\u9875 home.removeBlanks.title=\u5220\u9664\u7A7A\u767D\u9875
home.removeBlanks.desc=\u68C0\u6D4B\u5E76\u5220\u9664\u6587\u6863\u4E2D\u7684\u7A7A\u767D\u9875 home.removeBlanks.desc=\u68C0\u6D4B\u5E76\u5220\u9664\u6587\u6863\u4E2D\u7684\u7A7A\u767D\u9875
##########################
### TODO: Translate ###
##########################
removeBlanks.tags=cleanup,streamline,non-content,organize
home.compare.title=\u6BD4\u8F83 home.compare.title=\u6BD4\u8F83
home.compare.desc=\u6BD4\u8F83\u5E76\u663E\u793A 2 \u4E2A PDF \u6587\u6863\u4E4B\u95F4\u7684\u5DEE\u5F02 home.compare.desc=\u6BD4\u8F83\u5E76\u663E\u793A 2 \u4E2A PDF \u6587\u6863\u4E4B\u95F4\u7684\u5DEE\u5F02
##########################
### TODO: Translate ###
##########################
compare.tags=differentiate,contrast,changes,analysis
downloadPdf=\u4E0B\u8F7DPDF home.certSign.title=Sign with Certificate
text=\u6587\u672C home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
font=\u5B57\u4F53 ##########################
### TODO: Translate ###
##########################
certSign.tags=authenticate,PEM,P12,official,encrypt
home.pageLayout.title=Multi-Page Layout
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
##########################
### TODO: Translate ###
##########################
pageLayout.tags=merge,composite,single-view,organize
home.scalePages.title=Adjust page size/scale
home.scalePages.desc=Change the size/scale of page and/or its contents.
##########################
### TODO: Translate ###
##########################
scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Advanced)
home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts
##########################
### TODO: Translate ###
##########################
pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Add Page Numbers
home.add-page-numbers.desc=Add Page numbers throughout a document in a set location
##########################
### TODO: Translate ###
##########################
add-page-numbers.tags=paginate,label,organize,index
home.auto-rename.title=Auto Rename PDF File
home.auto-rename.desc=Auto renames a PDF file based on its detected header
##########################
### TODO: Translate ###
##########################
auto-rename.tags=auto-detect,header-based,organize,relabel
home.adjust-contrast.title=Adjust Colors/Contrast
home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF
##########################
### TODO: Translate ###
##########################
adjust-contrast.tags=color-correction,tune,modify,enhance
home.crop.title=Crop PDF
home.crop.desc=Crop a PDF to reduce its size (maintains text!)
##########################
### TODO: Translate ###
##########################
crop.tags=trim,shrink,edit,shape
home.autoSplitPDF.title=Auto Split Pages
home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code
##########################
### TODO: Translate ###
##########################
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
home.sanitizePdf.title=Sanitize
home.sanitizePdf.desc=Remove scripts and other elements from PDF files
##########################
### TODO: Translate ###
##########################
sanitizePdf.tags=clean,secure,safe,remove-threats
##########################
### TODO: Translate ###
##########################
home.URLToPDF.title=URL/Website To PDF
home.URLToPDF.desc=Converts any http(s)URL to PDF
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
##########################
### TODO: Translate ###
##########################
home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert
###########################
# #
# WEB PAGES #
# #
###########################
#url-to-pdf
URLToPDF.title=URL To PDF
URLToPDF.header=URL To PDF
URLToPDF.submit=Convert
URLToPDF.credit=Uses WeasyPrint
#html-to-pdf
HTMLToPDF.title=HTML To PDF
HTMLToPDF.header=HTML To PDF
HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required
HTMLToPDF.submit=Convert
HTMLToPDF.credit=Uses WeasyPrint
#sanitizePDF
sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file
sanitizePDF.selectText.1=Remove JavaScript actions
sanitizePDF.selectText.2=Remove embedded files
sanitizePDF.selectText.3=Remove metadata
sanitizePDF.selectText.4=Remove links
sanitizePDF.selectText.5=Remove fonts
sanitizePDF.submit=Sanitize PDF
#addPageNumbers
addPageNumbers.title=Add Page Numbers
addPageNumbers.header=Add Page Numbers
addPageNumbers.selectText.1=Select PDF file:
addPageNumbers.selectText.2=Margin Size
addPageNumbers.selectText.3=Position
addPageNumbers.selectText.4=Starting Number
addPageNumbers.selectText.5=Pages to Number
addPageNumbers.selectText.6=Custom Text
addPageNumbers.submit=Add Page Numbers
#auto-rename
auto-rename.title=Auto Rename
auto-rename.header=Auto Rename PDF
auto-rename.submit=Auto Rename
#adjustContrast
adjustContrast.title=Adjust Contrast
adjustContrast.header=Adjust Contrast
adjustContrast.contrast=Contrast:
adjustContrast.brightness=Brightness:
adjustContrast.saturation=Saturation:
adjustContrast.download=Download
#crop
crop.title=Crop
crop.header=Crop Image
crop.submit=Submit
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF
autoSplitPDF.header=Auto Split PDF
autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed.
autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine).
autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them.
autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest.
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit
#pipeline
pipeline.title=Pipeline
#pageLayout
pageLayout.title=Multi Page Layout
pageLayout.header=Multi Page Layout
pageLayout.pagesPerSheet=Pages per sheet:
pageLayout.submit=Submit
#scalePages
scalePages.title=Adjust page-scale
scalePages.header=Adjust page-scale
scalePages.pageSize=Size of a page of the document.
scalePages.scaleFactor=Zoom level (crop) of a page.
scalePages.submit=Submit
#certSign
certSign.title=证书签名
certSign.header=使用您的证书签署 PDF进行中
certSign.selectPDF=选择要签名的 PDF 文件:
certSign.selectKey=选择您的私钥文件PKCS#8 格式,可以是 .pem 或 .der
certSign.selectCert=选择您的证书文件X.509 格式,可以是 .pem 或 .der
certSign.selectP12=选择您的 PKCS#12 密钥库文件(.p12 或 .pfx可选如果提供它应该包含您的私钥和证书
certSign.certType=证书类型
certSign.password=输入您的密钥库或私钥密码(如果有):
certSign.showSig=显示签名
certSign.reason=原因
certSign.location=位置
certSign.name=名称
certSign.submit=签署 PDF
#removeBlanks
removeBlanks.title=\u5220\u9664\u7A7A\u767D removeBlanks.title=\u5220\u9664\u7A7A\u767D
removeBlanks.header=\u5220\u9664\u7A7A\u767D\u9875 removeBlanks.header=\u5220\u9664\u7A7A\u767D\u9875
removeBlanks.threshold=\u9608\u503C\uFF1A removeBlanks.threshold=\u9608\u503C\uFF1A
@@ -137,12 +478,16 @@ removeBlanks.whitePercent=\u767D\u8272\u767E\u5206\u6BD4\uFF08%\uFF09\uFF1A
removeBlanks.whitePercentDesc=\u5FC5\u987B\u4E3A\u767D\u8272\u624D\u80FD\u5220\u9664\u7684\u9875\u9762\u767E\u5206\u6BD4 removeBlanks.whitePercentDesc=\u5FC5\u987B\u4E3A\u767D\u8272\u624D\u80FD\u5220\u9664\u7684\u9875\u9762\u767E\u5206\u6BD4
removeBlanks.submit=\u5220\u9664\u7A7A\u767D removeBlanks.submit=\u5220\u9664\u7A7A\u767D
#compare
compare.title=\u6BD4\u8F83 compare.title=\u6BD4\u8F83
compare.header=\u6BD4\u8F83 PDF compare.header=\u6BD4\u8F83 PDF
compare.document.1=\u6587\u6863 1 compare.document.1=\u6587\u6863 1
compare.document.2=\u6587\u6863 2 compare.document.2=\u6587\u6863 2
compare.submit=\u6BD4\u8F83 compare.submit=\u6BD4\u8F83
#sign
sign.title=\u7B7E\u540D sign.title=\u7B7E\u540D
sign.header=\u7B7E\u7F72 PDF sign.header=\u7B7E\u7F72 PDF
sign.upload=\u4E0A\u4F20\u56FE\u7247 sign.upload=\u4E0A\u4F20\u56FE\u7247
@@ -151,14 +496,20 @@ sign.text=\u6587\u672C\u8F93\u5165
sign.clear=\u6E05\u9664 sign.clear=\u6E05\u9664
sign.add=\u6DFB\u52A0 sign.add=\u6DFB\u52A0
#repair
repair.title=\u4FEE\u590D repair.title=\u4FEE\u590D
repair.header=\u4FEE\u590D PDF repair.header=\u4FEE\u590D PDF
repair.submit=\u4FEE\u590D repair.submit=\u4FEE\u590D
#flatten
flatten.title=\u5C55\u5E73 flatten.title=\u5C55\u5E73
flatten.header=\u5C55\u5E73 PDF flatten.header=\u5C55\u5E73 PDF
flatten.submit=\u5C55\u5E73 flatten.submit=\u5C55\u5E73
#ScannerImageSplit
ScannerImageSplit.selectText.1=角度阈值: ScannerImageSplit.selectText.1=角度阈值:
ScannerImageSplit.selectText.2=设置图像被旋转所需的最小绝对角度默认10 ScannerImageSplit.selectText.2=设置图像被旋转所需的最小绝对角度默认10
ScannerImageSplit.selectText.3=公差: ScannerImageSplit.selectText.3=公差:
@@ -170,18 +521,6 @@ ScannerImageSplit.selectText.8=设置照片的最小轮廓面积阈值。
ScannerImageSplit.selectText.9=边框尺寸: ScannerImageSplit.selectText.9=边框尺寸:
ScannerImageSplit.selectText.10=设置添加和删除的边框大小以防止输出中出现白边默认值1 ScannerImageSplit.selectText.10=设置添加和删除的边框大小以防止输出中出现白边默认值1
navbar.settings=设置
settings.title=设置
settings.update=可更新
settings.appVersion=应用程序版本:
settings.downloadOption.title=选择下载选项(单个文件非压缩文件):
settings.downloadOption.1=在同一窗口打开
settings.downloadOption.2=在新窗口中打开
settings.downloadOption.3=下载文件
settings.zipThreshold=当下载的文件数量超过限制时,将文件压缩。
#OCR #OCR
ocr.title=OCR/扫描清理 ocr.title=OCR/扫描清理
@@ -203,7 +542,7 @@ ocr.credit=此服务使用OCRmyPDF和Tesseract进行OCR。
ocr.submit=用OCR处理PDF ocr.submit=用OCR处理PDF
#extractImages
extractImages.title=提取图像 extractImages.title=提取图像
extractImages.header=提取图像 extractImages.header=提取图像
extractImages.selectText=选择图像格式,将提取的图像转换为 extractImages.selectText=选择图像格式,将提取的图像转换为
@@ -221,14 +560,12 @@ fileToPDF.submit=转换为 PDF
#compress #compress
compress.title=压缩 compress.title=压缩
compress.header=压缩PDF compress.header=压缩PDF
compress.credit=此服务使用OCRmyPDF进行PDF压缩/优化。 compress.credit=此服务使用 Ghostscript 进行 PDF 压缩/优化。
compress.selectText.1=优化水平: compress.selectText.1=手动模式 - 从 1 到 4
compress.selectText.2=0 (无优化) compress.selectText.2=优化级别:
compress.selectText.3=1 (默认,无损优化) compress.selectText.3=4文本图像很糟糕
compress.selectText.4=2 (有损优化) compress.selectText.4=自动模式 - 自动调整质量以获得精确大小的 PDF
compress.selectText.5=3 (有损优化,更激进) compress.selectText.5=预期 PDF 大小(例如 25MB、10.8MB、25KB
compress.selectText.6=启用快速网络视图线性化PDF
compress.selectText.7=启用有损的JBIG2编码
compress.submit=压缩 compress.submit=压缩
@@ -236,6 +573,7 @@ compress.submit=压缩
addImage.title=添加图像 addImage.title=添加图像
addImage.header=添加图片到PDF (Work in progress) addImage.header=添加图片到PDF (Work in progress)
addImage.everyPage=每一页? addImage.everyPage=每一页?
addImage.upload=添加图片
addImage.submit=添加图片 addImage.submit=添加图片
@@ -244,11 +582,13 @@ merge.title=合并
merge.header=合并多个PDF2个以上 merge.header=合并多个PDF2个以上
merge.submit=合并 merge.submit=合并
#pdfOrganiser #pdfOrganiser
pdfOrganiser.title=页面排序 pdfOrganiser.title=页面排序
pdfOrganiser.header=PDF页面排序 pdfOrganiser.header=PDF页面排序
pdfOrganiser.submit=重新排列页面 pdfOrganiser.submit=重新排列页面
#multiTool #multiTool
multiTool.title=PDF多功能工具 multiTool.title=PDF多功能工具
multiTool.header=PDF多功能工具 multiTool.header=PDF多功能工具
@@ -260,6 +600,7 @@ pageRemover.header=PDF页面移除器
pageRemover.pagesToDelete=要删除的页面(输入一个用逗号分隔的页码列表): pageRemover.pagesToDelete=要删除的页面(输入一个用逗号分隔的页码列表):
pageRemover.submit=删除页面 pageRemover.submit=删除页面
#rotate #rotate
rotate.title=旋转PDF rotate.title=旋转PDF
rotate.header=旋转PDF rotate.header=旋转PDF
@@ -267,8 +608,6 @@ rotate.selectAngle=选择旋转角度以90度的倍数
rotate.submit=旋转 rotate.submit=旋转
#merge #merge
split.title=拆分PDF split.title=拆分PDF
split.header=拆分PDF split.header=拆分PDF
@@ -294,6 +633,7 @@ imageToPDF.selectText.3=多文件逻辑(仅在处理多个图像时启用)
imageToPDF.selectText.4=合并成一个PDF文件 imageToPDF.selectText.4=合并成一个PDF文件
imageToPDF.selectText.5=转换为独立的PDF文件 imageToPDF.selectText.5=转换为独立的PDF文件
#pdfToImage #pdfToImage
pdfToImage.title=PDF to Image pdfToImage.title=PDF to Image
pdfToImage.header=PDF转图片 pdfToImage.header=PDF转图片
@@ -307,6 +647,7 @@ pdfToImage.grey=灰度
pdfToImage.blackwhite=黑白(可能会丢失数据!)。 pdfToImage.blackwhite=黑白(可能会丢失数据!)。
pdfToImage.submit=转换 pdfToImage.submit=转换
#addPassword #addPassword
addPassword.title=添加密码 addPassword.title=添加密码
addPassword.header=添加密码(加密)。 addPassword.header=添加密码(加密)。
@@ -322,9 +663,13 @@ addPassword.selectText.9=防止填写表格
addPassword.selectText.10=防止修改 addPassword.selectText.10=防止修改
addPassword.selectText.11=防止修改注释 addPassword.selectText.11=防止修改注释
addPassword.selectText.12=防止打印 addPassword.selectText.12=防止打印
addPassword.selectText.13=防止打印不同的格 addPassword.selectText.13=防止打印不同的格<EFBFBD>
addPassword.selectText.14=Owner Password
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
addPassword.selectText.16=Restricts the opening of the document itself<6C>
addPassword.submit=加密 addPassword.submit=加密
#watermark #watermark
watermark.title=添加水印 watermark.title=添加水印
watermark.header=添加水印 watermark.header=添加水印
@@ -337,6 +682,7 @@ watermark.selectText.6=heightSpacer每个水印之间的垂直空间
watermark.selectText.7=透明度0% - 100% watermark.selectText.7=透明度0% - 100%
watermark.submit=添加水印 watermark.submit=添加水印
#remove-watermark #remove-watermark
remove-watermark.title=去除水印 remove-watermark.title=去除水印
remove-watermark.header=去除水印 remove-watermark.header=去除水印
@@ -344,6 +690,7 @@ remove-watermark.selectText.1=选择要去除水印的PDF
remove-watermark.selectText.2=水印文本: remove-watermark.selectText.2=水印文本:
remove-watermark.submit=移除水印 remove-watermark.submit=移除水印
#Change permissions #Change permissions
permissions.title=更改权限 permissions.title=更改权限
permissions.header=改变权限 permissions.header=改变权限
@@ -360,6 +707,7 @@ permissions.selectText.9=防止打印
permissions.selectText.10=防止打印不同的格式 permissions.selectText.10=防止打印不同的格式
permissions.submit=改变 permissions.submit=改变
#remove password #remove password
removePassword.title=删除密码 removePassword.title=删除密码
removePassword.header=移除密码(解密)。 removePassword.header=移除密码(解密)。
@@ -367,7 +715,9 @@ removePassword.selectText.1=选择要解密的PDF
removePassword.selectText.2=密码 removePassword.selectText.2=密码
removePassword.submit=删除 removePassword.submit=删除
changeMetadata.title=更改元数据
#changeMetadata
changeMetadata.title=标题:
changeMetadata.header=更改元数据 changeMetadata.header=更改元数据
changeMetadata.selectText.1=请编辑你想要改变的变量。 changeMetadata.selectText.1=请编辑你想要改变的变量。
changeMetadata.selectText.2=删除所有元数据 changeMetadata.selectText.2=删除所有元数据
@@ -385,27 +735,30 @@ changeMetadata.selectText.4=其他元数据:
changeMetadata.selectText.5=添加自定义元数据条目 changeMetadata.selectText.5=添加自定义元数据条目
changeMetadata.submit=更改 changeMetadata.submit=更改
#xlsToPdf
xlsToPdf.title=Excel转PDF xlsToPdf.title=Excel转PDF
xlsToPdf.header=Excel转PDF xlsToPdf.header=Excel转PDF
xlsToPdf.selectText.1=选择要转换的XLS或XLSX Excel表格 xlsToPdf.selectText.1=选择要转换的XLS或XLSX Excel表格
xlsToPdf.convert=转换 xlsToPdf.convert=转换
#pdfToPDFA
pdfToPDFA.title=PDF To PDF/A pdfToPDFA.title=PDF To PDF/A
pdfToPDFA.header=PDF to PDF/A pdfToPDFA.header=PDF to PDF/A
pdfToPDFA.credit=此服务使用OCRmyPDF进行PDF/A转换 pdfToPDFA.credit=此服务使用OCRmyPDF进行PDF/A转换
pdfToPDFA.submit=转换 pdfToPDFA.submit=转换
#PDFToWord
PDFToWord.title=PDF to Word PDFToWord.title=PDF to Word
PDFToWord.header=将PDF转换成Word PDFToWord.header=将PDF转换成Word
PDFToWord.selectText.1=输出文件格式 PDFToWord.selectText.1=输出文件格式
PDFToWord.credit=此服务使用LibreOffice进行文件转换。 PDFToWord.credit=此服务使用LibreOffice进行文件转换。
PDFToWord.submit=转换 PDFToWord.submit=转换
#PDFToPresentation
PDFToPresentation.title=PDF To Presentation PDFToPresentation.title=PDF To Presentation
PDFToPresentation.header=将PDF转为演示文稿 PDFToPresentation.header=将PDF转为演示文稿
PDFToPresentation.selectText.1=输出文件格式 PDFToPresentation.selectText.1=输出文件格式
@@ -413,18 +766,22 @@ PDFToPresentation.credit=该服务使用LibreOffice进行文件转换。
PDFToPresentation.submit=转换 PDFToPresentation.submit=转换
PDFToText.title=PDF To Text/RTF #PDFToText
PDFToText.title=PDF to RTF (Text)
PDFToText.header=将PDF转换成文本/RTF PDFToText.header=将PDF转换成文本/RTF
PDFToText.selectText.1=输出文件格式 PDFToText.selectText.1=输出文件格式
PDFToText.credit=该服务使用LibreOffice进行文件转换。 PDFToText.credit=该服务使用LibreOffice进行文件转换。
PDFToText.submit=转换 PDFToText.submit=转换
#PDFToHTML
PDFToHTML.title=PDF To HTML PDFToHTML.title=PDF To HTML
PDFToHTML.header=将PDF转换成HTML PDFToHTML.header=将PDF转换成HTML
PDFToHTML.credit=此服务使用LibreOffice进行文件转换。 PDFToHTML.credit=此服务使用LibreOffice进行文件转换。
PDFToHTML.submit=转换 PDFToHTML.submit=转换
#PDFToXML
PDFToXML.title=PDF To XML PDFToXML.title=PDF To XML
PDFToXML.header=将PDF转换为XML PDFToXML.header=将PDF转换为XML
PDFToXML.credit=此服务使用LibreOffice进行文件转换。 PDFToXML.credit=此服务使用LibreOffice进行文件转换。

View File

@@ -5,6 +5,11 @@ body {
background-color: rgb(var(--body-background-color)) !important; background-color: rgb(var(--body-background-color)) !important;
color: rgb(var(--base-font-color)) !important; color: rgb(var(--base-font-color)) !important;
} }
.card {
background-color: rgb(var(--body-background-color)) !important;
border: 1px solid #999;
color: rgb(var(--base-font-color)) !important;
}
.dark-card { .dark-card {
background-color: rgb(var(--body-background-color)) !important; background-color: rgb(var(--body-background-color)) !important;

View File

@@ -0,0 +1,94 @@
#errorContainer {
margin: 20px; /* adjust this value as needed */
}
#helpModalDialog {
width: 90%;
max-width: 800px;
}
#helpModal h1 {
text-align: center;
margin-top: 10%;
}
#helpModal p {
text-align: center;
margin-top: 2em;
}
#helpModal .button:hover {
background-color: #005b7f;
}
#helpModal .features-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(21rem, 3fr));
gap: 25px 30px;
}
#helpModal .feature-card {
border: 1px solid rgba(0, 0, 0, .125);
border-radius: 0.25rem;
padding: 1.25rem;
display: flex;
flex-direction: column;
align-items: flex-start;
}
#helpModal .feature-card .card-text {
flex: 1;
}
#support-section {
background-color: #f9f9f9;
padding: 4rem;
margin-top: 1rem;
text-align: center;
}
#support-section h1 {
margin-top: 0;
}
#support-section p {
margin-top: 0;
}
#button-group {
display: flex;
justify-content: center;
flex-wrap: wrap;
}
#github-button, #discord-button {
display: inline-block;
padding: 1rem 2rem;
margin: 1rem;
background-color: #008CBA;
color: #fff;
font-size: 1.2rem;
text-align: center;
text-decoration: none;
border-radius: 3rem;
transition: all 0.3s ease-in-out;
}
#github-button:hover, #discord-button:hover, #home-button:hover {
background-color: #005b7f;
}
#home-button {
display: block;
width: 200px;
height: 50px;
margin: 2em auto;
background-color: #008CBA;
color: white;
text-align: center;
line-height: 50px;
text-decoration: none;
font-weight: bold;
border-radius: 25px;
transition: all 0.3s ease-in-out;
}

View File

@@ -0,0 +1,10 @@
.custom-file-label {
padding-right: 90px;
}
.selected-files {
margin-top: 10px;
max-height: 150px;
overflow-y: auto;
white-space: pre-wrap;
}

View File

@@ -0,0 +1,49 @@
#game-container {
position: relative;
width: 100vh;
height: 0;
padding-bottom: 75%; /* 4:3 aspect ratio */
background-color: transparent;
margin: auto;
overflow: hidden;
border: 2px solid black; /* Add border */
}
.pdf, .player, .projectile {
position: absolute;
}
.pdf {
width: 50px;
height: 50px;
}
.player {
width: 50px;
height: 50px;
}
.projectile {
background-color: black !important;
width: 5px;
height: 10px;
}
#score, #level, #lives, #high-score {
color: black;
font-family: sans-serif;
position: absolute;
font-size: calc(14px + 0.25vw); /* Reduced font size */
}
#score {
top: 10px;
left: 10px;
}
#lives {
top: 10px;
left: calc(7vw); /* Adjusted position */
}
#high-score {
top: 10px;
left: calc(14vw); /* Adjusted position */
}
#level {
top: 10px;
right: 10px;
}

View File

@@ -12,6 +12,18 @@
bottom: 0; bottom: 0;
width: 100%; width: 100%;
} }
.navbar {
height: auto; /* Adjusts height automatically based on content */
white-space: nowrap; /* Prevents wrapping of navbar contents */
}
/* TODO enable later
.navbar .container {
max-width: 100%; //Allows the container to expand up to full width
margin-left: auto;
margin-right: auto;
}*/
html[lang-direction=ltr] * { html[lang-direction=ltr] * {
direction: ltr; direction: ltr;
@@ -66,3 +78,17 @@ html[lang-direction="rtl"] label.form-check-label {
.margin-center { .margin-center {
margin: 0 auto; margin: 0 auto;
} }
#pdf-canvas {
box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.384);
width: 100%;
}
.fixed-shadow-canvas {
box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.384);
width: 100%;
}
.shadow-canvas {
box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.384);
}
.hidden {
display: none;
}

View File

@@ -0,0 +1,84 @@
#searchBar {
background-image: url('/images/search.svg');
background-position: 16px 16px;
background-repeat: no-repeat;
width: 100%;
font-size: 16px;
margin-bottom: 12px;
padding: 12px 20px 12px 40px;
border: 1px solid #ddd;
}
.features-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(21rem, 3fr));
gap: 25px 30px;
}
.feature-card {
border: 2px solid rgba(0, 0, 0, .25);
border-radius: 0.25rem;
padding: 1.25rem;
display: flex;
flex-direction: column;
align-items: flex-start;
background: rgba(13, 110, 253, 0.05);
transition: transform 0.3s, border 0.3s;
}
.feature-card a {
text-decoration: none;
color: inherit;
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
}
.feature-card .card-text {
flex: 1;
}
.feature-card:hover {
border: 1px solid rgba(0, 0, 0, .5);
cursor: pointer;
transform: scale(1.1);
}
.feature-card:hover .card-title {
text-decoration: underline;
}
.card-title.text-primary {
color: #000; /* Replace with your desired shade of blue */
}
.home-card-icon {
width: 30px;
height: 30px;
transform: translateY(-5px);
}
.home-card-icon-colour {
filter: invert(0.2) sepia(2) saturate(50) hue-rotate(190deg);
}
.favorite-icon {
display: none;
position: absolute;
top: 10px;
right: 10px;
}
/* Only show the favorite icons when the parent card is being hovered over */
.feature-card:hover .favorite-icon {
display: block;
}
.favorite-icon img {
filter: brightness(0);
}
.jumbotron {
padding: 3rem 3rem; /* Reduce vertical padding */
}

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