Compare commits
157 Commits
v0.31.0
...
ghostscrip
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a67b0cfe7 | ||
|
|
d1acda6440 | ||
|
|
5cf3798540 | ||
|
|
b27044016e | ||
|
|
4aec0bd679 | ||
|
|
ab7610f72c | ||
|
|
748392cd29 | ||
|
|
f0810f3952 | ||
|
|
298870ed7d | ||
|
|
6ec2c34c2b | ||
|
|
1db1370420 | ||
|
|
ee4b7e02ab | ||
|
|
e6c5634165 | ||
|
|
5188eb3b04 | ||
|
|
3fa6bcb2ee | ||
|
|
73e64e5898 | ||
|
|
0b359ad4a8 | ||
|
|
23ee77f6ab | ||
|
|
bfc1ed2b39 | ||
|
|
da46d942ba | ||
|
|
5936e856f0 | ||
|
|
fd906d36dd | ||
|
|
8f4709d82e | ||
|
|
8445f2719b | ||
|
|
eaa64e1471 | ||
|
|
4abb0cb85e | ||
|
|
afad06bed4 | ||
|
|
faa8a9752c | ||
|
|
989538e340 | ||
|
|
5b8bdc3352 | ||
|
|
f559eaa4e8 | ||
|
|
f306e00fba | ||
|
|
e09d6f9998 | ||
|
|
3a27aa16d5 | ||
|
|
9a96109ea2 | ||
|
|
ad1cce378f | ||
|
|
9abb105835 | ||
|
|
204bae3bc1 | ||
|
|
547f23fe78 | ||
|
|
543ad083a2 | ||
|
|
61bccd1d8b | ||
|
|
83be709299 | ||
|
|
0e602153f3 | ||
|
|
597619740a | ||
|
|
41a39a0a94 | ||
|
|
b14fba064d | ||
|
|
bd29dd1ac3 | ||
|
|
6d3f14375e | ||
|
|
888aec5701 | ||
|
|
92e7e85e77 | ||
|
|
3bf467e4ff | ||
|
|
dc1887db4d | ||
|
|
bab2052a60 | ||
|
|
7773df7443 | ||
|
|
32d575b4e9 | ||
|
|
4ebeedc028 | ||
|
|
b4b005bc2e | ||
|
|
b92bcfe915 | ||
|
|
aeca2b23d9 | ||
|
|
68349c4426 | ||
|
|
0f6d5e5a41 | ||
|
|
df1c5476d9 | ||
|
|
d0d6a70250 | ||
|
|
a6ae3734ca | ||
|
|
c239d95131 | ||
|
|
d591874da6 | ||
|
|
6c623d8d84 | ||
|
|
e059caa14e | ||
|
|
8eab35761d | ||
|
|
c43af24ffe | ||
|
|
e1b3cc736c | ||
|
|
0fb9e18636 | ||
|
|
5e1aac0b84 | ||
|
|
60bf649260 | ||
|
|
a58696a38e | ||
|
|
44abc67678 | ||
|
|
d1e690ff8d | ||
|
|
5dc8fa08ee | ||
|
|
db028dfe27 | ||
|
|
c24c504350 | ||
|
|
5dcfe64d1c | ||
|
|
d843696703 | ||
|
|
67de8a9460 | ||
|
|
b26aa3417e | ||
|
|
8dfb5940ca | ||
|
|
0ce479e1e3 | ||
|
|
cca3b6b525 | ||
|
|
03529567ba | ||
|
|
781a52c759 | ||
|
|
be2c103065 | ||
|
|
80fd2eff5f | ||
|
|
65abfd9c7a | ||
|
|
1833d7cd73 | ||
|
|
fd93dad9a5 | ||
|
|
ef18b17890 | ||
|
|
d3ae9f9a81 | ||
|
|
4a70d680a4 | ||
|
|
82ebd3dba9 | ||
|
|
15848e3de6 | ||
|
|
ea0d9301ff | ||
|
|
b27e1f254c | ||
|
|
7f30882e5e | ||
|
|
26c0a92e30 | ||
|
|
5cf53e39d0 | ||
|
|
7f566d5de8 | ||
|
|
caa32c5bae | ||
|
|
41c41cc88c | ||
|
|
c2acd74447 | ||
|
|
4d5d0e3cef | ||
|
|
df6af8766f | ||
|
|
0dd4456ae8 | ||
|
|
b0c8912742 | ||
|
|
467be09749 | ||
|
|
ceabcf2b3d | ||
|
|
361a0c9be8 | ||
|
|
128ca8e224 | ||
|
|
7d1d6d1f12 | ||
|
|
645c786d95 | ||
|
|
862a88e2e9 | ||
|
|
2f92aa90ef | ||
|
|
ba8dd04086 | ||
|
|
c13509cf67 | ||
|
|
0ab02e6ceb | ||
|
|
af52652aee | ||
|
|
e534f022f5 | ||
|
|
84867a7ad7 | ||
|
|
e97cb9d49e | ||
|
|
1b0c1b6cff | ||
|
|
7eea7fb3cb | ||
|
|
c921b5d76f | ||
|
|
26ec0c5d77 | ||
|
|
404e31468e | ||
|
|
0c0f61aa0d | ||
|
|
40ffb6559d | ||
|
|
645c5ff36f | ||
|
|
83db7a22f5 | ||
|
|
ebfccfa835 | ||
|
|
aa810163d2 | ||
|
|
dcb69ad66a | ||
|
|
1a19024961 | ||
|
|
68c9601245 | ||
|
|
7ec343d9ce | ||
|
|
6f42d976f6 | ||
|
|
cf13803fd4 | ||
|
|
a8d0d1a871 | ||
|
|
a5aac01b4d | ||
|
|
2be14788b1 | ||
|
|
217404be7f | ||
|
|
d3dc3e07b2 | ||
|
|
94702dbafa | ||
|
|
febc3cf48b | ||
|
|
c5abb47403 | ||
|
|
0e3c9bcc10 | ||
|
|
384c3ee88f | ||
|
|
5f7a0537f9 | ||
|
|
5aa5628465 | ||
|
|
0d91bca932 |
17
.github/labeler-config.yml
vendored
17
.github/labeler-config.yml
vendored
@@ -16,21 +16,27 @@ Java:
|
||||
|
||||
Back End:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/security/**/*'
|
||||
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/model/provider/**/*'
|
||||
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/**/*'
|
||||
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/**/*'
|
||||
- any-glob-to-any-file: 'src/main/resources/settings.yml.template'
|
||||
- any-glob-to-any-file: 'src/main/resources/application.properties'
|
||||
- any-glob-to-any-file: 'src/main/resources/banner.txt'
|
||||
- any-glob-to-any-file: 'scripts/png_to_webp.py'
|
||||
- any-glob-to-any-file: 'split_photos.py'
|
||||
|
||||
Security:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/security/**/*'
|
||||
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/model/provider/**/*'
|
||||
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/model/AuthenticationType.java'
|
||||
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/provider/**/*'
|
||||
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/AuthenticationType.java'
|
||||
- any-glob-to-any-file: 'scripts/download-security-jar.sh'
|
||||
|
||||
API:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/MetricsController.java'
|
||||
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/**/*'
|
||||
- any-glob-to-any-file: 'scripts/png_to_webp.py'
|
||||
- any-glob-to-any-file: 'split_photos.py'
|
||||
|
||||
Documentation:
|
||||
- changed-files:
|
||||
@@ -43,6 +49,9 @@ Docker:
|
||||
- any-glob-to-any-file: 'Dockerfile'
|
||||
- any-glob-to-any-file: 'Dockerfile-*'
|
||||
- any-glob-to-any-file: 'exampleYmlFiles/*.yml'
|
||||
- any-glob-to-any-file: 'scripts/init.sh'
|
||||
- any-glob-to-any-file: 'scripts/init-without-ocr.sh'
|
||||
- any-glob-to-any-file: 'scripts/installFonts.sh'
|
||||
|
||||
Test:
|
||||
- changed-files:
|
||||
|
||||
21
.github/labels.yml
vendored
21
.github/labels.yml
vendored
@@ -3,9 +3,12 @@
|
||||
#
|
||||
# The repository labels will be automatically configured using this file and
|
||||
# the GitHub Action https://github.com/marketplace/actions/github-labeler.
|
||||
- name: "Licenses"
|
||||
color: "EDEDED"
|
||||
from_name: "licenses"
|
||||
- name: "Back End"
|
||||
color: "20CE6C"
|
||||
description: "Issues related to back-end development"
|
||||
description: "Issues or pull requests related to back-end development"
|
||||
from_name: "Back end"
|
||||
- name: "Bug"
|
||||
description: "Something isn't working"
|
||||
@@ -24,6 +27,7 @@
|
||||
from_name: "documentation"
|
||||
- name: "Done for next release"
|
||||
color: "0CDBD1"
|
||||
description: "Items that are completed and will be included in the next release"
|
||||
- name: "Done"
|
||||
color: "60F13B"
|
||||
- name: "duplicate"
|
||||
@@ -37,7 +41,7 @@
|
||||
description: "Fix needs to be confirmed"
|
||||
- name: "Front End"
|
||||
color: "BBD2F1"
|
||||
description: "Issues related to front-end development"
|
||||
description: "Issues or pull requests related to front-end development"
|
||||
- name: "github-actions"
|
||||
description: "Pull requests that update GitHub Actions code"
|
||||
color: "999999"
|
||||
@@ -91,3 +95,16 @@
|
||||
description: "Testing-related issues or pull requests"
|
||||
- name: "Stale"
|
||||
color: "000000"
|
||||
description: "Issues or pull requests that have become inactive"
|
||||
- name: "Priority: Critical"
|
||||
color: "000000"
|
||||
description: "Issues or pull requests with the highest priority"
|
||||
- name: "Priority: High"
|
||||
color: "FF0000"
|
||||
description: "Issues or pull requests with high priority"
|
||||
- name: "Priority: Medium"
|
||||
color: "FFFF00"
|
||||
description: "Issues or pull requests with medium priority"
|
||||
- name: "Priority: Low"
|
||||
color: "00FF00"
|
||||
description: "Issues or pull requests with low priority"
|
||||
|
||||
2
.github/pull_request_template.md
vendored
2
.github/pull_request_template.md
vendored
@@ -8,6 +8,8 @@ Closes #(issue_number)
|
||||
|
||||
- [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
|
||||
- [ ] I have performed a self-review of my own code
|
||||
- [ ] I have attached images of the change if it is UI based
|
||||
- [ ] I have commented my code, particularly in hard-to-understand areas
|
||||
- [ ] If my code has heavily changed functionality I have updated relevant docs on [Stirling-PDFs doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
|
||||
- [ ] My changes generate no new warnings
|
||||
- [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only)
|
||||
|
||||
117
.github/scripts/check_language_properties.py
vendored
117
.github/scripts/check_language_properties.py
vendored
@@ -9,8 +9,9 @@ The script also provides functionality to update the translation files to match
|
||||
adjusting the format.
|
||||
|
||||
Usage:
|
||||
python script_name.py --reference-file <path_to_reference_file> --branch <branch_name> [--files <list_of_changed_files>]
|
||||
python check_language_properties.py --reference-file <path_to_reference_file> --branch <branch_name> [--actor <actor_name>] [--files <list_of_changed_files>]
|
||||
"""
|
||||
|
||||
import copy
|
||||
import glob
|
||||
import os
|
||||
@@ -18,6 +19,10 @@ import argparse
|
||||
import re
|
||||
|
||||
|
||||
# Maximum size for properties files (e.g., 200 KB)
|
||||
MAX_FILE_SIZE = 200 * 1024
|
||||
|
||||
|
||||
def parse_properties_file(file_path):
|
||||
"""Parses a .properties file and returns a list of objects (including comments, empty lines, and line numbers)."""
|
||||
properties_list = []
|
||||
@@ -95,7 +100,7 @@ def write_json_file(file_path, updated_properties):
|
||||
def update_missing_keys(reference_file, file_list, branch=""):
|
||||
reference_properties = parse_properties_file(reference_file)
|
||||
for file_path in file_list:
|
||||
basename_current_file = os.path.basename(branch + file_path)
|
||||
basename_current_file = os.path.basename(os.path.join(branch, file_path))
|
||||
if (
|
||||
basename_current_file == os.path.basename(reference_file)
|
||||
or not file_path.endswith(".properties")
|
||||
@@ -103,7 +108,7 @@ def update_missing_keys(reference_file, file_list, branch=""):
|
||||
):
|
||||
continue
|
||||
|
||||
current_properties = parse_properties_file(branch + file_path)
|
||||
current_properties = parse_properties_file(os.path.join(branch, file_path))
|
||||
updated_properties = []
|
||||
for ref_entry in reference_properties:
|
||||
ref_entry_copy = copy.deepcopy(ref_entry)
|
||||
@@ -114,60 +119,79 @@ def update_missing_keys(reference_file, file_list, branch=""):
|
||||
if ref_entry_copy["key"] == current_entry["key"]:
|
||||
ref_entry_copy["value"] = current_entry["value"]
|
||||
updated_properties.append(ref_entry_copy)
|
||||
write_json_file(branch + file_path, updated_properties)
|
||||
write_json_file(os.path.join(branch, file_path), updated_properties)
|
||||
|
||||
|
||||
def check_for_missing_keys(reference_file, file_list, branch):
|
||||
update_missing_keys(reference_file, file_list, branch + "/")
|
||||
update_missing_keys(reference_file, file_list, branch)
|
||||
|
||||
|
||||
def read_properties(file_path):
|
||||
with open(file_path, "r", encoding="utf-8") as file:
|
||||
return file.read().splitlines()
|
||||
if os.path.isfile(file_path) and os.path.exists(file_path):
|
||||
with open(file_path, "r", encoding="utf-8") as file:
|
||||
return file.read().splitlines()
|
||||
return [""]
|
||||
|
||||
|
||||
def check_for_differences(reference_file, file_list, branch):
|
||||
def check_for_differences(reference_file, file_list, branch, actor):
|
||||
reference_branch = reference_file.split("/")[0]
|
||||
basename_reference_file = os.path.basename(reference_file)
|
||||
|
||||
report = []
|
||||
report.append(
|
||||
f"### 📋 Checking with the file `{basename_reference_file}` from the `{reference_branch}` - Checking the `{branch}`"
|
||||
)
|
||||
report.append(f"#### 🔄 Reference Branch: `{reference_branch}`")
|
||||
reference_lines = read_properties(reference_file)
|
||||
has_differences = False
|
||||
|
||||
only_reference_file = True
|
||||
|
||||
for file_path in file_list:
|
||||
basename_current_file = os.path.basename(branch + "/" + file_path)
|
||||
file_arr = file_list
|
||||
|
||||
if len(file_list) == 1:
|
||||
file_arr = file_list[0].split()
|
||||
base_dir = os.path.abspath(os.path.join(os.getcwd(), "src", "main", "resources"))
|
||||
|
||||
for file_path in file_arr:
|
||||
absolute_path = os.path.abspath(file_path)
|
||||
# Verify that file is within the expected directory
|
||||
if not absolute_path.startswith(base_dir):
|
||||
raise ValueError(f"Unsafe file found: {file_path}")
|
||||
# Verify file size before processing
|
||||
if os.path.getsize(os.path.join(branch, file_path)) > MAX_FILE_SIZE:
|
||||
raise ValueError(
|
||||
f"The file {file_path} is too large and could pose a security risk."
|
||||
)
|
||||
|
||||
basename_current_file = os.path.basename(os.path.join(branch, file_path))
|
||||
if (
|
||||
basename_current_file == basename_reference_file
|
||||
or not file_path.startswith(
|
||||
os.path.join("src", "main", "resources", "messages_")
|
||||
)
|
||||
or not file_path.endswith(".properties")
|
||||
or not basename_current_file.startswith("messages_")
|
||||
):
|
||||
continue
|
||||
only_reference_file = False
|
||||
report.append(f"#### 🗂️ **Checking File:** `{basename_current_file}`...")
|
||||
current_lines = read_properties(branch + "/" + file_path)
|
||||
report.append(f"#### 📃 **File Check:** `{basename_current_file}`")
|
||||
current_lines = read_properties(os.path.join(branch, file_path))
|
||||
reference_line_count = len(reference_lines)
|
||||
current_line_count = len(current_lines)
|
||||
|
||||
if reference_line_count != current_line_count:
|
||||
report.append("")
|
||||
report.append("- **Test 1 Status:** ❌ Failed")
|
||||
report.append("1. **Test Status:** ❌ **_Failed_**")
|
||||
report.append(" - **Issue:**")
|
||||
has_differences = True
|
||||
if reference_line_count > current_line_count:
|
||||
report.append(
|
||||
f" - **Issue:** Missing lines! Comments, empty lines, or translation strings are missing. Details: {reference_line_count} (reference) vs {current_line_count} (current)."
|
||||
f" - **_Mismatched line count_**: {reference_line_count} (reference) vs {current_line_count} (current). Comments, empty lines, or translation strings are missing."
|
||||
)
|
||||
elif reference_line_count < current_line_count:
|
||||
report.append(
|
||||
f" - **Issue:** Too many lines! Check your translation files! Details: {reference_line_count} (reference) vs {current_line_count} (current)."
|
||||
f" - **_Too many lines_**: {reference_line_count} (reference) vs {current_line_count} (current). Please verify if there is an additional line that needs to be removed."
|
||||
)
|
||||
# update_missing_keys(reference_file, [file_path], branch + "/")
|
||||
else:
|
||||
report.append("- **Test 1 Status:** ✅ Passed")
|
||||
report.append("1. **Test Status:** ✅ **_Passed_**")
|
||||
|
||||
# Check for missing or extra keys
|
||||
current_keys = []
|
||||
@@ -192,32 +216,42 @@ def check_for_differences(reference_file, file_list, branch):
|
||||
has_differences = True
|
||||
missing_keys_str = "`, `".join(missing_keys_list)
|
||||
extra_keys_str = "`, `".join(extra_keys_list)
|
||||
report.append("- **Test 2 Status:** ❌ Failed")
|
||||
report.append("2. **Test Status:** ❌ **_Failed_**")
|
||||
report.append(" - **Issue:**")
|
||||
if missing_keys_list:
|
||||
spaces_keys_list = []
|
||||
for key in missing_keys_list:
|
||||
if " " in key:
|
||||
spaces_keys_list.append(key)
|
||||
if spaces_keys_list:
|
||||
spaces_keys_str = "`, `".join(spaces_keys_list)
|
||||
report.append(
|
||||
f" - **_Keys containing unnecessary spaces_**: `{spaces_keys_str}`!"
|
||||
)
|
||||
report.append(
|
||||
f" - **Issue:** There are keys in ***{basename_current_file}*** `{missing_keys_str}` that are not present in ***{basename_reference_file}***!"
|
||||
f" - **_Extra keys in `{basename_current_file}`_**: `{missing_keys_str}` that are not present in **_`{basename_reference_file}`_**."
|
||||
)
|
||||
if extra_keys_list:
|
||||
report.append(
|
||||
f" - **Issue:** There are keys in ***{basename_reference_file}*** `{extra_keys_str}` that are not present in ***{basename_current_file}***!"
|
||||
f" - **_Missing keys in `{basename_reference_file}`_**: `{extra_keys_str}` that are not present in **_`{basename_current_file}`_**."
|
||||
)
|
||||
# update_missing_keys(reference_file, [file_path], branch + "/")
|
||||
else:
|
||||
report.append("- **Test 2 Status:** ✅ Passed")
|
||||
# if has_differences:
|
||||
# report.append("")
|
||||
# report.append(f"#### 🚧 ***{basename_current_file}*** will be corrected...")
|
||||
report.append("2. **Test Status:** ✅ **_Passed_**")
|
||||
report.append("")
|
||||
report.append("---")
|
||||
report.append("")
|
||||
# update_file_list = glob.glob(branch + "/src/**/messages_*.properties", recursive=True)
|
||||
# update_missing_keys(reference_file, update_file_list)
|
||||
# report.append("---")
|
||||
# report.append("")
|
||||
if has_differences:
|
||||
report.append("## ❌ Overall Check Status: **_Failed_**")
|
||||
report.append("")
|
||||
report.append(
|
||||
f"@{actor} please check your translation if it conforms to the standard. Follow the format of [messages_en_GB.properties](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties)"
|
||||
)
|
||||
else:
|
||||
report.append("## ✅ Overall Check Status: **_Success_**")
|
||||
report.append("")
|
||||
report.append(
|
||||
f"Thanks @{actor} for your help in keeping the translations up to date."
|
||||
)
|
||||
|
||||
if not only_reference_file:
|
||||
print("\n".join(report))
|
||||
@@ -225,6 +259,11 @@ def check_for_differences(reference_file, file_list, branch):
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Find missing keys")
|
||||
parser.add_argument(
|
||||
"--actor",
|
||||
required=False,
|
||||
help="Actor from PR.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--reference-file",
|
||||
required=True,
|
||||
@@ -244,11 +283,21 @@ if __name__ == "__main__":
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
# Sanitize --actor input to avoid injection attacks
|
||||
if args.actor:
|
||||
args.actor = re.sub(r"[^a-zA-Z0-9_\\-]", "", args.actor)
|
||||
|
||||
# Sanitize --branch input to avoid injection attacks
|
||||
if args.branch:
|
||||
args.branch = re.sub(r"[^a-zA-Z0-9\\-]", "", args.branch)
|
||||
|
||||
file_list = args.files
|
||||
if file_list is None:
|
||||
file_list = glob.glob(
|
||||
os.getcwd() + "/src/**/messages_*.properties", recursive=True
|
||||
os.path.join(
|
||||
os.getcwd(), "src", "main", "resources", "messages_*.properties"
|
||||
)
|
||||
)
|
||||
update_missing_keys(args.reference_file, file_list)
|
||||
else:
|
||||
check_for_differences(args.reference_file, file_list, args.branch)
|
||||
check_for_differences(args.reference_file, file_list, args.branch, args.actor)
|
||||
|
||||
100
.github/scripts/gradle_to_chart.py
vendored
100
.github/scripts/gradle_to_chart.py
vendored
@@ -1,100 +0,0 @@
|
||||
import re
|
||||
import yaml
|
||||
|
||||
# Paths to the files
|
||||
chart_yaml_path = "chart/stirling-pdf/Chart.yaml"
|
||||
gradle_path = "build.gradle"
|
||||
|
||||
|
||||
def get_chart_version(path):
|
||||
"""
|
||||
Reads the version and the appVersion from Chart.yaml.
|
||||
|
||||
Args:
|
||||
path (str): The file path to the Chart.yaml.
|
||||
|
||||
Returns:
|
||||
dict: The version under "chart" key and the appVersion under "app" key.
|
||||
"""
|
||||
with open(path, encoding="utf-8") as file:
|
||||
chart_yaml = yaml.safe_load(file)
|
||||
return {
|
||||
"chart": chart_yaml["version"],
|
||||
"app": chart_yaml["appVersion"]
|
||||
}
|
||||
|
||||
|
||||
def get_gradle_version(path):
|
||||
"""
|
||||
Extracts the version from build.gradle.
|
||||
|
||||
Args:
|
||||
path (str): The file path to the build.gradle.
|
||||
|
||||
Returns:
|
||||
str: The version if found, otherwise an empty string.
|
||||
"""
|
||||
with open(path, encoding="utf-8") as file:
|
||||
for line in file:
|
||||
if "version =" in line:
|
||||
# Extracts the value after 'version ='
|
||||
return re.search(r'version\s*=\s*[\'"](.+?)[\'"]', line).group(1)
|
||||
return ""
|
||||
|
||||
|
||||
def get_new_chart_version(chart_version, old_app_version, new_app_version):
|
||||
"""
|
||||
Get the new chart version from
|
||||
|
||||
Args:
|
||||
str: The current chart version.
|
||||
str: The current app version.
|
||||
str: The new app version.
|
||||
|
||||
Returns:
|
||||
str: The new chart version to update to.
|
||||
"""
|
||||
chart_major, chart_minor, chart_patch = chart_version.split(".")
|
||||
|
||||
old_major, old_minor, old_patch = old_app_version.split(".")
|
||||
new_major, new_minor, new_patch = new_app_version.split(".")
|
||||
|
||||
if old_major != new_major:
|
||||
new_chart_version = f"{int(chart_major)+1}.0.0"
|
||||
elif old_minor != new_minor:
|
||||
new_chart_version = f"{chart_major}.{int(chart_minor)+1}.0"
|
||||
elif old_patch != new_patch:
|
||||
new_chart_version = f"{chart_major}.{chart_minor}.{int(chart_patch)+1}"
|
||||
|
||||
return new_chart_version
|
||||
|
||||
|
||||
def update_chart_version(path, new_chart_version, new_app_version):
|
||||
"""
|
||||
Updates the version and the appVersion in Chart.yaml with a new version.
|
||||
|
||||
Args:
|
||||
path (str): The file path to the Chart.yaml.
|
||||
new_chart_version (str): The new chart version to update to.
|
||||
new_app_version (str): The new app version to update to.
|
||||
"""
|
||||
with open(path, encoding="utf-8") as file:
|
||||
chart_yaml = yaml.safe_load(file)
|
||||
chart_yaml["version"] = new_chart_version
|
||||
chart_yaml["appVersion"] = new_app_version
|
||||
with open(path, "w", encoding="utf-8") as file:
|
||||
yaml.safe_dump(chart_yaml, file)
|
||||
|
||||
|
||||
# Main logic
|
||||
chart_version = get_chart_version(chart_yaml_path)
|
||||
gradle_version = get_gradle_version(gradle_path)
|
||||
|
||||
if chart_version["app"] != gradle_version:
|
||||
new_chart_version = get_new_chart_version(chart_version["chart"], chart_version["app"], gradle_version, )
|
||||
print(
|
||||
f"Versions do not match. Updating Chart.yaml from {chart_version['chart']} to {new_chart_version}."
|
||||
)
|
||||
update_chart_version(chart_yaml_path, new_chart_version, gradle_version)
|
||||
else:
|
||||
print("Versions match. No update required.")
|
||||
179
.github/workflows/PR-Demo-Comment.yml
vendored
Normal file
179
.github/workflows/PR-Demo-Comment.yml
vendored
Normal file
@@ -0,0 +1,179 @@
|
||||
name: PR Deployment via Comment
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
|
||||
jobs:
|
||||
check-comment:
|
||||
runs-on: ubuntu-latest
|
||||
if: |
|
||||
github.event.issue.pull_request &&
|
||||
(
|
||||
contains(github.event.comment.body, 'prdeploy') ||
|
||||
contains(github.event.comment.body, 'deploypr')
|
||||
)
|
||||
&&
|
||||
(
|
||||
github.event.comment.user.login == 'frooodle' ||
|
||||
github.event.comment.user.login == 'sf298' ||
|
||||
github.event.comment.user.login == 'Ludy87' ||
|
||||
github.event.comment.user.login == 'LaserKaspar' ||
|
||||
github.event.comment.user.login == 'sbplat' ||
|
||||
github.event.comment.user.login == 'reecebrowne'
|
||||
)
|
||||
outputs:
|
||||
pr_number: ${{ steps.get-pr.outputs.pr_number }}
|
||||
pr_repository: ${{ steps.get-pr-info.outputs.repository }}
|
||||
pr_ref: ${{ steps.get-pr-info.outputs.ref }}
|
||||
|
||||
steps:
|
||||
- name: Get PR data
|
||||
id: get-pr
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const prNumber = context.payload.issue.number;
|
||||
console.log(`PR Number: ${prNumber}`);
|
||||
core.setOutput('pr_number', prNumber);
|
||||
|
||||
- name: Get PR repository and ref
|
||||
id: get-pr-info
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const { owner, repo } = context.repo;
|
||||
const prNumber = context.payload.issue.number;
|
||||
|
||||
const { data: pr } = await github.rest.pulls.get({
|
||||
owner,
|
||||
repo,
|
||||
pull_number: prNumber,
|
||||
});
|
||||
|
||||
// For forks, use the full repository name, for internal PRs use the current repo
|
||||
const repository = pr.head.repo.fork ? pr.head.repo.full_name : `${owner}/${repo}`;
|
||||
|
||||
console.log(`PR Repository: ${repository}`);
|
||||
console.log(`PR Branch: ${pr.head.ref}`);
|
||||
|
||||
core.setOutput('repository', repository);
|
||||
core.setOutput('ref', pr.head.ref);
|
||||
|
||||
deploy-pr:
|
||||
needs: check-comment
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout PR
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: ${{ needs.check-comment.outputs.pr_repository }}
|
||||
ref: ${{ needs.check-comment.outputs.pr_ref }}
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'temurin'
|
||||
|
||||
- name: Run Gradle Command
|
||||
run: ./gradlew clean build
|
||||
env:
|
||||
DOCKER_ENABLE_SECURITY: false
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Get version number
|
||||
id: versionNumber
|
||||
run: echo "versionNumber=$(./gradlew printVersion --quiet | tail -1)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_HUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_HUB_API }}
|
||||
|
||||
- name: Build and push PR-specific image
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
push: true
|
||||
tags: ${{ secrets.DOCKER_HUB_USERNAME }}/test:pr-${{ needs.check-comment.outputs.pr_number }}
|
||||
build-args: VERSION_TAG=${{ steps.versionNumber.outputs.versionNumber }}
|
||||
platforms: linux/amd64
|
||||
|
||||
- name: Set up SSH
|
||||
run: |
|
||||
mkdir -p ~/.ssh/
|
||||
echo "${{ secrets.VPS_SSH_KEY }}" > ../private.key
|
||||
sudo chmod 600 ../private.key
|
||||
|
||||
- name: Deploy to VPS
|
||||
run: |
|
||||
# First create the docker-compose content locally
|
||||
cat > docker-compose.yml << 'EOF'
|
||||
version: '3.3'
|
||||
services:
|
||||
stirling-pdf:
|
||||
container_name: stirling-pdf-pr-${{ needs.check-comment.outputs.pr_number }}
|
||||
image: ${{ secrets.DOCKER_HUB_USERNAME }}/test:pr-${{ needs.check-comment.outputs.pr_number }}
|
||||
ports:
|
||||
- "${{ needs.check-comment.outputs.pr_number }}:8080"
|
||||
volumes:
|
||||
- /stirling/PR-${{ needs.check-comment.outputs.pr_number }}/data:/usr/share/tessdata:rw
|
||||
- /stirling/PR-${{ needs.check-comment.outputs.pr_number }}/config:/configs:rw
|
||||
- /stirling/PR-${{ needs.check-comment.outputs.pr_number }}/logs:/logs:rw
|
||||
environment:
|
||||
DOCKER_ENABLE_SECURITY: "false"
|
||||
SECURITY_ENABLELOGIN: "false"
|
||||
SYSTEM_DEFAULTLOCALE: en-GB
|
||||
UI_APPNAME: "Stirling-PDF PR#${{ needs.check-comment.outputs.pr_number }}"
|
||||
UI_HOMEDESCRIPTION: "PR#${{ needs.check-comment.outputs.pr_number }} for Stirling-PDF Latest"
|
||||
UI_APPNAMENAVBAR: "PR#${{ needs.check-comment.outputs.pr_number }}"
|
||||
SYSTEM_MAXFILESIZE: "100"
|
||||
METRICS_ENABLED: "true"
|
||||
SYSTEM_GOOGLEVISIBILITY: "false"
|
||||
restart: on-failure:5
|
||||
EOF
|
||||
|
||||
# Then copy the file and execute commands
|
||||
scp -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null docker-compose.yml ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }}:/tmp/docker-compose.yml
|
||||
|
||||
ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -T ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }} << 'ENDSSH'
|
||||
# Create PR-specific directories
|
||||
mkdir -p /stirling/PR-${{ needs.check-comment.outputs.pr_number }}/{data,config,logs}
|
||||
|
||||
# Move docker-compose file to correct location
|
||||
mv /tmp/docker-compose.yml /stirling/PR-${{ needs.check-comment.outputs.pr_number }}/docker-compose.yml
|
||||
|
||||
# Start or restart the container
|
||||
cd /stirling/PR-${{ needs.check-comment.outputs.pr_number }}
|
||||
docker-compose pull
|
||||
docker-compose up -d
|
||||
ENDSSH
|
||||
|
||||
- name: Post deployment URL to PR
|
||||
if: success()
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const { GITHUB_REPOSITORY } = process.env;
|
||||
const [repoOwner, repoName] = GITHUB_REPOSITORY.split('/');
|
||||
const prNumber = ${{ needs.check-comment.outputs.pr_number }};
|
||||
|
||||
const deploymentUrl = `http://${{ secrets.VPS_HOST }}:${prNumber}`;
|
||||
const commentBody = `## 🚀 PR Test Deployment\n\n` +
|
||||
`Your PR has been deployed for testing!\n\n` +
|
||||
`🔗 **Test URL:** [${deploymentUrl}](${deploymentUrl})\n\n` +
|
||||
`This deployment will be automatically cleaned up when the PR is closed.\n\n`;
|
||||
|
||||
await github.rest.issues.createComment({
|
||||
owner: repoOwner,
|
||||
repo: repoName,
|
||||
issue_number: prNumber,
|
||||
body: commentBody
|
||||
});
|
||||
78
.github/workflows/PR-Demo-cleanup.yml
vendored
Normal file
78
.github/workflows/PR-Demo-cleanup.yml
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
name: PR Deployment cleanup
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, closed]
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
env:
|
||||
SERVER_IP: ${{ secrets.VPS_IP }} # Add this to your GitHub secrets
|
||||
CLEANUP_PERFORMED: 'false' # Add flag to track if cleanup occurred
|
||||
|
||||
jobs:
|
||||
cleanup:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.action == 'closed'
|
||||
|
||||
steps:
|
||||
- name: Set up SSH
|
||||
run: |
|
||||
mkdir -p ~/.ssh/
|
||||
echo "${{ secrets.VPS_SSH_KEY }}" > ../private.key
|
||||
sudo chmod 600 ../private.key
|
||||
|
||||
- name: Cleanup PR deployment
|
||||
id: cleanup
|
||||
run: |
|
||||
CLEANUP_STATUS=$(ssh -i ../private.key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -T ${{ secrets.VPS_USERNAME }}@${{ secrets.VPS_HOST }} << 'ENDSSH'
|
||||
if [ -d "/stirling/PR-${{ github.event.pull_request.number }}" ]; then
|
||||
echo "Found PR directory, proceeding with cleanup..."
|
||||
|
||||
# Stop and remove containers
|
||||
cd /stirling/PR-${{ github.event.pull_request.number }}
|
||||
docker-compose down || true
|
||||
|
||||
# Go back to root before removal
|
||||
cd /
|
||||
|
||||
# Remove PR-specific directories
|
||||
rm -rf /stirling/PR-${{ github.event.pull_request.number }}
|
||||
|
||||
# Remove the Docker image
|
||||
docker rmi --no-prune ${{ secrets.DOCKER_HUB_USERNAME }}/test:pr-${{ github.event.pull_request.number }} || true
|
||||
|
||||
echo "PERFORMED_CLEANUP"
|
||||
else
|
||||
echo "PR directory not found, nothing to clean up"
|
||||
echo "NO_CLEANUP_NEEDED"
|
||||
fi
|
||||
ENDSSH
|
||||
)
|
||||
|
||||
if [[ $CLEANUP_STATUS == *"PERFORMED_CLEANUP"* ]]; then
|
||||
echo "cleanup_performed=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "cleanup_performed=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Post cleanup notice to PR
|
||||
if: steps.cleanup.outputs.cleanup_performed == 'true'
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const { GITHUB_REPOSITORY } = process.env;
|
||||
const [repoOwner, repoName] = GITHUB_REPOSITORY.split('/');
|
||||
const prNumber = context.issue.number;
|
||||
|
||||
const commentBody = `## 🧹 Deployment Cleanup\n\n` +
|
||||
`The test deployment for this PR has been cleaned up.`;
|
||||
|
||||
await github.rest.issues.createComment({
|
||||
owner: repoOwner,
|
||||
repo: repoName,
|
||||
issue_number: prNumber,
|
||||
body: commentBody
|
||||
});
|
||||
119
.github/workflows/check_properties.yml
vendored
119
.github/workflows/check_properties.yml
vendored
@@ -6,18 +6,22 @@ on:
|
||||
paths:
|
||||
- "src/main/resources/messages_*.properties"
|
||||
push:
|
||||
branches: ["main"]
|
||||
paths:
|
||||
- "src/main/resources/messages_en_GB.properties"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
check-files:
|
||||
if: github.event_name == 'pull_request_target'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout main branch first
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: main
|
||||
path: main-branch
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Checkout PR branch
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
@@ -26,13 +30,6 @@ jobs:
|
||||
path: pr-branch
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Checkout main branch
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: main
|
||||
path: main-branch
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
@@ -49,56 +46,73 @@ jobs:
|
||||
echo "Fetching PR changed files..."
|
||||
cd pr-branch
|
||||
gh repo set-default ${{ github.repository }}
|
||||
gh pr view ${{ github.event.pull_request.number }} --json files -q ".files[].path" > ../changed_files.txt
|
||||
# Store files in a safe way, only allowing valid properties files
|
||||
echo "Getting list of changed files from PR..."
|
||||
gh pr view ${{ github.event.pull_request.number }} --json files -q ".files[].path" | grep -E '^src/main/resources/messages_[a-zA-Z_]+\.properties$' > ../changed_files.txt
|
||||
cd ..
|
||||
echo $(cat changed_files.txt)
|
||||
BRANCH_PATH="pr-branch"
|
||||
echo "BRANCH_PATH=${BRANCH_PATH}" >> $GITHUB_ENV
|
||||
CHANGED_FILES=$(cat changed_files.txt | tr '\n' ' ')
|
||||
echo "CHANGED_FILES=${CHANGED_FILES}" >> $GITHUB_ENV
|
||||
echo "Changed files: ${CHANGED_FILES}"
|
||||
echo "Branch: ${BRANCH_PATH}"
|
||||
|
||||
echo "Processing changed files..."
|
||||
mapfile -t CHANGED_FILES < changed_files.txt
|
||||
|
||||
CHANGED_FILES_STR="${CHANGED_FILES[*]}"
|
||||
echo "CHANGED_FILES=${CHANGED_FILES_STR}" >> $GITHUB_ENV
|
||||
|
||||
echo "Changed files: ${CHANGED_FILES_STR}"
|
||||
|
||||
- name: Determine reference file
|
||||
id: determine-file
|
||||
run: |
|
||||
echo "Determining reference file..."
|
||||
if echo "${{ env.CHANGED_FILES }}" | grep -q 'src/main/resources/messages_en_GB.properties'; then
|
||||
if grep -Fxq "src/main/resources/messages_en_GB.properties" changed_files.txt; then
|
||||
echo "Using PR branch reference file"
|
||||
echo "REFERENCE_FILE=pr-branch/src/main/resources/messages_en_GB.properties" >> $GITHUB_ENV
|
||||
else
|
||||
echo "Using main branch reference file"
|
||||
echo "REFERENCE_FILE=main-branch/src/main/resources/messages_en_GB.properties" >> $GITHUB_ENV
|
||||
fi
|
||||
echo "REFERENCE_FILE=${{ env.REFERENCE_FILE }}"
|
||||
|
||||
- name: Show REFERENCE_FILE
|
||||
run: echo "Reference file is set to ${{ env.REFERENCE_FILE }}"
|
||||
run: echo "Reference file is set to ${REFERENCE_FILE}"
|
||||
|
||||
- name: Run Python script to check files
|
||||
id: run-check
|
||||
run: |
|
||||
python main-branch/.github/scripts/check_language_properties.py --reference-file ${{ env.REFERENCE_FILE }} --branch ${{ env.BRANCH_PATH }} --files ${{ env.CHANGED_FILES }} > failure.txt || true
|
||||
echo "Running Python script to check files..."
|
||||
python main-branch/.github/scripts/check_language_properties.py \
|
||||
--actor ${{ github.event.pull_request.user.login }} \
|
||||
--reference-file "${REFERENCE_FILE}" \
|
||||
--branch pr-branch \
|
||||
--files "${CHANGED_FILES[@]}" > result.txt || true
|
||||
|
||||
- name: Capture output
|
||||
id: capture-output
|
||||
run: |
|
||||
if [ -f failure.txt ] && [ -s failure.txt ]; then
|
||||
echo "Test failed, capturing output..."
|
||||
ERROR_OUTPUT=$(cat failure.txt)
|
||||
echo "ERROR_OUTPUT<<EOF" >> $GITHUB_ENV
|
||||
echo "$ERROR_OUTPUT" >> $GITHUB_ENV
|
||||
if [ -f result.txt ] && [ -s result.txt ]; then
|
||||
echo "Test, capturing output..."
|
||||
SCRIPT_OUTPUT=$(cat result.txt)
|
||||
echo "SCRIPT_OUTPUT<<EOF" >> $GITHUB_ENV
|
||||
echo "$SCRIPT_OUTPUT" >> $GITHUB_ENV
|
||||
echo "EOF" >> $GITHUB_ENV
|
||||
echo $ERROR_OUTPUT
|
||||
echo "${SCRIPT_OUTPUT}"
|
||||
|
||||
# Set FAIL_JOB to true if SCRIPT_OUTPUT contains ❌
|
||||
if [[ "$SCRIPT_OUTPUT" == *"❌"* ]]; then
|
||||
echo "FAIL_JOB=true" >> $GITHUB_ENV
|
||||
else
|
||||
echo "FAIL_JOB=false" >> $GITHUB_ENV
|
||||
fi
|
||||
else
|
||||
echo "No errors found."
|
||||
echo "ERROR_OUTPUT=" >> $GITHUB_ENV
|
||||
echo "No update found."
|
||||
echo "SCRIPT_OUTPUT=" >> $GITHUB_ENV
|
||||
echo "FAIL_JOB=false" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Post comment on PR
|
||||
if: env.ERROR_OUTPUT != ''
|
||||
if: env.SCRIPT_OUTPUT != ''
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const { GITHUB_REPOSITORY, ERROR_OUTPUT } = process.env;
|
||||
const { GITHUB_REPOSITORY, SCRIPT_OUTPUT } = process.env;
|
||||
const [repoOwner, repoName] = GITHUB_REPOSITORY.split('/');
|
||||
const prNumber = context.issue.number;
|
||||
|
||||
@@ -120,7 +134,7 @@ jobs:
|
||||
owner: repoOwner,
|
||||
repo: repoName,
|
||||
comment_id: comment.id,
|
||||
body: `## 🚀 Translation Verification Summary\n\n\n${ERROR_OUTPUT}\n`
|
||||
body: `## 🚀 Translation Verification Summary\n\n\n${SCRIPT_OUTPUT}\n`
|
||||
});
|
||||
console.log("Updated existing comment.");
|
||||
} else if (!comment) {
|
||||
@@ -129,33 +143,24 @@ jobs:
|
||||
owner: repoOwner,
|
||||
repo: repoName,
|
||||
issue_number: prNumber,
|
||||
body: `## 🚀 Translation Verification Summary\n\n\n${ERROR_OUTPUT}\n`
|
||||
body: `## 🚀 Translation Verification Summary\n\n\n${SCRIPT_OUTPUT}\n`
|
||||
});
|
||||
console.log("Created new comment.");
|
||||
} else {
|
||||
console.log("Comment update attempt denied. Actor does not match.");
|
||||
}
|
||||
|
||||
# - name: Set up git config
|
||||
# run: |
|
||||
# git config --global user.name "github-actions[bot]"
|
||||
# git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||
|
||||
# - name: Add translation keys
|
||||
# run: |
|
||||
# cd ${{ env.BRANCH_PATH }}
|
||||
# git add src/main/resources/messages_*.properties
|
||||
# git diff --staged --quiet || echo "CHANGES_DETECTED=true" >> $GITHUB_ENV
|
||||
# git commit -m "Update translation files" || echo "No changes to commit"
|
||||
# - name: Push
|
||||
# if: env.CHANGES_DETECTED == 'true'
|
||||
# run: |
|
||||
# cd pr-branch
|
||||
# git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.event.pull_request.head.repo.full_name }}.git
|
||||
# git push origin ${{ github.head_ref }} || echo "Push failed: possibly no changes to push"
|
||||
- name: Fail job if errors found
|
||||
if: env.FAIL_JOB == 'true'
|
||||
run: |
|
||||
echo "Failing the job because errors were detected."
|
||||
exit 1
|
||||
|
||||
update-translations-main:
|
||||
if: github.event_name == 'push'
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -169,7 +174,10 @@ jobs:
|
||||
- name: Run Python script to check files
|
||||
id: run-check
|
||||
run: |
|
||||
python .github/scripts/check_language_properties.py --reference-file src/main/resources/messages_en_GB.properties --branch main
|
||||
echo "Running Python script to check files..."
|
||||
python .github/scripts/check_language_properties.py \
|
||||
--reference-file src/main/resources/messages_en_GB.properties \
|
||||
--branch main
|
||||
|
||||
- name: Set up git config
|
||||
run: |
|
||||
@@ -184,7 +192,7 @@ jobs:
|
||||
- name: Create Pull Request
|
||||
id: cpr
|
||||
if: env.CHANGES_DETECTED == 'true'
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
uses: peter-evans/create-pull-request@v7
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
commit-message: "Update translation files"
|
||||
@@ -193,6 +201,8 @@ jobs:
|
||||
signoff: true
|
||||
branch: update_translation_files
|
||||
title: "Update translation files"
|
||||
add-paths: |
|
||||
src/main/resources/messages_*.properties
|
||||
body: |
|
||||
Auto-generated by [create-pull-request][1]
|
||||
|
||||
@@ -200,3 +210,4 @@ jobs:
|
||||
labels: Translation
|
||||
draft: false
|
||||
delete-branch: true
|
||||
sign-commits: true
|
||||
|
||||
7
.github/workflows/push-docker.yml
vendored
7
.github/workflows/push-docker.yml
vendored
@@ -10,6 +10,7 @@ on:
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
jobs:
|
||||
push:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -66,6 +67,8 @@ jobs:
|
||||
images: |
|
||||
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
|
||||
ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf
|
||||
ghcr.io/${{ steps.repoowner.outputs.lowercase }}/stirling-pdf
|
||||
${{ secrets.DOCKER_HUB_ORG_USERNAME }}/stirling-pdf
|
||||
tags: |
|
||||
type=raw,value=${{ steps.versionNumber.outputs.versionNumber }},enable=${{ github.ref == 'refs/heads/master' }}
|
||||
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }}
|
||||
@@ -93,6 +96,8 @@ jobs:
|
||||
images: |
|
||||
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
|
||||
ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf
|
||||
ghcr.io/${{ steps.repoowner.outputs.lowercase }}/stirling-pdf
|
||||
${{ secrets.DOCKER_HUB_ORG_USERNAME }}/stirling-pdf
|
||||
tags: |
|
||||
type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}-ultra-lite,enable=${{ github.ref == 'refs/heads/master' }}
|
||||
type=raw,value=latest-ultra-lite,enable=${{ github.ref == 'refs/heads/master' }}
|
||||
@@ -119,6 +124,8 @@ jobs:
|
||||
images: |
|
||||
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
|
||||
ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf
|
||||
ghcr.io/${{ steps.repoowner.outputs.lowercase }}/stirling-pdf
|
||||
${{ secrets.DOCKER_HUB_ORG_USERNAME }}/stirling-pdf
|
||||
tags: |
|
||||
type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}-fat,enable=${{ github.ref == 'refs/heads/master' }}
|
||||
type=raw,value=latest-fat,enable=${{ github.ref == 'refs/heads/master' }}
|
||||
|
||||
38
.github/workflows/sync_files.yml
vendored
38
.github/workflows/sync_files.yml
vendored
@@ -14,44 +14,6 @@ permissions:
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
sync-versions:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.x"
|
||||
- name: Install dependencies
|
||||
run: pip install pyyaml
|
||||
- name: Sync versions
|
||||
run: python .github/scripts/gradle_to_chart.py
|
||||
- name: Set up git config
|
||||
run: |
|
||||
git config --global user.name "github-actions[bot]"
|
||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||
- name: Run git add
|
||||
run: |
|
||||
git add .
|
||||
git diff --staged --quiet || git commit -m ":floppy_disk: Sync Versions
|
||||
> Made via sync_files.yml" || echo "no changes"
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
commit-message: Update files
|
||||
committer: GitHub Action <action@github.com>
|
||||
author: GitHub Action <action@github.com>
|
||||
signoff: true
|
||||
branch: sync_version
|
||||
title: ":floppy_disk: Update Version"
|
||||
body: |
|
||||
Auto-generated by [create-pull-request][1]
|
||||
|
||||
[1]: https://github.com/peter-evans/create-pull-request
|
||||
draft: false
|
||||
delete-branch: true
|
||||
labels: github-actions
|
||||
sync-readme:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# New Database Backup and Import Functionality
|
||||
|
||||
**Full activation will take place on approximately January 5th, 2025!**
|
||||
> [!IMPORTANT]
|
||||
> **Full activation will take place on approximately January 5th, 2025!**
|
||||
|
||||
Why is the waiting time six months?
|
||||
|
||||
|
||||
@@ -7,10 +7,11 @@ Stirling-PDF is a robust, locally hosted web-based PDF manipulation tool. This g
|
||||
## 2. Project Overview
|
||||
|
||||
Stirling-PDF is built using:
|
||||
|
||||
- Spring Boot + Thymeleaf
|
||||
- PDFBox
|
||||
- LibreOffice
|
||||
- OcrMyPdf
|
||||
- qpdf
|
||||
- HTML, CSS, JavaScript
|
||||
- Docker
|
||||
- PDF.js
|
||||
@@ -20,14 +21,17 @@ Stirling-PDF is built using:
|
||||
## 3. Development Environment Setup
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Docker
|
||||
- Git
|
||||
- Java JDK 17 or later
|
||||
- Gradle 7.0 or later (Included within repo)
|
||||
|
||||
### Setup Steps
|
||||
|
||||
1. Clone the repository:
|
||||
```
|
||||
|
||||
```bash
|
||||
git clone https://github.com/Stirling-Tools/Stirling-PDF.git
|
||||
cd Stirling-PDF
|
||||
```
|
||||
@@ -43,10 +47,9 @@ Visit the [Lombok website](https://projectlombok.org/setup/) for installation in
|
||||
5. Add environment variable
|
||||
For local testing you should generally be testing the full 'Security' version of Stirling-PDF to do this you must add the environment flag DOCKER_ENABLE_SECURITY=true to your system and/or IDE build/run step
|
||||
|
||||
|
||||
## 4. Project Structure
|
||||
|
||||
```
|
||||
```bash
|
||||
Stirling-PDF/
|
||||
├── .github/ # GitHub-specific files (workflows, issue templates)
|
||||
├── configs/ # Configuration files used by stirling at runtime (generated at runtime)
|
||||
@@ -92,6 +95,7 @@ Stirling-PDF/
|
||||
## 5. Docker-based Development
|
||||
|
||||
Stirling-PDF offers several Docker versions:
|
||||
|
||||
- Full: All features included
|
||||
- Ultra-Lite: Basic PDF operations only
|
||||
- Fat: Includes additional libraries and fonts predownloaded
|
||||
@@ -110,7 +114,7 @@ These files provide pre-configured setups for different scenarios. For example,
|
||||
services:
|
||||
stirling-pdf:
|
||||
container_name: Stirling-PDF-Security
|
||||
image: frooodle/s-pdf:latest
|
||||
image: stirlingtools/stirling-pdf:latest
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
@@ -153,11 +157,13 @@ docker-compose -f exampleYmlFiles/docker-compose-latest-security.yml up
|
||||
Stirling-PDF uses different Docker images for various configurations. The build process is controlled by environment variables and uses specific Dockerfile variants. Here's how to build the Docker images:
|
||||
|
||||
1. Set the security environment variable:
|
||||
|
||||
```bash
|
||||
export DOCKER_ENABLE_SECURITY=false # or true for security-enabled builds
|
||||
```
|
||||
|
||||
2. Build the project with Gradle:
|
||||
|
||||
```bash
|
||||
./gradlew clean build
|
||||
```
|
||||
@@ -165,25 +171,26 @@ Stirling-PDF uses different Docker images for various configurations. The build
|
||||
3. Build the Docker images:
|
||||
|
||||
For the latest version:
|
||||
|
||||
```bash
|
||||
docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t frooodle/s-pdf:latest -f ./Dockerfile .
|
||||
docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t stirlingtools/stirling-pdf:latest -f ./Dockerfile .
|
||||
```
|
||||
|
||||
For the ultra-lite version:
|
||||
|
||||
```bash
|
||||
docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t frooodle/s-pdf:latest-ultra-lite -f ./Dockerfile-ultra-lite .
|
||||
docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t stirlingtools/stirling-pdf:latest-ultra-lite -f ./Dockerfile-ultra-lite .
|
||||
```
|
||||
|
||||
For the fat version (with security enabled):
|
||||
|
||||
```bash
|
||||
export DOCKER_ENABLE_SECURITY=true
|
||||
docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t frooodle/s-pdf:latest-fat -f ./Dockerfile-fat .
|
||||
docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t stirlingtools/stirling-pdf:latest-fat -f ./Dockerfile-fat .
|
||||
```
|
||||
|
||||
Note: The `--no-cache` and `--pull` flags ensure that the build process uses the latest base images and doesn't use cached layers, which is useful for testing and ensuring reproducible builds. however to improve build times these can often be removed depending on your usecase
|
||||
|
||||
|
||||
|
||||
## 6. Testing
|
||||
|
||||
### Comprehensive Testing Script
|
||||
@@ -197,6 +204,7 @@ To run the test script:
|
||||
```
|
||||
|
||||
This script performs the following actions:
|
||||
|
||||
1. Builds all Docker images (full, ultra-lite, fat)
|
||||
2. Runs each version to ensure it starts correctly
|
||||
3. Executes Cucumber tests against main version and ensures feature compatibility, in the event these tests fail your PR will not be merged
|
||||
@@ -209,7 +217,6 @@ Note: The `test.sh` script will run automatically when you raise a PR. However,
|
||||
|
||||
2. Access the application at `http://localhost:8080` and manually test all features developed.
|
||||
|
||||
|
||||
### Local Testing (Java and UI Components)
|
||||
|
||||
For quick iterations and development of Java backend, JavaScript, and UI components, you can run and test Stirling-PDF locally without Docker. This approach allows you to work on and verify changes to:
|
||||
@@ -223,7 +230,8 @@ For quick iterations and development of Java backend, JavaScript, and UI compone
|
||||
To run Stirling-PDF locally:
|
||||
|
||||
1. Compile and run the project using built in IDE methods or by running:
|
||||
```
|
||||
|
||||
```bash
|
||||
./gradlew bootRun
|
||||
```
|
||||
|
||||
@@ -234,11 +242,11 @@ To run Stirling-PDF locally:
|
||||
4. For API changes, use tools like Postman or curl to test endpoints directly.
|
||||
|
||||
Important notes:
|
||||
- Local testing doesn't include features that depend on external tools like OCRmyPDF, LibreOffice, or Python scripts.
|
||||
|
||||
- Local testing doesn't include features that depend on external tools like qpdf, LibreOffice, or Python scripts.
|
||||
- There are currently no automated unit tests. All testing is done manually through the UI or API calls. (You are welcome to add JUnits!)
|
||||
- Always verify your changes in the full Docker environment before submitting pull requests, as some integrations and features will only work in the complete setup.
|
||||
|
||||
|
||||
## 7. Contributing
|
||||
|
||||
1. Fork the repository on GitHub.
|
||||
@@ -246,14 +254,17 @@ Important notes:
|
||||
3. Make your changes and commit them with clear, descriptive messages and ensure any documentation is updated related to your changes.
|
||||
4. Test your changes thoroughly in the Docker environment.
|
||||
5. Run the `test.sh` script to ensure all versions build correctly and pass the Cucumber tests:
|
||||
|
||||
```bash
|
||||
./test.sh
|
||||
```
|
||||
|
||||
6. Push your changes to your fork.
|
||||
7. Submit a pull request to the main repository.
|
||||
7. Submit a pull request to the main repository.
|
||||
8. See additional [contributing guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
|
||||
|
||||
When you raise a PR:
|
||||
|
||||
- The `test.sh` script will run automatically against your PR.
|
||||
- The PR checks will verify versioning and dependency updates.
|
||||
- Documentation will be automatically updated for dependency changes.
|
||||
@@ -268,6 +279,7 @@ API documentation is available at `/swagger-ui/index.html` when running the appl
|
||||
## 9. Customization
|
||||
|
||||
Stirling-PDF can be customized through environment variables or a `settings.yml` file. Key customization options include:
|
||||
|
||||
- Application name and branding
|
||||
- Security settings
|
||||
- UI customization
|
||||
@@ -276,7 +288,8 @@ Stirling-PDF can be customized through environment variables or a `settings.yml`
|
||||
When using Docker, pass environment variables using the `-e` flag or in your `docker-compose.yml` file.
|
||||
|
||||
Example:
|
||||
```
|
||||
|
||||
```bash
|
||||
docker run -p 8080:8080 -e APP_NAME="My PDF Tool" stirling-pdf:full
|
||||
```
|
||||
|
||||
@@ -293,16 +306,14 @@ For managing language translations that affect multiple files, Stirling-PDF prov
|
||||
This script helps you make consistent replacements across language files.
|
||||
|
||||
When contributing translations:
|
||||
|
||||
1. Use the helper script for multi-file changes.
|
||||
2. Ensure all language files are updated consistently.
|
||||
3. The PR checks will verify consistency in language file updates.
|
||||
|
||||
Remember to test your changes thoroughly to ensure they don't break any existing functionality.
|
||||
|
||||
|
||||
|
||||
|
||||
# Code examples
|
||||
## Code examples
|
||||
|
||||
### Overview of Thymeleaf
|
||||
|
||||
@@ -311,22 +322,28 @@ Thymeleaf is a server-side Java HTML template engine. It is used in Stirling-PD
|
||||
### Thymeleaf overview
|
||||
|
||||
In Stirling-PDF, Thymeleaf is used to create HTML templates that are rendered on the server side. These templates are located in the `src/main/resources/templates` directory. Thymeleaf templates use a combination of HTML and special Thymeleaf attributes to dynamically generate content.
|
||||
Some examples of this are
|
||||
|
||||
Some examples of this are:
|
||||
|
||||
```html
|
||||
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
||||
or
|
||||
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
|
||||
```
|
||||
|
||||
Where it uses the th:block, th: indicating its a special thymeleaf element to be used serverside in generating the html, and block being the actual element type.
|
||||
In this case we are inserting the ``navbar`` entry within the ``fragments/navbar.html`` fragment into the ``th:block`` element.
|
||||
|
||||
They can be more complex such as
|
||||
They can be more complex such as:
|
||||
|
||||
```html
|
||||
<th:block th:insert="~{fragments/common :: head(title=#{pageExtracter.title}, header=#{pageExtracter.header})}"></th:block>
|
||||
```
|
||||
|
||||
Which is the same as above but passes the parameters title and header into the fragment common.html to be used in its HTML generation
|
||||
|
||||
Thymeleaf can also be used to loop through objects or pass things from java side into html side.
|
||||
|
||||
```java
|
||||
@GetMapping
|
||||
public String newFeaturePage(Model model) {
|
||||
@@ -334,7 +351,9 @@ Thymeleaf can also be used to loop through objects or pass things from java side
|
||||
return "new-feature";
|
||||
}
|
||||
```
|
||||
|
||||
in above example if exampleData is a list of plain java objects of class Person and within it you had id, name, age etc. You can reference it like so
|
||||
|
||||
```html
|
||||
<tbody>
|
||||
<!-- Use th:each to iterate over the list -->
|
||||
@@ -346,6 +365,7 @@ in above example if exampleData is a list of plain java objects of class Person
|
||||
</tr>
|
||||
</tbody>
|
||||
```
|
||||
|
||||
This would generate n entries of tr for each person in exampleData
|
||||
|
||||
### Adding a New Feature to the Backend (API)
|
||||
@@ -397,34 +417,35 @@ This would generate n entries of tr for each person in exampleData
|
||||
```
|
||||
|
||||
2b. **Integrate the Service with the Controller:**
|
||||
- Autowire the service class in the controller and use it to handle the API request.
|
||||
|
||||
```java
|
||||
package stirling.software.SPDF.controller.api;
|
||||
- Autowire the service class in the controller and use it to handle the API request.
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import stirling.software.SPDF.service.NewFeatureService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
```java
|
||||
package stirling.software.SPDF.controller.api;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/new-feature")
|
||||
@Tag(name = "General", description = "General APIs")
|
||||
public class NewFeatureController {
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import stirling.software.SPDF.service.NewFeatureService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
@Autowired
|
||||
private NewFeatureService newFeatureService;
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/new-feature")
|
||||
@Tag(name = "General", description = "General APIs")
|
||||
public class NewFeatureController {
|
||||
|
||||
@GetMapping
|
||||
@Operation(summary = "New Feature", description = "This is a new feature endpoint.")
|
||||
public String newFeature() {
|
||||
return newFeatureService.getNewFeatureData();
|
||||
}
|
||||
}
|
||||
```
|
||||
@Autowired
|
||||
private NewFeatureService newFeatureService;
|
||||
|
||||
@GetMapping
|
||||
@Operation(summary = "New Feature", description = "This is a new feature endpoint.")
|
||||
public String newFeature() {
|
||||
return newFeatureService.getNewFeatureData();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Adding a New Feature to the Frontend (UI)
|
||||
|
||||
@@ -511,7 +532,6 @@ This would generate n entries of tr for each person in exampleData
|
||||
</li>
|
||||
```
|
||||
|
||||
|
||||
## Adding New Translations to Existing Language Files in Stirling-PDF
|
||||
|
||||
When adding a new feature or modifying existing ones in Stirling-PDF, you'll need to add new translation entries to the existing language files. Here's a step-by-step guide:
|
||||
@@ -522,13 +542,13 @@ Find the existing `messages.properties` files in the `src/main/resources` direct
|
||||
|
||||
- `messages.properties` (default, usually English)
|
||||
- `messages_en_GB.properties`
|
||||
- `messages_fr.properties`
|
||||
- `messages_de.properties`
|
||||
- `messages_fr_FR.properties`
|
||||
- `messages_de_DE.properties`
|
||||
- etc.
|
||||
|
||||
### 2. Add New Translation Entries
|
||||
|
||||
Open each of these files and add your new translation entries. For example, if you're adding a new feature called "PDF Splitter",
|
||||
Open each of these files and add your new translation entries. For example, if you're adding a new feature called "PDF Splitter",
|
||||
Use descriptive, hierarchical keys (e.g., `feature.element.description`)
|
||||
you might add:
|
||||
|
||||
@@ -552,6 +572,4 @@ In your Thymeleaf templates, use the `#{key}` syntax to reference the new transl
|
||||
<button th:text="#{pdfSplitter.button.split}">Split PDF</button>
|
||||
```
|
||||
|
||||
|
||||
|
||||
Remember, never hard-code text in your templates or Java code. Always use translation keys to ensure proper localization.
|
||||
|
||||
@@ -30,6 +30,7 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et
|
||||
tini \
|
||||
bash \
|
||||
curl \
|
||||
qpdf \
|
||||
shadow \
|
||||
su-exec \
|
||||
openssl \
|
||||
@@ -40,7 +41,6 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et
|
||||
# pdftohtml
|
||||
poppler-utils \
|
||||
# OCR MY PDF (unpaper for descew and other advanced features)
|
||||
ocrmypdf \
|
||||
tesseract-ocr-data-eng \
|
||||
# CV
|
||||
py3-opencv \
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Build the application
|
||||
FROM gradle:8.7-jdk17 AS build
|
||||
FROM gradle:8.11-jdk17 AS build
|
||||
|
||||
# Set the working directory
|
||||
WORKDIR /app
|
||||
@@ -55,7 +55,7 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et
|
||||
# pdftohtml
|
||||
poppler-utils \
|
||||
# OCR MY PDF (unpaper for descew and other advanced featues)
|
||||
ocrmypdf \
|
||||
qpdf \
|
||||
tesseract-ocr-data-eng \
|
||||
font-terminus font-dejavu font-noto font-noto-cjk font-awesome font-noto-extra \
|
||||
# CV
|
||||
|
||||
@@ -1,47 +1,46 @@
|
||||
| Operation | PageOps | Convert | Security | Other | CLI | Python | OpenCV | LibreOffice | OCRmyPDF | Java | Javascript |
|
||||
| ------------------- | ------- | ------- | -------- | ----- | --- | ------ | ------ | ----------- | -------- | ---- | ---------- |
|
||||
| adjust-contrast | ✔️ | | | | | | | | | | ✔️ |
|
||||
| auto-split-pdf | ✔️ | | | | | | | | | ✔️ | |
|
||||
| crop | ✔️ | | | | | | | | | ✔️ | |
|
||||
| extract-page | ✔️ | | | | | | | | | ✔️ | |
|
||||
| merge-pdfs | ✔️ | | | | | | | | | ✔️ | |
|
||||
| multi-page-layout | ✔️ | | | | | | | | | ✔️ | |
|
||||
| pdf-organizer | ✔️ | | | | | | | | | ✔️ | ✔️ |
|
||||
| pdf-to-single-page | ✔️ | | | | | | | | | ✔️ | |
|
||||
| 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-markdown | | ✔️ | | | | | | | | ✔️ | |
|
||||
| pdf-to-presentation | | ✔️ | | | ✔️ | | | ✔️ | | | |
|
||||
| pdf-to-text | | ✔️ | | | ✔️ | | | ✔️ | | | |
|
||||
| pdf-to-word | | ✔️ | | | ✔️ | | | ✔️ | | | |
|
||||
| pdf-to-xml | | ✔️ | | | ✔️ | | | ✔️ | | | |
|
||||
| xlsx-to-pdf | | ✔️ | | | ✔️ | | | ✔️ | | | |
|
||||
| add-password | | | ✔️ | | | | | | | ✔️ | |
|
||||
| add-watermark | | | ✔️ | | | | | | | ✔️ | |
|
||||
| cert-sign | | | ✔️ | | | | | | | ✔️ | |
|
||||
| remove-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 | | | | ✔️ | | | | | | | ✔️ |
|
||||
| get-info-on-pdf | | | | ✔️ | | | | | | ✔️ | |
|
||||
| ocr-pdf | | | | ✔️ | ✔️ | | | | ✔️ | | |
|
||||
| remove-blanks | | | | ✔️ | ✔️ | ✔️ | ✔️ | | | | |
|
||||
| repair | | | | ✔️ | ✔️ | | | ✔️ | | | |
|
||||
| show-javascript | | | | ✔️ | | | | | | | ✔️ |
|
||||
| sign | | | | ✔️ | | | | | | | ✔️ |
|
||||
| Operation | PageOps | Convert | Security | Other | CLI | Python | OpenCV | LibreOffice | qpdf | Java | Javascript | Unoconv | tesseract |
|
||||
| ------------------- | ------- | ------- | -------- | ----- | --- | ------ | ------ | ----------- | -------- | ---- | ---------- | ------- | ----------- |
|
||||
| adjust-contrast | ✔️ | | | | | | | | | | ✔️ | | |
|
||||
| auto-split-pdf | ✔️ | | | | | | | | | ✔️ | | | |
|
||||
| crop | ✔️ | | | | | | | | | ✔️ | | | |
|
||||
| extract-page | ✔️ | | | | | | | | | ✔️ | | | |
|
||||
| merge-pdfs | ✔️ | | | | | | | | | ✔️ | | | |
|
||||
| multi-page-layout | ✔️ | | | | | | | | | ✔️ | | | |
|
||||
| pdf-organizer | ✔️ | | | | | | | | | ✔️ | ✔️ | | |
|
||||
| pdf-to-single-page | ✔️ | | | | | | | | | ✔️ | | | |
|
||||
| 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-markdown | | ✔️ | | | | | | | | ✔️ | | | |
|
||||
| pdf-to-presentation | | ✔️ | | | ✔️ | | | ✔️ | | | | | |
|
||||
| pdf-to-text | | ✔️ | | | ✔️ | | | ✔️ | | | | | |
|
||||
| pdf-to-word | | ✔️ | | | ✔️ | | | ✔️ | | | | | |
|
||||
| pdf-to-xml | | ✔️ | | | ✔️ | | | ✔️ | | | | | |
|
||||
| add-password | | | ✔️ | | | | | | | ✔️ | | | |
|
||||
| add-watermark | | | ✔️ | | | | | | | ✔️ | | | |
|
||||
| cert-sign | | | ✔️ | | | | | | | ✔️ | | | |
|
||||
| remove-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 | | | | ✔️ | | | | | | | ✔️ | | |
|
||||
| get-info-on-pdf | | | | ✔️ | | | | | | ✔️ | | | |
|
||||
| ocr-pdf | | | | ✔️ | ✔️ | | | | | | | | ✔ |
|
||||
| remove-blanks | | | | ✔️ | ✔️ | ✔️ | ✔️ | | | | | | |
|
||||
| repair | | | | ✔️ | ✔️ | | | ✔️ | ✔ | | | | |
|
||||
| show-javascript | | | | ✔️ | | | | | | | ✔️ | | |
|
||||
| sign | | | | ✔️ | | | | | | | ✔️ | | |
|
||||
|
||||
@@ -1,33 +1,41 @@
|
||||
## User Guide for Local Directory Scanning and File Processing
|
||||
|
||||
### Setting Up Watched Folders:
|
||||
### Setting Up Watched Folders
|
||||
|
||||
- Create a folder where you want your files to be monitored. This is your 'watched folder'.
|
||||
- The default directory for this is `./pipeline/watchedFolders/`
|
||||
- Place any directories you want to be scanned into this folder, this folder should contain multiple folders each for their own tasks and pipelines.
|
||||
- The default directory for this is `./pipeline/watchedFolders/`.
|
||||
- Place any directories you want to be scanned into this folder. This folder should contain multiple folders, each for their own tasks and pipelines.
|
||||
|
||||
### Configuring Processing with JSON Files:
|
||||
- In each directory you want processed (e.g `./pipeline/watchedFolders/officePrinter`), include a JSON configuration file.
|
||||
- This JSON file should specify how you want the files in the directory to be handled (e.g., what operations to perform on them) which can be made, configured and downloaded from Stirling-PDF Pipeline interface.r
|
||||
### Configuring Processing with JSON Files
|
||||
|
||||
- In each directory you want processed (e.g., `./pipeline/watchedFolders/officePrinter`), include a JSON configuration file.
|
||||
- This JSON file should specify how you want the files in the directory to be handled (e.g., what operations to perform on them). This can be made, configured, and downloaded from the Stirling-PDF Pipeline interface.
|
||||
|
||||
### Automatic Scanning and Processing
|
||||
|
||||
### Automatic Scanning and Processing:
|
||||
- The system automatically checks the watched folder every minute for new directories and files to process.
|
||||
- When a directory with a valid JSON configuration file is found, it begins processing the files inside as per the configuration.
|
||||
- When a directory with a valid JSON configuration file is found, it begins processing the files inside according to the configuration.
|
||||
|
||||
### Processing Steps
|
||||
|
||||
### Processing Steps:
|
||||
- Files in each directory are processed according to the instructions in the JSON file.
|
||||
- This might involve file conversions, data filtering, renaming files, etc. If the output of a step is a zip, this zip will be automatically unzipped as it passes to next process.
|
||||
- This might involve file conversions, data filtering, renaming files, etc. If the output of a step is a zip, this zip will be automatically unzipped as it passes to the next process.
|
||||
|
||||
### Results and Output
|
||||
|
||||
### Results and Output:
|
||||
- After processing, the results are saved in a specified output location. This could be a different folder or location as defined in the JSON file or the default location `./pipeline/finishedFolders/`.
|
||||
- Each processed file is named and organized according to the rules set in the JSON configuration.
|
||||
|
||||
### Completion and Cleanup:
|
||||
### Completion and Cleanup
|
||||
|
||||
- Once processing is complete, the original files in the watched folder's directory are removed.
|
||||
- You can find the processed files in the designated output location.
|
||||
|
||||
### Error Handling:
|
||||
### Error Handling
|
||||
|
||||
- If there's an error during processing, the system will not delete the original files, allowing you to check and retry if necessary.
|
||||
|
||||
### User Interaction:
|
||||
### User Interaction
|
||||
|
||||
- As a user, your main tasks are to set up the watched folders, place directories with files for processing, and create the corresponding JSON configuration files.
|
||||
- The system handles the rest, including scanning, processing, and outputting results.
|
||||
|
||||
@@ -1,43 +1,47 @@
|
||||
<p align="center"><img src="https://raw.githubusercontent.com/Stirling-Tools/Stirling-PDF/main/docs/stirling.png" width="80" ><br><h1 align="center">Stirling-PDF</h1>
|
||||
<p align="center">
|
||||
<img src="https://raw.githubusercontent.com/Stirling-Tools/Stirling-PDF/main/docs/stirling.png" width="80">
|
||||
<br>
|
||||
<h1 align="center">Stirling-PDF</h1>
|
||||
</p>
|
||||
|
||||
# How to add new languages to Stirling-PDF
|
||||
|
||||
Fork Stirling-PDF and make a new branch out of Main
|
||||
Fork Stirling-PDF and create a new branch out of `main`.
|
||||
|
||||
Then add reference to the language in the navbar by adding a new language entry to the dropdown
|
||||
Then add a reference to the language in the navbar by adding a new language entry to the dropdown:
|
||||
|
||||
https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/templates/fragments/languages.html
|
||||
and add a flag svg file to
|
||||
https://github.com/Stirling-Tools/Stirling-PDF/tree/main/src/main/resources/static/images/flags
|
||||
Any SVG flags are fine, i got most of mine from [here](https://flagicons.lipis.dev/)
|
||||
If your language isn't represented by a flag just find whichever closely matches it, such as for Arabic i chose Saudi Arabia
|
||||
- Edit the file: [languages.html](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/templates/fragments/languages.html)
|
||||
- Add a flag SVG file to: [flags directory](https://github.com/Stirling-Tools/Stirling-PDF/tree/main/src/main/resources/static/images/flags)
|
||||
|
||||
For example to add Polish you would add
|
||||
Any SVG flags are fine; most of the current ones were sourced from [here](https://flagicons.lipis.dev/). If your language isn't represented by a flag, choose a similar one, such as Saudi Arabia's flag for Arabic.
|
||||
|
||||
For example, to add Polish, you would add:
|
||||
|
||||
```html
|
||||
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="pl_PL">
|
||||
<a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="pl_PL">
|
||||
<img src="images/flags/pl.svg" alt="icon" width="20" height="15"> Polski
|
||||
</a>
|
||||
```
|
||||
|
||||
The data-language-code is the code used to reference the file in the next step.
|
||||
The `data-bs-language-code` is the code used to reference the file in the next step.
|
||||
|
||||
Start by copying the existing english property file
|
||||
### Add Language Property File
|
||||
|
||||
[https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties)
|
||||
Start by copying the existing English property file:
|
||||
|
||||
Copy and rename it to messages_{your data-language-code here}.properties, in the polish example you would set the name to messages_pl_PL.properties
|
||||
- [messages_en_GB.properties](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties)
|
||||
|
||||
Then simply translate all property entries within that file and make a PR into main for others to use!
|
||||
Copy and rename it to `messages_{your data-bs-language-code here}.properties`. In the Polish example, you would set the name to `messages_pl_PL.properties`.
|
||||
|
||||
If you do not have a java IDE i am happy to verify the changes worked once you raise PR (but won't be able to verify the translations themselves)
|
||||
Then simply translate all property entries within that file and make a Pull Request (PR) into `main` for others to use!
|
||||
|
||||
If you do not have a Java IDE, I am happy to verify that the changes work once you raise the PR (but I won't be able to verify the translations themselves).
|
||||
|
||||
## Handling Untranslatable Strings
|
||||
|
||||
Sometimes, certain strings in the properties file may not require translation because they are the same in the target language or are universal (like names of protocols, certain terminologies, etc.). To ensure accurate statistics for language progress, these strings should be added to the `ignore_translation.toml` file located in the `scripts` directory. This will exclude them from the translation progress calculations.
|
||||
|
||||
For example, if the English string error=Error does not need translation in Polish, add it to the ignore_translation.toml under the Polish section:
|
||||
For example, if the English string `error=Error` does not need translation in Polish, add it to the `ignore_translation.toml` under the Polish section:
|
||||
|
||||
```toml
|
||||
[pl_PL]
|
||||
@@ -49,7 +53,9 @@ ignore = [
|
||||
|
||||
## Add New Translation Tags
|
||||
|
||||
- **Important**: If you add any new translation tags, they must first be added to the `messages_en_GB.properties` file. This ensures consistency across all language files.
|
||||
> [!IMPORTANT]
|
||||
> If you add any new translation tags, they must first be added to the `messages_en_GB.properties` file. This ensures consistency across all language files.
|
||||
|
||||
- New translation tags **must be added** to the `messages_en_GB.properties` file to maintain a reference for other languages.
|
||||
- After adding the new tags to `messages_en_GB.properties`, add and translate them in the respective language file (e.g., `messages_pl_PL.properties`).
|
||||
|
||||
|
||||
@@ -3,34 +3,36 @@
|
||||
This document provides instructions on how to add additional language packs for the OCR tab in Stirling-PDF, both inside and outside of Docker.
|
||||
|
||||
## My OCR used to work and now doesn't!
|
||||
The paths have changed for the tessadata locations on new docker images, please use ``/usr/share/tessdata`` (Others should still work for backwards compatibility but might not)
|
||||
|
||||
The paths have changed for the tessdata locations on new Docker images. Please use `/usr/share/tessdata` (Others should still work for backward compatibility but might not).
|
||||
|
||||
## How does the OCR Work
|
||||
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!
|
||||
|
||||
Stirling-PDF uses Tesseract for its text recognition. All credit goes to them for this awesome work!
|
||||
|
||||
## Language Packs
|
||||
|
||||
Tesseract OCR supports a variety of languages. You can find additional language packs in the Tesseract GitHub repositories:
|
||||
|
||||
- [tessdata_fast](https://github.com/tesseract-ocr/tessdata_fast): These language packs are smaller and faster to load, but may provide lower recognition accuracy.
|
||||
- [tessdata_fast](https://github.com/tesseract-ocr/tessdata_fast): These language packs are smaller and faster to load but may provide lower recognition accuracy.
|
||||
- [tessdata](https://github.com/tesseract-ocr/tessdata): These language packs are larger and provide better recognition accuracy, but may take longer to load.
|
||||
|
||||
Depending on your requirements, you can choose the appropriate language pack for your use case. By default Stirling-PDF uses the tessdata_fast eng but this can be replaced.
|
||||
Depending on your requirements, you can choose the appropriate language pack for your use case. By default, Stirling-PDF uses `tessdata_fast` for English, but this can be replaced.
|
||||
|
||||
### Installing Language Packs
|
||||
|
||||
1. Download the desired language pack(s) by selecting the `.traineddata` file(s) for the language(s) you need.
|
||||
2. Place the `.traineddata` files in the Tesseract tessdata directory: `/usr/share/tessdata`
|
||||
|
||||
# DO NOT REMOVE EXISTING ENG.TRAINEDDATA, IT'S REQUIRED.
|
||||
**DO NOT REMOVE EXISTING `eng.traineddata`, IT'S REQUIRED.**
|
||||
|
||||
#### Docker
|
||||
### Docker Setup
|
||||
|
||||
If you are using Docker, you need to expose the Tesseract tessdata directory as a volume in order to use the additional language packs.
|
||||
#### Docker Compose
|
||||
Modify your `docker-compose.yml` file to include the following volume configuration:
|
||||
|
||||
#### Docker Compose
|
||||
|
||||
Modify your `docker-compose.yml` file to include the following volume configuration:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
@@ -40,18 +42,17 @@ services:
|
||||
- /location/of/trainingData:/usr/share/tessdata
|
||||
```
|
||||
|
||||
#### Docker Run
|
||||
|
||||
Add the following to your existing Docker run command:
|
||||
|
||||
#### Docker run
|
||||
Add the following to your existing docker run command
|
||||
```bash
|
||||
-v /location/of/trainingData:/usr/share/tessdata
|
||||
```
|
||||
|
||||
#### Non-Docker
|
||||
If you are not using Docker, you need to install the OCR components, including the ocrmypdf app.
|
||||
You can see [OCRmyPDF install guide](https://ocrmypdf.readthedocs.io/en/latest/installation.html)
|
||||
### Non-Docker Setup
|
||||
|
||||
Debian based systems, install languages with this command:
|
||||
For Debian-based systems, install languages with this command:
|
||||
|
||||
```bash
|
||||
sudo apt update &&\
|
||||
@@ -65,7 +66,7 @@ apt search tesseract-ocr-
|
||||
dpkg-query -W tesseract-ocr- | sed 's/tesseract-ocr-//g'
|
||||
```
|
||||
|
||||
Fedora:
|
||||
For Fedora:
|
||||
|
||||
```bash
|
||||
# All languages
|
||||
@@ -77,3 +78,22 @@ dnf search -C tesseract-langpack-
|
||||
# View installed languages:
|
||||
rpm -qa | grep tesseract-langpack | sed 's/tesseract-langpack-//g'
|
||||
```
|
||||
|
||||
For Windows:
|
||||
|
||||
You must ensure tesseract is installed
|
||||
|
||||
Additional languages must be downloaded manually:
|
||||
Download desired .traineddata files from tessdata or tessdata_fast
|
||||
Place them in the tessdata folder within your Tesseract installation directory
|
||||
(e.g., C:\Program Files\Tesseract-OCR\tessdata)
|
||||
|
||||
Verify installation:
|
||||
``tesseract --list-langs``
|
||||
|
||||
You must then edit your ``/configs/settings.yml`` and change the system.tessdataDir to match the directory containing lang files
|
||||
```
|
||||
system:
|
||||
tessdataDir: C:/Program Files/Tesseract-OCR/tessdata # path to the directory containing the Tessdata files. This setting is relevant for Windows systems. For Windows users, this path should be adjusted to point to the appropriate directory where the Tessdata files are stored.
|
||||
```
|
||||
|
||||
|
||||
45
Jenkinsfile
vendored
45
Jenkinsfile
vendored
@@ -1,45 +0,0 @@
|
||||
pipeline {
|
||||
agent any
|
||||
stages {
|
||||
stage('Build') {
|
||||
steps {
|
||||
sh 'chmod 755 gradlew'
|
||||
sh './gradlew build'
|
||||
}
|
||||
}
|
||||
stage('Docker Build') {
|
||||
steps {
|
||||
script {
|
||||
def appVersion = sh(returnStdout: true, script: './gradlew printVersion -q').trim()
|
||||
def image = "frooodle/s-pdf:$appVersion"
|
||||
sh "docker build -t $image ."
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Docker Push') {
|
||||
steps {
|
||||
script {
|
||||
def appVersion = sh(returnStdout: true, script: './gradlew printVersion -q').trim()
|
||||
def image = "frooodle/s-pdf:$appVersion"
|
||||
withCredentials([string(credentialsId: 'docker_hub_access_token', variable: 'DOCKER_HUB_ACCESS_TOKEN')]) {
|
||||
sh "docker login --username frooodle --password $DOCKER_HUB_ACCESS_TOKEN"
|
||||
sh "docker push $image"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Helm Push') {
|
||||
steps {
|
||||
script {
|
||||
//TODO: Read chartVersion from Chart.yaml
|
||||
def chartVersion = '1.0.0'
|
||||
withCredentials([string(credentialsId: 'docker_hub_access_token', variable: 'DOCKER_HUB_ACCESS_TOKEN')]) {
|
||||
sh "docker login --username frooodle --password $DOCKER_HUB_ACCESS_TOKEN"
|
||||
sh "helm package chart/stirling-pdf"
|
||||
sh "helm push stirling-pdf-chart-1.0.0.tgz oci://registry-1.docker.io/frooodle"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
154
LocalRunGuide.md
154
LocalRunGuide.md
@@ -1,48 +1,35 @@
|
||||
|
||||
To run the application without Docker/Podman, you will need to manually install all dependencies and build the necessary components.
|
||||
|
||||
Note that some dependencies might not be available in the standard repositories of all Linux distributions, and may require additional steps to install.
|
||||
|
||||
The following guide assumes you have a basic understanding of using a command line interface in your operating system.
|
||||
|
||||
It should work on most Linux distributions and MacOS. For Windows, you might need to use Windows Subsystem for Linux (WSL) for certain steps.
|
||||
The amount of dependencies is to actually reduce overall size, ie installing LibreOffice sub components rather than full LibreOffice package.
|
||||
It should work on most Linux distributions and MacOS. For Windows, you might need to use Windows Subsystem for Linux (WSL) for certain steps. The amount of dependencies is to actually reduce overall size, i.e., installing LibreOffice subcomponents rather than the full LibreOffice package.
|
||||
|
||||
You could theoretically use a Distrobox/Toolbox, if your Distribution has old or not all Packages. But you might just as well use the Docker Container then.
|
||||
You could theoretically use a Distrobox/Toolbox if your distribution has old or not all packages. But you might just as well use the Docker container then.
|
||||
|
||||
### Step 1: Prerequisites
|
||||
|
||||
Install the following software, if not already installed:
|
||||
|
||||
- Java 17 or later (21 recommended)
|
||||
|
||||
- Gradle 7.0 or later (included within repo so not needed on server)
|
||||
|
||||
- Git
|
||||
|
||||
- Python 3.8 (with pip)
|
||||
|
||||
- Make
|
||||
|
||||
- GCC/G++
|
||||
|
||||
- Automake
|
||||
|
||||
- Autoconf
|
||||
|
||||
- libtool
|
||||
|
||||
- pkg-config
|
||||
|
||||
- zlib1g-dev
|
||||
|
||||
- libleptonica-dev
|
||||
|
||||
For Debian-based systems, you can use the following command:
|
||||
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y git automake autoconf libtool libleptonica-dev pkg-config zlib1g-dev make g++ openjdk-21-jdk python3 python3-pip
|
||||
sudo apt-get install -y git automake autoconf libtool libleptonica-dev pkg-config zlib1g-dev make g++ openjdk-21-jdk python3 python3-pip
|
||||
```
|
||||
|
||||
For Fedora-based systems use this command:
|
||||
@@ -52,6 +39,7 @@ sudo dnf install -y git automake autoconf libtool leptonica-devel pkg-config zli
|
||||
```
|
||||
|
||||
For non-root users with Nix Package Manager, use the following command:
|
||||
|
||||
```bash
|
||||
nix-channel --update
|
||||
nix-env -iA nixpkgs.jdk21 nixpkgs.git nixpkgs.python38 nixpkgs.gnumake nixpkgs.libgcc nixpkgs.automake nixpkgs.autoconf nixpkgs.libtool nixpkgs.pkg-config nixpkgs.zlib nixpkgs.leptonica
|
||||
@@ -63,116 +51,108 @@ For Debian and Fedora, you can build it from source using the following commands
|
||||
|
||||
```bash
|
||||
mkdir ~/.git
|
||||
cd ~/.git &&\
|
||||
git clone https://github.com/agl/jbig2enc.git &&\
|
||||
cd jbig2enc &&\
|
||||
./autogen.sh &&\
|
||||
./configure &&\
|
||||
make &&\
|
||||
cd ~/.git && \
|
||||
git clone https://github.com/agl/jbig2enc.git && \
|
||||
cd jbig2enc && \
|
||||
./autogen.sh && \
|
||||
./configure && \
|
||||
make && \
|
||||
sudo make install
|
||||
```
|
||||
|
||||
For Nix, you will face `Leptonica not detected`. Bypass this by installing it directly using the following command:
|
||||
|
||||
```bash
|
||||
nix-env -iA nixpkgs.jbig2enc
|
||||
```
|
||||
|
||||
### Step 3: Install Additional Software
|
||||
Next we need to install LibreOffice for conversions, ocrmypdf for OCR, and opencv for pattern recognition functionality.
|
||||
|
||||
Next we need to install LibreOffice for conversions, qpdf for OCR, and OpenCV for pattern recognition functionality.
|
||||
|
||||
Install the following software:
|
||||
|
||||
- libreoffice-core
|
||||
|
||||
- libreoffice-common
|
||||
|
||||
- libreoffice-writer
|
||||
|
||||
- libreoffice-calc
|
||||
|
||||
- libreoffice-impress
|
||||
|
||||
- python3-uno
|
||||
|
||||
- unoconv
|
||||
|
||||
- pngquant
|
||||
|
||||
- unpaper
|
||||
|
||||
- ocrmypdf
|
||||
|
||||
- qpdf
|
||||
- opencv-python-headless
|
||||
|
||||
For Debian-based systems, you can use the following command:
|
||||
|
||||
```bash
|
||||
sudo apt-get install -y libreoffice-writer libreoffice-calc libreoffice-impress unpaper ocrmypdf
|
||||
sudo apt-get install -y libreoffice-writer libreoffice-calc libreoffice-impress unpaper qpdf
|
||||
pip3 install uno opencv-python-headless unoconv pngquant WeasyPrint --break-system-packages
|
||||
```
|
||||
|
||||
For Fedora:
|
||||
|
||||
```bash
|
||||
sudo dnf install -y libreoffice-writer libreoffice-calc libreoffice-impress unpaper ocrmypdf
|
||||
sudo dnf install -y libreoffice-writer libreoffice-calc libreoffice-impress unpaper qpdf
|
||||
pip3 install uno opencv-python-headless unoconv pngquant WeasyPrint
|
||||
```
|
||||
|
||||
For Nix:
|
||||
|
||||
```bash
|
||||
nix-env -iA nixpkgs.unpaper nixpkgs.libreoffice nixpkgs.ocrmypdf nixpkgs.poppler_utils
|
||||
nix-env -iA nixpkgs.unpaper nixpkgs.libreoffice nixpkgs.qpdf nixpkgs.poppler_utils
|
||||
pip3 install uno opencv-python-headless unoconv pngquant WeasyPrint
|
||||
```
|
||||
|
||||
### Step 4: Clone and Build Stirling-PDF
|
||||
|
||||
```bash
|
||||
cd ~/.git &&\
|
||||
git clone https://github.com/Stirling-Tools/Stirling-PDF.git &&\
|
||||
cd Stirling-PDF &&\
|
||||
chmod +x ./gradlew &&\
|
||||
cd ~/.git && \
|
||||
git clone https://github.com/Stirling-Tools/Stirling-PDF.git && \
|
||||
cd Stirling-PDF && \
|
||||
chmod +x ./gradlew && \
|
||||
./gradlew build
|
||||
```
|
||||
|
||||
### Step 5: Move jar to desired location
|
||||
### Step 5: Move Jar to Desired Location
|
||||
|
||||
After the build process, a `.jar` file will be generated in the `build/libs` directory.
|
||||
You can move this file to a desired location, for example, `/opt/Stirling-PDF/`.
|
||||
You must also move the Script folder within the Stirling-PDF repo that you have downloaded to this directory.
|
||||
This folder is required for the python scripts using OpenCV.
|
||||
After the build process, a `.jar` file will be generated in the `build/libs` directory. You can move this file to a desired location, for example, `/opt/Stirling-PDF/`. You must also move the Script folder within the Stirling-PDF repo that you have downloaded to this directory. This folder is required for the Python scripts using OpenCV.
|
||||
|
||||
```bash
|
||||
sudo mkdir /opt/Stirling-PDF &&\
|
||||
sudo mv ./build/libs/Stirling-PDF-*.jar /opt/Stirling-PDF/ &&\
|
||||
sudo mv scripts /opt/Stirling-PDF/ &&\
|
||||
sudo mkdir /opt/Stirling-PDF && \
|
||||
sudo mv ./build/libs/Stirling-PDF-*.jar /opt/Stirling-PDF/ && \
|
||||
sudo mv scripts /opt/Stirling-PDF/ && \
|
||||
echo "Scripts installed."
|
||||
```
|
||||
|
||||
For non-root users, you can just keep the jar in the main directory of Stirling-PDF using the following command:
|
||||
|
||||
```bash
|
||||
mv ./build/libs/Stirling-PDF-*.jar ./Stirling-PDF-*.jar
|
||||
```
|
||||
|
||||
### Step 6: Other files
|
||||
### Step 6: Other Files
|
||||
|
||||
#### OCR
|
||||
If you plan to use the OCR (Optical Character Recognition) functionality, you might need to install language packs for Tesseract if running non-english scanning.
|
||||
|
||||
If you plan to use the OCR (Optical Character Recognition) functionality, you might need to install language packs for Tesseract if running non-English scanning.
|
||||
|
||||
##### Installing Language Packs
|
||||
Easiest is to use the langpacks provided by your repositories. Skip the other steps.
|
||||
|
||||
Manual:
|
||||
The easiest method is to use the language packs provided by your repositories. Skip the other steps if they are available.
|
||||
|
||||
**Manual:**
|
||||
|
||||
1. Download the desired language pack(s) by selecting the `.traineddata` file(s) for the language(s) you need.
|
||||
2. Place the `.traineddata` files in the Tesseract tessdata directory: `/usr/share/tessdata`
|
||||
3. Please view [OCRmyPDF install guide](https://ocrmypdf.readthedocs.io/en/latest/installation.html) for more info.
|
||||
|
||||
**IMPORTANT:** DO NOT REMOVE EXISTING `eng.traineddata`, IT'S REQUIRED.
|
||||
|
||||
Debian based systems, install languages with this command:
|
||||
**Debian-based systems**, install languages with this command:
|
||||
|
||||
```bash
|
||||
sudo apt update &&\
|
||||
sudo apt update && \
|
||||
# All languages
|
||||
# sudo apt install -y 'tesseract-ocr-*'
|
||||
|
||||
@@ -183,7 +163,7 @@ apt search tesseract-ocr-
|
||||
dpkg-query -W tesseract-ocr- | sed 's/tesseract-ocr-//g'
|
||||
```
|
||||
|
||||
Fedora:
|
||||
**Fedora:**
|
||||
|
||||
```bash
|
||||
# All languages
|
||||
@@ -196,13 +176,13 @@ dnf search -C tesseract-langpack-
|
||||
rpm -qa | grep tesseract-langpack | sed 's/tesseract-langpack-//g'
|
||||
```
|
||||
|
||||
Nix:
|
||||
**Nix:**
|
||||
|
||||
```bash
|
||||
nix-env -iA nixpkgs.tesseract
|
||||
```
|
||||
|
||||
**Note:** Nix Package Manager pre-installs almost all the language packs when tesseract is installed.
|
||||
**Note:** Nix Package Manager pre-installs almost all the language packs when Tesseract is installed.
|
||||
|
||||
### Step 7: Run Stirling-PDF
|
||||
|
||||
@@ -214,11 +194,13 @@ or
|
||||
java -jar /opt/Stirling-PDF/Stirling-PDF-*.jar
|
||||
```
|
||||
|
||||
Since libreoffice, soffice, and conversion tools have their dbus_tmp_dir set as `dbus_tmp_dir="/run/user/$(id -u)/libreoffice-dbus"`, you might get the following error when using their endpoints:
|
||||
Since LibreOffice, soffice, and conversion tools have their dbus_tmp_dir set as `dbus_tmp_dir="/run/user/$(id -u)/libreoffice-dbus"`, you might get the following error when using their endpoints:
|
||||
|
||||
```
|
||||
[Thread-7] INFO s.s.SPDF.utils.ProcessExecutor - mkdir: cannot create directory ‘/run/user/1501’: Permission denied
|
||||
```
|
||||
To resolve this, before starting the Stirling-PDF, you have to set the environment variable to a directory you have write access to by using the following commands:
|
||||
|
||||
To resolve this, before starting Stirling-PDF, you have to set the environment variable to a directory you have write access to by using the following commands:
|
||||
|
||||
```bash
|
||||
mkdir temp
|
||||
@@ -228,9 +210,10 @@ or
|
||||
java -jar ./Stirling-PDF-*.jar
|
||||
```
|
||||
|
||||
### Step 8: Adding a Desktop icon
|
||||
### Step 8: Adding a Desktop Icon
|
||||
|
||||
This will add a modified app starter to your app menu.
|
||||
|
||||
This will add a modified Appstarter to your Appmenu.
|
||||
```bash
|
||||
location=$(pwd)/gradlew
|
||||
image=$(pwd)/docs/stirling-transparent.svg
|
||||
@@ -251,35 +234,40 @@ EOF
|
||||
|
||||
Note: Currently the app will run in the background until manually closed.
|
||||
|
||||
### Optional: Changing the host and port of the application:
|
||||
### Optional: Changing the Host and Port of the Application
|
||||
|
||||
To override the default configuration, you can add the following to `/.git/Stirling-PDF/configs/custom_settings.yml` file:
|
||||
|
||||
```bash
|
||||
```yaml
|
||||
server:
|
||||
host: 0.0.0.0 # Not working - use instead address
|
||||
address: 0.0.0.0
|
||||
port: 3000
|
||||
```
|
||||
'-Djava.net.preferIPv4Stack=true' --> To force ipv4 only in the java starting command
|
||||
|
||||
`-Djava.net.preferIPv4Stack=true` --> To force IPv4 only in the Java starting command
|
||||
|
||||
**Note:** This file is created after the first application launch. To have it before that, you can create the directory and add the file yourself.
|
||||
|
||||
### Optional: Run Stirling-PDF as a service (requires root).
|
||||
### Optional: Run Stirling-PDF as a Service (requires root)
|
||||
|
||||
First create a .env file, where you can store environment variables:
|
||||
```
|
||||
First create a `.env` file, where you can store environment variables:
|
||||
|
||||
```bash
|
||||
touch /opt/Stirling-PDF/.env
|
||||
```
|
||||
In this file you can add all variables, one variable per line, as stated in the main readme (for example SYSTEM_DEFAULTLOCALE="de-DE").
|
||||
|
||||
Create a new file where we store our service settings and open it with nano editor:
|
||||
```
|
||||
In this file, you can add all variables, one variable per line, as stated in the main readme (for example `SYSTEM_DEFAULTLOCALE="de-DE"`).
|
||||
|
||||
Create a new file where we store our service settings and open it with the nano editor:
|
||||
|
||||
```bash
|
||||
nano /etc/systemd/system/stirlingpdf.service
|
||||
```
|
||||
|
||||
Paste this content, make sure to update the filename of the jar-file. Press Ctrl+S and Ctrl+X to save and exit the nano editor:
|
||||
```
|
||||
Paste this content, make sure to update the filename of the jar file. Press `Ctrl+S` and `Ctrl+X` to save and exit the nano editor:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Stirling-PDF service
|
||||
After=syslog.target network.target
|
||||
@@ -303,22 +291,25 @@ WantedBy=multi-user.target
|
||||
|
||||
Notify systemd that it has to rebuild its internal service database (you have to run this command every time you make a change in the service file):
|
||||
|
||||
```
|
||||
```bash
|
||||
sudo systemctl daemon-reload
|
||||
```
|
||||
|
||||
Enable the service to tell the service to start it automatically:
|
||||
```
|
||||
Enable the service to tell it to start automatically:
|
||||
|
||||
```bash
|
||||
sudo systemctl enable stirlingpdf.service
|
||||
```
|
||||
|
||||
See the status of the service:
|
||||
```
|
||||
|
||||
```bash
|
||||
sudo systemctl status stirlingpdf.service
|
||||
```
|
||||
|
||||
Manually start/stop/restart the service:
|
||||
```
|
||||
|
||||
```bash
|
||||
sudo systemctl start stirlingpdf.service
|
||||
sudo systemctl stop stirlingpdf.service
|
||||
sudo systemctl restart stirlingpdf.service
|
||||
@@ -326,12 +317,11 @@ sudo systemctl restart stirlingpdf.service
|
||||
|
||||
---
|
||||
|
||||
Remember to set the necessary environment variables before running the project if you want to customize the application the list can be seen in the main readme.
|
||||
Remember to set the necessary environment variables before running the project if you want to customize the application. The list can be seen in the main readme.
|
||||
|
||||
You can do this in the terminal by using the `export` command or -D argument to java -jar command:
|
||||
You can do this in the terminal by using the `export` command or `-D` argument to the Java `-jar` command:
|
||||
|
||||
```bash
|
||||
export APP_HOME_NAME="Stirling PDF"
|
||||
or
|
||||
-DAPP_HOME_NAME="Stirling PDF"
|
||||
```
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# Pipeline Configuration and Usage Tutorial
|
||||
- Configure the pipeline config file and input files to run files against it
|
||||
- For reuse, download the config file and re-upload it when needed, or place it in /pipeline/defaultWebUIConfigs/ to auto-load in the web UI for all users
|
||||
|
||||
- Configure the pipeline config file and input files to run files against it.
|
||||
- For reuse, download the config file and re-upload it when needed, or place it in `/pipeline/defaultWebUIConfigs/` to auto-load in the web UI for all users.
|
||||
|
||||
## Steps to Configure and Use Your Pipeline
|
||||
|
||||
@@ -26,19 +27,16 @@
|
||||
- Use the **Validation** button to check your pipeline. A green indicator signifies correct setup; a pop-out error indicates issues.
|
||||
|
||||
8. **Download Pipeline Configuration**
|
||||
- To use the configuration for folder scanning (or save it for future use and reupload it), you can also download a JSON file in this menu. You can also pre-load this for future use by placing it in ``/pipeline/defaultWebUIConfigs/``. It will then appear in the dropdown menu for all users to use.
|
||||
- To use the configuration for folder scanning (or save it for future use and re-upload it), download a JSON file in this menu. You can also pre-load it for future use by placing it in `/pipeline/defaultWebUIConfigs/`. It will then appear in the dropdown menu for all users to use.
|
||||
|
||||
9. **Submit Files for Processing**
|
||||
- If your pipeline is correctly set up close the configure menu, input the files and hit **Submit**.
|
||||
- If your pipeline is correctly set up, close the configure menu, input the files, and hit **Submit**.
|
||||
|
||||
10. **Note on Web UI Limitations**
|
||||
- The current web UI version does not support operations that require multiple different types of inputs, such as adding a separate image to a PDF.
|
||||
|
||||
|
||||
### Current Limitations
|
||||
- Cannot have more than one of the same operation
|
||||
- Cannot input additional files via UI
|
||||
- All files and operations run in serial mode
|
||||
|
||||
|
||||
|
||||
- Cannot have more than one of the same operation.
|
||||
- Cannot input additional files via UI.
|
||||
- All files and operations run in serial mode.
|
||||
|
||||
457
README.md
457
README.md
@@ -1,4 +1,4 @@
|
||||
<p align="center"><img src="https://raw.githubusercontent.com/Stirling-Tools/Stirling-PDF/main/docs/stirling.png" width="80" ></p>
|
||||
<p align="center"><img src="https://raw.githubusercontent.com/Stirling-Tools/Stirling-PDF/main/docs/stirling.png" width="80"></p>
|
||||
<h1 align="center">Stirling-PDF</h1>
|
||||
|
||||
[](https://hub.docker.com/r/frooodle/s-pdf)
|
||||
@@ -6,12 +6,12 @@
|
||||
[](https://github.com/Stirling-Tools/Stirling-PDF/)
|
||||
[](https://github.com/Stirling-Tools/stirling-pdf)
|
||||
|
||||
<a href="https://www.producthunt.com/posts/stirling-pdf?embed=true&utm_source=badge-featured&utm_medium=badge&utm_souce=badge-stirling-pdf" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=641239&theme=light" alt="Stirling PDF - Open source locally hosted web PDF editor | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
|
||||
[](https://cloud.digitalocean.com/apps/new?repo=https://github.com/Stirling-Tools/Stirling-PDF/tree/digitalOcean&refcode=c3210994b1af)
|
||||
[<img src="https://www.ssdnodes.com/wp-content/uploads/2023/11/footer-logo.svg" alt="Name" height="40">](https://www.ssdnodes.com/manage/aff.php?aff=2216®ister=true)
|
||||
|
||||
This is a robust, locally hosted web-based PDF manipulation tool using Docker. It enables you to carry out various operations on PDF files, including splitting, merging, converting, reorganizing, adding images, rotating, compressing, and more. This locally hosted web application has evolved to encompass a comprehensive set of features, addressing all your PDF requirements.
|
||||
[Stirling-PDF](https://www.stirlingpdf.com) is a robust, locally hosted web-based PDF manipulation tool using Docker. It enables you to carry out various operations on PDF files, including splitting, merging, converting, reorganizing, adding images, rotating, compressing, and more. This locally hosted web application has evolved to encompass a comprehensive set of features, addressing all your PDF requirements.
|
||||
|
||||
Stirling PDF does not initiate any outbound calls for record-keeping or tracking purposes.
|
||||
Stirling-PDF does not initiate any outbound calls for record-keeping or tracking purposes.
|
||||
|
||||
All files and PDFs exist either exclusively on the client side, reside in server memory only during task execution, or temporarily reside in a file solely for the execution of the task. Any file downloaded by the user will have been deleted from the server by that point.
|
||||
|
||||
@@ -19,7 +19,8 @@ All files and PDFs exist either exclusively on the client side, reside in server
|
||||
|
||||
## Features
|
||||
|
||||
- Dark mode support.
|
||||
- Enterprise features like SSO Check [here](https://docs.stirlingpdf.com/Enterprise%20Edition)
|
||||
- Dark mode support
|
||||
- Custom download options
|
||||
- Parallel file processing and downloads
|
||||
- Custom 'Pipelines' to run multiple features in a queue
|
||||
@@ -27,99 +28,108 @@ All files and PDFs exist either exclusively on the client side, reside in server
|
||||
- Optional Login and Authentication support (see [here](https://github.com/Stirling-Tools/Stirling-PDF/tree/main#login-authentication) for documentation)
|
||||
- Database Backup and Import (see [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DATABASE.md) for documentation)
|
||||
|
||||
## **PDF Features**
|
||||
|
||||
### **Page Operations**
|
||||
## PDF Features
|
||||
|
||||
- View and modify PDFs - View multi page PDFs with custom viewing sorting and searching. Plus on page edit features like annotate, draw and adding text and images. (Using PDF.js with Joxit and Liberation.Liberation fonts)
|
||||
- Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages.
|
||||
- Merge multiple PDFs together into a single resultant file.
|
||||
- Split PDFs into multiple files at specified page numbers or extract all pages as individual files.
|
||||
- Reorganize PDF pages into different orders.
|
||||
- Rotate PDFs in 90-degree increments.
|
||||
- Remove pages.
|
||||
- Multi-page layout (Format PDFs into a multi-paged page).
|
||||
- Scale page contents size by set %.
|
||||
- Adjust Contrast.
|
||||
- Crop PDF.
|
||||
- Auto Split PDF (With physically scanned page dividers).
|
||||
- Extract page(s).
|
||||
- Convert PDF to a single page.
|
||||
- Overlay PDFs ontop of each other
|
||||
### Page Operations
|
||||
|
||||
### **Conversion Operations**
|
||||
- View and modify PDFs - View multi-page PDFs with custom viewing, sorting, and searching. Plus on-page edit features like annotate, draw, and adding text and images. (Using PDF.js with Joxit and Liberation fonts)
|
||||
- Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages
|
||||
- Merge multiple PDFs into a single resultant file
|
||||
- Split PDFs into multiple files at specified page numbers or extract all pages as individual files
|
||||
- Reorganize PDF pages into different orders
|
||||
- Rotate PDFs in 90-degree increments
|
||||
- Remove pages
|
||||
- Multi-page layout (format PDFs into a multi-paged page)
|
||||
- Scale page contents size by set percentage
|
||||
- Adjust contrast
|
||||
- Crop PDF
|
||||
- Auto split PDF (with physically scanned page dividers)
|
||||
- Extract page(s)
|
||||
- Convert PDF to a single page
|
||||
- Overlay PDFs on top of each other
|
||||
- PDF to single page
|
||||
- Split PDF by sections
|
||||
|
||||
- Convert PDFs to and from images.
|
||||
- Convert any common file to PDF (using LibreOffice).
|
||||
- Convert PDF to Word/Powerpoint/Others (using LibreOffice).
|
||||
- Convert HTML to PDF.
|
||||
- URL to PDF.
|
||||
- Markdown to PDF.
|
||||
### Conversion Operations
|
||||
|
||||
### **Security & Permissions**
|
||||
- Convert PDFs to and from images
|
||||
- Convert any common file to PDF (using LibreOffice)
|
||||
- Convert PDF to Word/PowerPoint/others (using LibreOffice)
|
||||
- Convert HTML to PDF
|
||||
- Convert PDF to xml
|
||||
- Convert PDF to CSV
|
||||
- URL to PDF
|
||||
- Markdown to PDF
|
||||
|
||||
- Add and remove passwords.
|
||||
- Change/set PDF Permissions.
|
||||
- Add watermark(s).
|
||||
- Certify/sign PDFs.
|
||||
- Sanitize PDFs.
|
||||
- Auto-redact text.
|
||||
### Security & Permissions
|
||||
|
||||
### **Other Operations**
|
||||
- Add and remove passwords
|
||||
- Change/set PDF permissions
|
||||
- Add watermark(s)
|
||||
- Certify/sign PDFs
|
||||
- Sanitize PDFs
|
||||
- Auto-redact text
|
||||
|
||||
- Add/Generate/Write signatures.
|
||||
- Repair PDFs.
|
||||
- Detect and remove blank pages.
|
||||
- Compare 2 PDFs and show differences in text.
|
||||
- Add images to PDFs.
|
||||
- Compress PDFs to decrease their filesize (Using OCRMyPDF).
|
||||
- Extract images from PDF.
|
||||
- Extract images from Scans.
|
||||
- Add page numbers.
|
||||
- Auto rename file by detecting PDF header text.
|
||||
- OCR on PDF (Using OCRMyPDF).
|
||||
- PDF/A conversion (Using OCRMyPDF).
|
||||
- Edit metadata.
|
||||
- Flatten PDFs.
|
||||
- Get all information on a PDF to view or export as JSON.
|
||||
- Show/Detect embedded Javascript
|
||||
### Other Operations
|
||||
|
||||
For a overview of the tasks and the technology each uses please view [Endpoint-groups.md](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md)
|
||||
- Add/generate/write signatures
|
||||
- Split by Size or PDF
|
||||
- Repair PDFs
|
||||
- Detect and remove blank pages
|
||||
- Compare two PDFs and show differences in text
|
||||
- Add images to PDFs
|
||||
- Compress PDFs to decrease their filesize (using qpdf)
|
||||
- Extract images from PDF
|
||||
- Remove images from PDF
|
||||
- Extract images from scans
|
||||
- Remove annotations
|
||||
- Add page numbers
|
||||
- Auto rename file by detecting PDF header text
|
||||
- OCR on PDF (using tesseract)
|
||||
- PDF/A conversion (using libreoffice)
|
||||
- Edit metadata
|
||||
- Flatten PDFs
|
||||
- Get all information on a PDF to view or export as JSON
|
||||
- Show/detect embedded JavaScript
|
||||
|
||||
Demo of the app is available [here](https://stirlingpdf.io).
|
||||
For an overview of the tasks and the technology each uses, please view [Endpoint-groups.md](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md).
|
||||
|
||||
## Technologies used
|
||||
A demo of the app is available [here](https://stirlingpdf.io).
|
||||
|
||||
## Technologies Used
|
||||
|
||||
- Spring Boot + Thymeleaf
|
||||
- [PDFBox](https://github.com/apache/pdfbox/tree/trunk)
|
||||
- [LibreOffice](https://www.libreoffice.org/discover/libreoffice/) for advanced conversions
|
||||
- [OcrMyPdf](https://github.com/ocrmypdf/OCRmyPDF)
|
||||
- [qpdf](https://github.com/qpdf/qpdf)
|
||||
- HTML, CSS, JavaScript
|
||||
- Docker
|
||||
- [PDF.js](https://github.com/mozilla/pdf.js)
|
||||
- [PDF-LIB.js](https://github.com/Hopding/pdf-lib)
|
||||
|
||||
## How to use
|
||||
## How to Use
|
||||
|
||||
### Windows
|
||||
For windows users download the latest Stirling-PDF.exe from our [release](https://github.com/Stirling-Tools/Stirling-PDF/releases) section or by clicking [here](https://github.com/Stirling-Tools/Stirling-PDF/releases/latest/download/Stirling-PDF.exe)
|
||||
|
||||
For Windows users, download the latest Stirling-PDF.exe from our [release](https://github.com/Stirling-Tools/Stirling-PDF/releases) section or by clicking [here](https://github.com/Stirling-Tools/Stirling-PDF/releases/latest/download/Stirling-PDF.exe).
|
||||
|
||||
### Locally
|
||||
|
||||
Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/LocalRunGuide.md
|
||||
Please view the [LocalRunGuide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/LocalRunGuide.md).
|
||||
|
||||
### Docker / Podman
|
||||
|
||||
https://hub.docker.com/r/frooodle/s-pdf
|
||||
> [!NOTE]
|
||||
> <https://hub.docker.com/r/stirlingtools/stirling-pdf>
|
||||
|
||||
Stirling PDF has 3 different versions, a Full version and ultra-Lite version as well as a 'Fat' version. Depending on the types of features you use you may want a smaller image to save on space.
|
||||
To see what the different versions offer please look at our [version mapping](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Version-groups.md)
|
||||
For people that don't mind about space optimization just use the latest tag.
|
||||

|
||||

|
||||

|
||||
Stirling-PDF has three different versions: a full version, an ultra-lite version, and a 'fat' version. Depending on the types of features you use, you may want a smaller image to save on space. To see what the different versions offer, please look at our [version mapping](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Version-groups.md). For people that don't mind space optimization, just use the latest tag.
|
||||
|
||||
Please note in below examples you may need to change the volume paths as needed, current examples install them to the current working directory
|
||||
eg ``./extraConfigs:/configs`` to ``/opt/stirlingpdf/extraConfigs:/configs``
|
||||

|
||||

|
||||

|
||||
|
||||
Please note in the examples below, you may need to change the volume paths as needed, e.g., `./extraConfigs:/configs` to `/opt/stirlingpdf/extraConfigs:/configs`.
|
||||
|
||||
### Docker Run
|
||||
|
||||
@@ -129,15 +139,13 @@ docker run -d \
|
||||
-v ./trainingData:/usr/share/tessdata \
|
||||
-v ./extraConfigs:/configs \
|
||||
-v ./logs:/logs \
|
||||
# Optional customization (not required)
|
||||
# -v /location/of/customFiles:/customFiles \
|
||||
-e DOCKER_ENABLE_SECURITY=false \
|
||||
-e INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false \
|
||||
-e LANGS=en_GB \
|
||||
--name stirling-pdf \
|
||||
frooodle/s-pdf:latest
|
||||
|
||||
Can also add these for customisation but are not required
|
||||
|
||||
-v /location/of/customFiles:/customFiles \
|
||||
stirlingtools/stirling-pdf:latest
|
||||
```
|
||||
|
||||
### Docker Compose
|
||||
@@ -146,11 +154,11 @@ docker run -d \
|
||||
version: '3.3'
|
||||
services:
|
||||
stirling-pdf:
|
||||
image: frooodle/s-pdf:latest
|
||||
image: stirlingtools/stirling-pdf:latest
|
||||
ports:
|
||||
- '8080:8080'
|
||||
volumes:
|
||||
- ./trainingData:/usr/share/tessdata #Required for extra OCR languages
|
||||
- ./trainingData:/usr/share/tessdata # Required for extra OCR languages
|
||||
- ./extraConfigs:/configs
|
||||
# - ./customFiles:/customFiles/
|
||||
# - ./logs:/logs/
|
||||
@@ -162,203 +170,258 @@ services:
|
||||
|
||||
Note: Podman is CLI-compatible with Docker, so simply replace "docker" with "podman".
|
||||
|
||||
## Enable OCR/Compression feature
|
||||
### Kubernetes
|
||||
|
||||
Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR.md
|
||||
See the kubernetes helm chart [here](https://github.com/Stirling-Tools/Stirling-PDF-chart)
|
||||
|
||||
## Reuse stored files
|
||||
## Enable OCR/Compression Feature
|
||||
|
||||
Certain functionality like ``Sign`` Supports pre-saved files stored at ``/customFiles/signatures/``, image files placed within here will be accesable to be used via webUI
|
||||
Currently this supports two folder types
|
||||
- ``/customFiles/signatures/ALL_USERS`` accessible to all users, useful for orginasations were many users use same files or for users not using authentication
|
||||
- ``/customFiles/signatures/{username}`` such as ``/customFiles/signatures/froodle`` accessible to only the ``froodle`` username, private for all others
|
||||
Please view the [HowToUseOCR.md](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR.md).
|
||||
|
||||
## Reuse Stored Files
|
||||
|
||||
Certain functionality like `Sign` supports pre-saved files stored at `/customFiles/signatures/`. Image files placed within here will be accessible to be used via the web UI. Currently, this supports two folder types:
|
||||
|
||||
- `/customFiles/signatures/ALL_USERS`: Accessible to all users, useful for organizations where many users use the same files or for users not using authentication
|
||||
- `/customFiles/signatures/{username}`: Such as `/customFiles/signatures/froodle`, accessible only to the `froodle` username, private for all others
|
||||
|
||||
## Supported Languages
|
||||
|
||||
Stirling PDF currently supports 38!
|
||||
Stirling-PDF currently supports 37 languages!
|
||||
|
||||
| Language | Progress |
|
||||
| ------------------------------------------- | -------------------------------------- |
|
||||
| Arabic (العربية) (ar_AR) |  |
|
||||
| Basque (Euskara) (eu_ES) |  |
|
||||
| Bulgarian (Български) (bg_BG) |  |
|
||||
| Catalan (Català) (ca_CA) |  |
|
||||
| Croatian (Hrvatski) (hr_HR) |  |
|
||||
| Czech (Česky) (cs_CZ) |  |
|
||||
| Danish (Dansk) (da_DK) |  |
|
||||
| Dutch (Nederlands) (nl_NL) |  |
|
||||
| English (English) (en_GB) |  |
|
||||
| English (US) (en_US) |  |
|
||||
| French (Français) (fr_FR) |  |
|
||||
| German (Deutsch) (de_DE) |  |
|
||||
| Greek (Ελληνικά) (el_GR) |  |
|
||||
| Hindi (हिंदी) (hi_IN) |  |
|
||||
| Hungarian (Magyar) (hu_HU) |  |
|
||||
| Indonesia (Bahasa Indonesia) (id_ID) |  |
|
||||
| Irish (Gaeilge) (ga_IE) |  |
|
||||
| Italian (Italiano) (it_IT) |  |
|
||||
| Japanese (日本語) (ja_JP) |  |
|
||||
| Korean (한국어) (ko_KR) |  |
|
||||
| Norwegian (Norsk) (no_NB) |  |
|
||||
| Polish (Polski) (pl_PL) |  |
|
||||
| Portuguese (Português) (pt_PT) |  |
|
||||
| Portuguese Brazilian (Português) (pt_BR) |  |
|
||||
| Romanian (Română) (ro_RO) |  |
|
||||
| Russian (Русский) (ru_RU) |  |
|
||||
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
||||
| Simplified Chinese (简体中文) (zh_CN) |  |
|
||||
| Slovakian (Slovensky) (sk_SK) |  |
|
||||
| Spanish (Español) (es_ES) |  |
|
||||
| Swedish (Svenska) (sv_SE) |  |
|
||||
| Thai (ไทย) (th_TH) |  |
|
||||
| Traditional Chinese (繁體中文) (zh_TW) |  |
|
||||
| Turkish (Türkçe) (tr_TR) |  |
|
||||
| Ukrainian (Українська) (uk_UA) |  |
|
||||
| Vietnamese (Tiếng Việt) (vi_VN) |  |
|
||||
| Language | Progress |
|
||||
| -------------------------------------------- | -------------------------------------- |
|
||||
| Arabic (العربية) (ar_AR) |  |
|
||||
| Azerbaijani (Azərbaycan Dili) (az_AZ) |  |
|
||||
| Basque (Euskara) (eu_ES) |  |
|
||||
| Bulgarian (Български) (bg_BG) |  |
|
||||
| Catalan (Català) (ca_CA) |  |
|
||||
| Croatian (Hrvatski) (hr_HR) |  |
|
||||
| Czech (Česky) (cs_CZ) |  |
|
||||
| Danish (Dansk) (da_DK) |  |
|
||||
| Dutch (Nederlands) (nl_NL) |  |
|
||||
| English (English) (en_GB) |  |
|
||||
| English (US) (en_US) |  |
|
||||
| French (Français) (fr_FR) |  |
|
||||
| German (Deutsch) (de_DE) |  |
|
||||
| Greek (Ελληνικά) (el_GR) |  |
|
||||
| Hindi (हिंदी) (hi_IN) |  |
|
||||
| Hungarian (Magyar) (hu_HU) |  |
|
||||
| Indonesian (Bahasa Indonesia) (id_ID) |  |
|
||||
| Irish (Gaeilge) (ga_IE) |  |
|
||||
| Italian (Italiano) (it_IT) |  |
|
||||
| Japanese (日本語) (ja_JP) |  |
|
||||
| Korean (한국어) (ko_KR) |  |
|
||||
| Norwegian (Norsk) (no_NB) |  |
|
||||
| Polish (Polski) (pl_PL) |  |
|
||||
| Portuguese (Português) (pt_PT) |  |
|
||||
| Portuguese Brazilian (Português) (pt_BR) |  |
|
||||
| Romanian (Română) (ro_RO) |  |
|
||||
| Russian (Русский) (ru_RU) |  |
|
||||
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
||||
| Simplified Chinese (简体中文) (zh_CN) |  |
|
||||
| Slovakian (Slovensky) (sk_SK) |  |
|
||||
| Spanish (Español) (es_ES) |  |
|
||||
| Swedish (Svenska) (sv_SE) |  |
|
||||
| Thai (ไทย) (th_TH) |  |
|
||||
| Traditional Chinese (繁體中文) (zh_TW) |  |
|
||||
| Turkish (Türkçe) (tr_TR) |  |
|
||||
| Ukrainian (Українська) (uk_UA) |  |
|
||||
| Vietnamese (Tiếng Việt) (vi_VN) |  |
|
||||
|
||||
## Contributing (creating issues, translations, fixing bugs, etc.)
|
||||
## Contributing (Creating Issues, Translations, Fixing Bugs, etc.)
|
||||
|
||||
Please see our [Contributing Guide](CONTRIBUTING.md)!
|
||||
Please see our [Contributing Guide](CONTRIBUTING.md).
|
||||
|
||||
## Customisation
|
||||
## Stirling PDF Enterprise
|
||||
|
||||
Stirling PDF allows easy customization of the app.
|
||||
Includes things like
|
||||
Stirling PDF offers a Enterprise edition of its software, This is the same great software but with added features and comforts
|
||||
|
||||
### Whats included
|
||||
|
||||
- Prioritised Support tickets via support@stirlingpdf.com to reach directly to Stirling-PDF team for support and 1:1 meetings where applicable (Provided they come from same email domain registered with us)
|
||||
- Prioritised Enhancements to Stirling-PDF where applicable
|
||||
- Base SSO support
|
||||
- Advanced SSO such as automated login handling (Coming very soon)
|
||||
- SAML SSO (Coming very soon)
|
||||
- Custom automated metadata handling
|
||||
- Advanced user configurations (Coming soon)
|
||||
- Plus other exciting features to come
|
||||
|
||||
Check out of [docs](https://docs.stirlingpdf.com/Enterprise%20Edition) on it or our official [website](https://www.stirlingpdf.com)
|
||||
|
||||
## Customization
|
||||
|
||||
Stirling-PDF allows easy customization of the app, including things like:
|
||||
|
||||
- Custom application name
|
||||
- Custom slogans, icons, HTML, images CSS etc (via file overrides)
|
||||
- Custom slogans, icons, HTML, images, CSS, etc. (via file overrides)
|
||||
|
||||
There are two options for this, either using the generated settings file ``settings.yml``
|
||||
This file is located in the ``/configs`` directory and follows standard YAML formatting
|
||||
There are two options for this, either using the generated settings file `settings.yml`, which is located in the `/configs` directory and follows standard YAML formatting, or using environment variables, which would override the settings file.
|
||||
|
||||
Environment variables are also supported and would override the settings file
|
||||
For example in the settings.yml you have
|
||||
For example, in `settings.yml`, you might have:
|
||||
|
||||
```yaml
|
||||
security:
|
||||
enableLogin: 'true'
|
||||
```
|
||||
|
||||
To have this via an environment variable you would have ``SECURITY_ENABLELOGIN``
|
||||
To have this via an environment variable, you would use `SECURITY_ENABLELOGIN`.
|
||||
|
||||
The Current list of settings is
|
||||
The current list of settings is:
|
||||
|
||||
```yaml
|
||||
security:
|
||||
enableLogin: false # set to 'true' to enable login
|
||||
csrfDisabled: true # Set to 'true' to disable CSRF protection (not recommended for production)
|
||||
csrfDisabled: true # set to 'true' to disable CSRF protection (not recommended for production)
|
||||
loginAttemptCount: 5 # lock user account after 5 tries; when using e.g. Fail2Ban you can deactivate the function with -1
|
||||
loginResetTimeMinutes: 120 # lock account for 2 hours after x attempts
|
||||
loginMethod: all # 'all' (Login Username/Password and OAuth2[must be enabled and configured]), 'normal'(only Login with Username/Password) or 'oauth2'(only Login with OAuth2)
|
||||
initialLogin:
|
||||
username: '' # Initial username for the first login
|
||||
password: '' # Initial password for the first login
|
||||
username: '' # initial username for the first login
|
||||
password: '' # initial password for the first login
|
||||
oauth2:
|
||||
enabled: false # set to 'true' to enable login (Note: enableLogin must also be 'true' for this to work)
|
||||
client:
|
||||
keycloak:
|
||||
issuer: '' # URL of the Keycloak realm's OpenID Connect Discovery endpoint
|
||||
clientId: '' # Client ID for Keycloak OAuth2
|
||||
clientSecret: '' # Client Secret for Keycloak OAuth2
|
||||
scopes: openid, profile, email # Scopes for Keycloak OAuth2
|
||||
useAsUsername: preferred_username # Field to use as the username for Keycloak OAuth2
|
||||
clientId: '' # client ID for Keycloak OAuth2
|
||||
clientSecret: '' # client secret for Keycloak OAuth2
|
||||
scopes: openid, profile, email # scopes for Keycloak OAuth2
|
||||
useAsUsername: preferred_username # field to use as the username for Keycloak OAuth2
|
||||
google:
|
||||
clientId: '' # Client ID for Google OAuth2
|
||||
clientSecret: '' # Client Secret for Google OAuth2
|
||||
scopes: https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile # Scopes for Google OAuth2
|
||||
useAsUsername: email # Field to use as the username for Google OAuth2
|
||||
clientId: '' # client ID for Google OAuth2
|
||||
clientSecret: '' # client secret for Google OAuth2
|
||||
scopes: https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile # scopes for Google OAuth2
|
||||
useAsUsername: email # field to use as the username for Google OAuth2
|
||||
github:
|
||||
clientId: '' # Client ID for GitHub OAuth2
|
||||
clientSecret: '' # Client Secret for GitHub OAuth2
|
||||
scopes: read:user # Scope for GitHub OAuth2
|
||||
useAsUsername: login # Field to use as the username for GitHub OAuth2
|
||||
issuer: '' # set to any provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) end-point
|
||||
clientId: '' # Client ID from your provider
|
||||
clientSecret: '' # Client Secret from your provider
|
||||
clientId: '' # client ID for GitHub OAuth2
|
||||
clientSecret: '' # client secret for GitHub OAuth2
|
||||
scopes: read:user # scope for GitHub OAuth2
|
||||
useAsUsername: login # field to use as the username for GitHub OAuth2
|
||||
issuer: '' # set to any provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) endpoint
|
||||
clientId: '' # client ID from your provider
|
||||
clientSecret: '' # client secret from your provider
|
||||
autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users
|
||||
blockRegistration: false # set to 'true' to deny login with SSO without prior registration by an admin
|
||||
useAsUsername: email # Default is 'email'; custom fields can be used as the username
|
||||
scopes: openid, profile, email # Specify the scopes for which the application will request permissions
|
||||
provider: google # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak'
|
||||
useAsUsername: email # default is 'email'; custom fields can be used as the username
|
||||
scopes: openid, profile, email # specify the scopes for which the application will request permissions
|
||||
provider: google # set this to your OAuth provider's name, e.g., 'google' or 'keycloak'
|
||||
saml2:
|
||||
enabled: false # currently in alpha, not recommended for use yet, enableAlphaFunctionality must be set to true
|
||||
autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users
|
||||
blockRegistration: false # set to 'true' to deny login with SSO without prior registration by an admin
|
||||
registrationId: stirling
|
||||
idpMetadataUri: https://dev-XXXXXXXX.okta.com/app/externalKey/sso/saml/metadata
|
||||
idpSingleLogoutUrl: https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/slo/saml
|
||||
idpSingleLoginUrl: https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/sso/saml
|
||||
idpIssuer: http://www.okta.com/externalKey
|
||||
idpCert: classpath:okta.crt
|
||||
privateKey: classpath:saml-private-key.key
|
||||
spCert: classpath:saml-public-cert.crt
|
||||
|
||||
enterpriseEdition:
|
||||
enabled: false # set to 'true' to enable enterprise edition
|
||||
key: 00000000-0000-0000-0000-000000000000
|
||||
CustomMetadata:
|
||||
autoUpdateMetadata: false # set to 'true' to automatically update metadata with below values
|
||||
author: username # supports text such as 'John Doe' or types such as username to autopopulate with user's username
|
||||
creator: Stirling-PDF # supports text such as 'Company-PDF'
|
||||
producer: Stirling-PDF # supports text such as 'Company-PDF'
|
||||
|
||||
legal:
|
||||
termsAndConditions: https://www.stirlingpdf.com/terms-and-conditions # URL to the terms and conditions of your application (e.g. https://example.com/terms). Empty string to disable or filename to load from local file in static folder
|
||||
privacyPolicy: https://www.stirlingpdf.com/privacy-policy # URL to the privacy policy of your application (e.g. https://example.com/privacy). Empty string to disable or filename to load from local file in static folder
|
||||
accessibilityStatement: '' # URL to the accessibility statement of your application (e.g. https://example.com/accessibility). Empty string to disable or filename to load from local file in static folder
|
||||
cookiePolicy: '' # URL to the cookie policy of your application (e.g. https://example.com/cookie). Empty string to disable or filename to load from local file in static folder
|
||||
impressum: '' # URL to the impressum of your application (e.g. https://example.com/impressum). Empty string to disable or filename to load from local file in static folder
|
||||
|
||||
system:
|
||||
defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc)
|
||||
defaultLocale: en-US # set the default language (e.g. 'de-DE', 'fr-FR', etc)
|
||||
googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow
|
||||
enableAlphaFunctionality: false # Set to enable functionality which might need more testing before it fully goes live (This feature might make no changes)
|
||||
showUpdate: true # see when a new update is available
|
||||
showUpdateOnlyAdmin: false # Only admins can see when a new update is available, depending on showUpdate it must be set to 'true'
|
||||
customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template html files
|
||||
enableAlphaFunctionality: false # set to enable functionality which might need more testing before it fully goes live (this feature might make no changes)
|
||||
showUpdate: false # see when a new update is available
|
||||
showUpdateOnlyAdmin: false # only admins can see when a new update is available, depending on showUpdate it must be set to 'true'
|
||||
customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template HTML files
|
||||
tessdataDir: /usr/share/tessdata # path to the directory containing the Tessdata files. This setting is relevant for Windows systems. For Windows users, this path should be adjusted to point to the appropriate directory where the Tessdata files are stored.
|
||||
enableAnalytics: undefined # set to 'true' to enable analytics, set to 'false' to disable analytics; for enterprise users, this is set to true
|
||||
|
||||
ui:
|
||||
appName: '' # Application's visible name
|
||||
homeDescription: '' # Short description or tagline shown on homepage.
|
||||
appNameNavbar: '' # Name displayed on the navigation bar
|
||||
appName: '' # application's visible name
|
||||
homeDescription: '' # short description or tagline shown on the homepage
|
||||
appNameNavbar: '' # name displayed on the navigation bar
|
||||
|
||||
endpoints:
|
||||
toRemove: [] # List endpoints to disable (e.g. ['img-to-pdf', 'remove-pages'])
|
||||
groupsToRemove: [] # List groups to disable (e.g. ['LibreOffice'])
|
||||
toRemove: [] # list endpoints to disable (e.g. ['img-to-pdf', 'remove-pages'])
|
||||
groupsToRemove: [] # list groups to disable (e.g. ['LibreOffice'])
|
||||
|
||||
metrics:
|
||||
enabled: true # 'true' to enable Info APIs (`/api/*`) endpoints, 'false' to disable
|
||||
|
||||
# Automatically Generated Settings (Do Not Edit Directly)
|
||||
AutomaticallyGenerated:
|
||||
key: example
|
||||
UUID: example
|
||||
```
|
||||
|
||||
There is an additional config file ``/configs/custom_settings.yml`` were users familiar with java and spring application.properties can input their own settings on-top of Stirling-PDFs existing ones
|
||||
There is an additional config file `/configs/custom_settings.yml` where users familiar with Java and Spring `application.properties` can input their own settings on top of Stirling-PDF's existing ones.
|
||||
|
||||
### Extra notes
|
||||
|
||||
- Endpoints. Currently, the endpoints ENDPOINTS_TO_REMOVE and GROUPS_TO_REMOVE can include comma separate lists of endpoints and groups to disable as example ENDPOINTS_TO_REMOVE=img-to-pdf,remove-pages would disable both image-to-pdf and remove pages, GROUPS_TO_REMOVE=LibreOffice Would disable all things that use LibreOffice. You can see a list of all endpoints and groups [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md)
|
||||
- customStaticFilePath. Customise static files such as the app logo by placing files in the /customFiles/static/ directory. An example of customising app logo is placing a /customFiles/static/favicon.svg to override current SVG. This can be used to change any images/icons/css/fonts/js etc in Stirling-PDF
|
||||
|
||||
### Environment only parameters
|
||||
### Extra Notes
|
||||
|
||||
- ``SYSTEM_ROOTURIPATH`` ie set to ``/pdf-app`` to Set the application's root URI to ``localhost:8080/pdf-app``
|
||||
- ``SYSTEM_CONNECTIONTIMEOUTMINUTES`` to set custom connection timeout values
|
||||
- ``DOCKER_ENABLE_SECURITY`` to tell docker to download security jar (required as true for auth login)
|
||||
- ``INSTALL_BOOK_AND_ADVANCED_HTML_OPS`` to download calibre onto stirling-pdf enabling pdf to/from book and advanced html conversion
|
||||
- ``LANGS`` to define custom font libraries to install for use for document conversions
|
||||
- **Endpoints**: Currently, the `ENDPOINTS_TO_REMOVE` and `GROUPS_TO_REMOVE` endpoints can include comma-separated lists of endpoints and groups to disable. For example, `ENDPOINTS_TO_REMOVE=img-to-pdf,remove-pages` would disable both image-to-pdf and remove pages, while `GROUPS_TO_REMOVE=LibreOffice` would disable all things that use LibreOffice. You can see a list of all endpoints and groups [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md).
|
||||
- **customStaticFilePath**: Customize static files such as the app logo by placing files in the `/customFiles/static/` directory. An example of customizing the app logo is placing `/customFiles/static/favicon.svg` to override the current SVG. This can be used to change any `images/icons/css/fonts/js`, etc. in Stirling-PDF.
|
||||
|
||||
### Environment-Only Parameters
|
||||
|
||||
- `SYSTEM_ROOTURIPATH` - Set the application's root URI (e.g. `/pdf-app` to set the root URI to `localhost:8080/pdf-app`)
|
||||
- `SYSTEM_CONNECTIONTIMEOUTMINUTES` - Set custom connection timeout values
|
||||
- `DOCKER_ENABLE_SECURITY` - Set to `true` to download security jar (required for authentication login)
|
||||
- `INSTALL_BOOK_AND_ADVANCED_HTML_OPS` - Download Calibre onto Stirling-PDF to enable PDF to/from book and advanced HTML conversion
|
||||
- `LANGS` - Define custom font libraries to install for document conversions
|
||||
|
||||
## API
|
||||
|
||||
For those wanting to use Stirling-PDFs backend API to link with their own custom scripting to edit PDFs you can view all existing API documentation
|
||||
[here](https://app.swaggerhub.com/apis-docs/Stirling-Tools/Stirling-PDF/) or navigate to /swagger-ui/index.html of your stirling-pdf instance for your versions documentation (Or by following the API button in your settings of Stirling-PDF)
|
||||
For those wanting to use Stirling-PDF's backend API to link with their own custom scripting to edit PDFs, you can view all existing API documentation [here](https://app.swaggerhub.com/apis-docs/Stirling-Tools/Stirling-PDF/), or navigate to `/swagger-ui/index.html` of your Stirling-PDF instance for your version's documentation (or by following the API button in the settings of Stirling-PDF).
|
||||
|
||||
## Login authentication
|
||||
## Login Authentication
|
||||
|
||||

|
||||
|
||||
### Prerequisites
|
||||
|
||||
- User must have the folder ./configs volumed within docker so that it is retained during updates.
|
||||
- Docker users must download the security jar version by setting ``DOCKER_ENABLE_SECURITY`` to ``true`` in environment variables.
|
||||
- Then either enable login via the settings.yml file or via setting ``SECURITY_ENABLE_LOGIN`` to ``true``
|
||||
- Now the initial user will be generated with username ``admin`` and password ``stirling``. On login you will be forced to change the password to a new one. You can also use the environment variables ``SECURITY_INITIALLOGIN_USERNAME`` and ``SECURITY_INITIALLOGIN_PASSWORD`` to set your own straight away (Recommended to remove them after user creation).
|
||||
- User must have the folder `./configs` volumed within Docker so that it is retained during updates.
|
||||
- Docker users must download the security jar version by setting `DOCKER_ENABLE_SECURITY` to `true` in environment variables.
|
||||
- Then either enable login via the `settings.yml` file or set `SECURITY_ENABLE_LOGIN` to `true`.
|
||||
- Now the initial user will be generated with username `admin` and password `stirling`. On login, you will be forced to change the password to a new one. You can also use the environment variables `SECURITY_INITIALLOGIN_USERNAME` and `SECURITY_INITIALLOGIN_PASSWORD` to set your own credentials straight away (recommended to remove them after user creation).
|
||||
|
||||
Once the above has been done, on restart, a new stirling-pdf-DB.mv.db will show if everything worked.
|
||||
Once the above has been done, on restart, a new `stirling-pdf-DB.mv.db` will show if everything worked.
|
||||
|
||||
When you login to Stirling PDF you will be redirected to /login page to login with those default credentials. After login everything should function as normal
|
||||
When you log in to Stirling-PDF, you will be redirected to the `/login` page to log in with those default credentials. After login, everything should function as normal.
|
||||
|
||||
To access your account settings go to Account settings in the settings cog menu (top right in navbar) This Account settings menu is also where you find your API key.
|
||||
To access your account settings, go to Account Settings in the settings cog menu (top right in the navbar). This Account Settings menu is also where you find your API key.
|
||||
|
||||
To add new users go to the bottom of Account settings and hit 'Admin Settings', here you can add new users. The different roles mentioned within this are for rate limiting. This is a Work in progress which will be expanding on more in future
|
||||
To add new users, go to the bottom of Account Settings and hit 'Admin Settings'. Here you can add new users. The different roles mentioned within this are for rate limiting. This is a work in progress and will be expanded on more in the future.
|
||||
|
||||
For API usage you must provide a header with 'X-API-Key' and the associated API key for that user.
|
||||
For API usage, you must provide a header with `X-API-Key` and the associated API key for that user.
|
||||
|
||||
## FAQ
|
||||
|
||||
### Q1: What are your planned features?
|
||||
|
||||
- Progress bar/Tracking
|
||||
- Full custom logic pipelines to combine multiple operations together.
|
||||
- Folder support with auto scanning to perform operations on
|
||||
- Redact text (Via UI not just automated way)
|
||||
- Add Forms
|
||||
- Multi page layout (Stich PDF pages together) support x rows y columns and custom page sizing
|
||||
- Progress bar/tracking
|
||||
- Full custom logic pipelines to combine multiple operations together
|
||||
- Folder support with auto-scanning to perform operations on
|
||||
- Redact text (via UI, not just automated)
|
||||
- Add forms
|
||||
- Multi-page layout (stitch PDF pages together) support x rows y columns and custom page sizing
|
||||
- Fill forms manually or automatically
|
||||
|
||||
### Q2: Why is my application downloading .htm files?
|
||||
### Q2: Why is my application downloading .htm files? Why am i getting HTTP error 413?
|
||||
|
||||
This is an issue caused commonly by your NGINX configuration. The default file upload size for NGINX is 1MB, you need to add the following in your Nginx sites-available file. ``client_max_body_size SIZE;`` Where "SIZE" is 50M for example for 50MB files.
|
||||
This is an issue commonly caused by your NGINX configuration. The default file upload size for NGINX is 1MB. You need to add the following in your Nginx sites-available file: `client_max_body_size SIZE;` (where "SIZE" is 50M for example for 50MB files).
|
||||
|
||||
### Q3: Why is my download timing out
|
||||
### Q3: Why is my download timing out?
|
||||
|
||||
NGINX has timeout values by default so if you are running Stirling-PDF behind NGINX you may need to set a timeout value such as adding the config ``proxy_read_timeout 3600;``
|
||||
NGINX has timeout values by default, so if you are running Stirling-PDF behind NGINX, you may need to set a timeout value, such as adding the config `proxy_read_timeout 3600;`.
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
|All versions in a Docker environment can download Calibre as a optional extra at runtime to support `book-to-pdf` and `pdf-to-book` using parameter ``INSTALL_BOOK_AND_ADVANCED_HTML_OPS``.
|
||||
The 'Fat' container contains all those found in 'Full' with security jar along with this Calibre install.
|
||||
The 'Fat' container contains all those found in 'Full' with security jar along with this Calibre install.
|
||||
|
||||
Technology | Ultra-Lite | Full |
|
||||
| Technology | Ultra-Lite | Full |
|
||||
| ---------- | :--------: | :---: |
|
||||
| Java | ✔️ | ✔️ |
|
||||
| JavaScript | ✔️ | ✔️ |
|
||||
| Libre | | ✔️ |
|
||||
| Python | | ✔️ |
|
||||
| OpenCV | | ✔️ |
|
||||
| OCRmyPDF | | ✔️ |
|
||||
| qpdf | | ✔️ |
|
||||
|
||||
| Operation | Ultra-Lite | Full |
|
||||
| ---------------------- | ---------- | ---- |
|
||||
@@ -54,3 +54,15 @@ Technology | Ultra-Lite | Full |
|
||||
| ocr-pdf | | ✔️ |
|
||||
| pdf-to-pdfa | | ✔️ |
|
||||
| remove-blanks | | ✔️ |
|
||||
pdf-to-text | ✔️ | ✔️
|
||||
pdf-to-html | | ✔️
|
||||
pdf-to-word | | ✔️
|
||||
pdf-to-presentation | | ✔️
|
||||
pdf-to-xml | | ✔️
|
||||
remove-annotations | ✔️ | ✔️
|
||||
remove-cert-sign | ✔️ | ✔️
|
||||
remove-image-pdf | ✔️ | ✔️
|
||||
file-to-pdf | | ✔️
|
||||
html-to-pdf | | ✔️
|
||||
url-to-pdf | | ✔️
|
||||
repair | | ✔️
|
||||
|
||||
33
build.gradle
33
build.gradle
@@ -1,6 +1,6 @@
|
||||
plugins {
|
||||
id "java"
|
||||
id "org.springframework.boot" version "3.3.5"
|
||||
id "org.springframework.boot" version "3.4.0"
|
||||
id "io.spring.dependency-management" version "1.1.6"
|
||||
id "org.springdoc.openapi-gradle-plugin" version "1.8.0"
|
||||
id "io.swagger.swaggerhub" version "1.3.2"
|
||||
@@ -10,19 +10,22 @@ plugins {
|
||||
//id "nebula.lint" version "19.0.3"
|
||||
}
|
||||
|
||||
|
||||
|
||||
import com.github.jk1.license.render.*
|
||||
|
||||
ext {
|
||||
springBootVersion = "3.3.5"
|
||||
springBootVersion = "3.4.0"
|
||||
pdfboxVersion = "3.0.3"
|
||||
logbackVersion = "1.5.7"
|
||||
imageioVersion = "3.12.0"
|
||||
lombokVersion = "1.18.34"
|
||||
bouncycastleVersion = "1.78.1"
|
||||
lombokVersion = "1.18.36"
|
||||
bouncycastleVersion = "1.79"
|
||||
}
|
||||
|
||||
group = "stirling.software"
|
||||
version = "0.31.0"
|
||||
version = "0.35.0"
|
||||
|
||||
|
||||
java {
|
||||
// 17 is lowest but we support and recommend 21
|
||||
@@ -78,7 +81,7 @@ launch4j {
|
||||
|
||||
errTitle="Encountered error, Do you have Java 21?"
|
||||
downloadUrl="https://download.oracle.com/java/21/latest/jdk-21_windows-x64_bin.exe"
|
||||
variables=["BROWSER_OPEN=true", "ENDPOINTS_GROUPS_TO_REMOVE=CLI"]
|
||||
variables=["BROWSER_OPEN=true"]
|
||||
jreMinVersion="17"
|
||||
|
||||
mutexName="Stirling-PDF"
|
||||
@@ -119,7 +122,7 @@ configurations.all {
|
||||
}
|
||||
dependencies {
|
||||
//security updates
|
||||
implementation "org.springframework:spring-webmvc:6.1.14"
|
||||
implementation "org.springframework:spring-webmvc:6.2.0"
|
||||
|
||||
implementation("io.github.pixee:java-security-toolkit:1.2.0")
|
||||
|
||||
@@ -141,11 +144,10 @@ dependencies {
|
||||
implementation "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion"
|
||||
implementation "org.springframework.boot:spring-boot-starter-oauth2-client:$springBootVersion"
|
||||
|
||||
implementation 'org.springframework.security:spring-security-saml2-service-provider:6.3.4'
|
||||
implementation 'org.springframework.security:spring-security-saml2-service-provider:6.4.1'
|
||||
implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5'
|
||||
//2.2.x requires rebuild of DB file.. need migration path
|
||||
runtimeOnly "com.h2database:h2:2.1.214"
|
||||
// implementation "com.h2database:h2:2.2.224"
|
||||
// Don't upgrade h2database
|
||||
runtimeOnly "com.h2database:h2:2.3.232"
|
||||
constraints {
|
||||
implementation "org.opensaml:opensaml-core"
|
||||
implementation "org.opensaml:opensaml-saml-api"
|
||||
@@ -201,12 +203,19 @@ dependencies {
|
||||
exclude group: "commons-logging", module: "commons-logging"
|
||||
}
|
||||
|
||||
// https://mvnrepository.com/artifact/technology.tabula/tabula
|
||||
implementation ('technology.tabula:tabula:1.0.5') {
|
||||
exclude group: "org.slf4j", module: "slf4j-simple"
|
||||
exclude group: "org.bouncycastle", module: "bcprov-jdk15on"
|
||||
exclude group: "com.google.code.gson", module: "gson"
|
||||
}
|
||||
|
||||
implementation 'org.apache.pdfbox:jbig2-imageio:3.0.4'
|
||||
|
||||
implementation "org.bouncycastle:bcprov-jdk18on:$bouncycastleVersion"
|
||||
implementation "org.bouncycastle:bcpkix-jdk18on:$bouncycastleVersion"
|
||||
implementation "org.springframework.boot:spring-boot-starter-actuator:$springBootVersion"
|
||||
implementation "io.micrometer:micrometer-core:1.13.6"
|
||||
implementation "io.micrometer:micrometer-core:1.14.1"
|
||||
implementation group: "com.google.zxing", name: "core", version: "3.5.3"
|
||||
// https://mvnrepository.com/artifact/org.commonmark/commonmark
|
||||
implementation "org.commonmark:commonmark:0.24.0"
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
apiVersion: v2
|
||||
appVersion: 0.31.0
|
||||
description: locally hosted web application that allows you to perform various operations
|
||||
on PDF files
|
||||
home: https://github.com/Stirling-Tools/Stirling-PDF
|
||||
keywords:
|
||||
- stirling-pdf
|
||||
- helm
|
||||
- charts repo
|
||||
maintainers:
|
||||
- name: Stirling-Tools
|
||||
url: https://github.com/Stirling-Tools/Stirling-PDF
|
||||
name: stirling-pdf-chart
|
||||
sources:
|
||||
- https://github.com/Stirling-Tools/Stirling-PDF
|
||||
version: 1.0.0
|
||||
@@ -1,30 +0,0 @@
|
||||
** Please be patient while the chart is being deployed **
|
||||
|
||||
Get the stirlingpdf URL by running:
|
||||
|
||||
{{- if contains "NodePort" .Values.service.type }}
|
||||
|
||||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "stirlingpdf.fullname" . }})
|
||||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||
echo http://$NODE_IP:$NODE_PORT/
|
||||
|
||||
{{- else if contains "LoadBalancer" .Values.service.type }}
|
||||
|
||||
** Please ensure an external IP is associated to the {{ template "stirlingpdf.fullname" . }} service before proceeding **
|
||||
** Watch the status using: kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "stirlingpdf.fullname" . }} **
|
||||
|
||||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "stirlingpdf.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
|
||||
echo http://$SERVICE_IP:{{ .Values.service.externalPort }}/
|
||||
|
||||
OR
|
||||
|
||||
export SERVICE_HOST=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "stirlingpdf.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
|
||||
echo http://$SERVICE_HOST:{{ .Values.service.externalPort }}/
|
||||
|
||||
{{- else if contains "ClusterIP" .Values.service.type }}
|
||||
|
||||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "stirlingpdf.name" . }}" -l "release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
||||
echo http://127.0.0.1:8080/
|
||||
kubectl port-forward $POD_NAME 8080:8080 --namespace {{ .Release.Namespace }}
|
||||
|
||||
{{- end }}
|
||||
@@ -1,129 +0,0 @@
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "stirlingpdf.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "stirlingpdf.fullname" -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- /*
|
||||
Create chart name and version as used by the chart label.
|
||||
|
||||
It does minimal escaping for use in Kubernetes labels.
|
||||
|
||||
Example output:
|
||||
|
||||
stirlingpdf-0.4.5
|
||||
*/ -}}
|
||||
{{- define "stirlingpdf.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "stirlingpdf.labels" -}}
|
||||
helm.sh/chart: {{ include "stirlingpdf.chart" . }}
|
||||
{{ include "stirlingpdf.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.commonLabels}}
|
||||
{{ toYaml .Values.commonLabels }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "stirlingpdf.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "stirlingpdf.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "stirlingpdf.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "stirlingpdf.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Return the proper image name to change the volume permissions
|
||||
*/}}
|
||||
{{- define "stirlingpdf.volumePermissions.image" -}}
|
||||
{{- $registryName := .Values.volumePermissions.image.registry -}}
|
||||
{{- $repositoryName := .Values.volumePermissions.image.repository -}}
|
||||
{{- $tag := .Values.volumePermissions.image.tag | toString -}}
|
||||
{{/*
|
||||
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||
but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.
|
||||
Also, we can't use a single if because lazy evaluation is not an option
|
||||
*/}}
|
||||
{{- if .Values.global }}
|
||||
{{- if .Values.global.imageRegistry }}
|
||||
{{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}}
|
||||
{{- else -}}
|
||||
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Return the proper Docker Image Registry Secret Names
|
||||
*/}}
|
||||
{{- define "stirlingpdf.imagePullSecrets" -}}
|
||||
{{/*
|
||||
Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
|
||||
but Helm 2.9 and 2.10 does not support it, so we need to implement this if-else logic.
|
||||
Also, we can not use a single if because lazy evaluation is not an option
|
||||
*/}}
|
||||
{{- if .Values.global }}
|
||||
{{- if .Values.global.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- range .Values.global.imagePullSecrets }}
|
||||
- name: {{ . }}
|
||||
{{- end }}
|
||||
{{- else if or .Values.image.pullSecrets .Values.volumePermissions.image.pullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- range .Values.image.pullSecrets }}
|
||||
- name: {{ . }}
|
||||
{{- end }}
|
||||
{{- range .Values.volumePermissions.image.pullSecrets }}
|
||||
- name: {{ . }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
{{- else if or .Values.image.pullSecrets .Values.volumePermissions.image.pullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- range .Values.image.pullSecrets }}
|
||||
- name: {{ . }}
|
||||
{{- end }}
|
||||
{{- range .Values.volumePermissions.image.pullSecrets }}
|
||||
- name: {{ . }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
@@ -1,131 +0,0 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "stirlingpdf.fullname" . }}
|
||||
{{- with .Values.deployment.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "stirlingpdf.labels" . | nindent 4 }}
|
||||
{{- if .Values.deployment.labels }}
|
||||
{{- toYaml .Values.deployment.labels | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "stirlingpdf.selectorLabels" . | nindent 6 }}
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
strategy:
|
||||
{{ toYaml .Values.strategy | indent 4 }}
|
||||
revisionHistoryLimit: 10
|
||||
template:
|
||||
metadata:
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "stirlingpdf.selectorLabels" . | nindent 8 }}
|
||||
{{- if .Values.podLabels }}
|
||||
{{- toYaml .Values.podLabels | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if .Values.priorityClassName }}
|
||||
priorityClassName: "{{ .Values.priorityClassName }}"
|
||||
{{- end }}
|
||||
{{- if .Values.securityContext.enabled }}
|
||||
securityContext:
|
||||
fsGroup: {{ .Values.securityContext.fsGroup }}
|
||||
{{- if .Values.securityContext.runAsNonRoot }}
|
||||
runAsNonRoot: {{ .Values.securityContext.runAsNonRoot }}
|
||||
{{- end }}
|
||||
{{- if .Values.securityContext.supplementalGroups }}
|
||||
supplementalGroups: {{ .Values.securityContext.supplementalGroups }}
|
||||
{{- end }}
|
||||
{{- else if .Values.persistence.enabled }}
|
||||
initContainers:
|
||||
- name: volume-permissions
|
||||
image: {{ template "stirlingpdf.volumePermissions.image" . }}
|
||||
imagePullPolicy: "{{ .Values.volumePermissions.image.pullPolicy }}"
|
||||
securityContext:
|
||||
{{- toYaml .Values.containerSecurityContext | nindent 10 }}
|
||||
command: ['sh', '-c', 'chown -R {{ .Values.securityContext.fsGroup }}:{{ .Values.securityContext.fsGroup }} {{ .Values.persistence.path }}']
|
||||
volumeMounts:
|
||||
- mountPath: {{ .Values.persistence.path }}
|
||||
name: storage-volume
|
||||
{{- end }}
|
||||
{{- include "stirlingpdf.imagePullSecrets" . | indent 6 }}
|
||||
containers:
|
||||
- name: {{ .Chart.Name }}
|
||||
image: {{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.containerSecurityContext | nindent 10 }}
|
||||
env:
|
||||
- name: SYSTEM_ROOTURIPATH
|
||||
value: {{ .Values.rootPath}}
|
||||
{{- if .Values.envs }}
|
||||
{{ toYaml .Values.envs | indent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.extraArgs }}
|
||||
args:
|
||||
{{ toYaml .Values.extraArgs | indent 8 }}
|
||||
{{- end }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: 8080
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.rootPath}}
|
||||
port: http
|
||||
{{ toYaml .Values.probes.livenessHttpGetConfig | indent 12 }}
|
||||
{{ toYaml .Values.probes.liveness | indent 10 }}
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.rootPath}}
|
||||
port: http
|
||||
{{ toYaml .Values.probes.readinessHttpGetConfig | indent 12 }}
|
||||
{{ toYaml .Values.probes.readiness | indent 10 }}
|
||||
volumeMounts:
|
||||
{{- if .Values.deployment.extraVolumeMounts }}
|
||||
{{- toYaml .Values.deployment.extraVolumeMounts | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.deployment.sidecarContainers }}
|
||||
{{- range $name, $spec := .Values.deployment.sidecarContainers }}
|
||||
- name: {{ $name }}
|
||||
{{- toYaml $spec | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.resources }}
|
||||
resources:
|
||||
{{ toYaml . | indent 10 }}
|
||||
{{- end }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{ toYaml . | indent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{ toYaml . | indent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{ toYaml . | indent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.schedulerName }}
|
||||
schedulerName: {{ .Values.schedulerName }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "stirlingpdf.serviceAccountName" . }}
|
||||
automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
|
||||
volumes:
|
||||
{{- if .Values.deployment.extraVolumes }}
|
||||
{{- toYaml .Values.deployment.extraVolumes | nindent 6 }}
|
||||
{{- end }}
|
||||
- name: storage-volume
|
||||
{{- if .Values.persistence.enabled }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ .Values.persistence.existingClaim | default (include "stirlingpdf.fullname" .) }}
|
||||
{{- else }}
|
||||
emptyDir: {}
|
||||
{{- end }}
|
||||
@@ -1,85 +0,0 @@
|
||||
{{- if .Values.ingress.enabled }}
|
||||
{{- $servicePort := .Values.service.externalPort -}}
|
||||
{{- $serviceName := include "stirlingpdf.fullname" . -}}
|
||||
{{- $ingressExtraPaths := .Values.ingress.extraPaths -}}
|
||||
---
|
||||
{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion }}
|
||||
apiVersion: extensions/v1beta1
|
||||
{{- else if semverCompare "<1.19-0" .Capabilities.KubeVersion.GitVersion }}
|
||||
apiVersion: networking.k8s.io/v1beta1
|
||||
{{- else }}
|
||||
apiVersion: networking.k8s.io/v1
|
||||
{{- end }}
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ include "stirlingpdf.fullname" . }}
|
||||
{{- with .Values.ingress.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "stirlingpdf.labels" . | nindent 4 }}
|
||||
{{- with .Values.ingress.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with .Values.ingress.ingressClassName }}
|
||||
ingressClassName: {{ . }}
|
||||
{{- end }}
|
||||
rules:
|
||||
{{- range .Values.ingress.hosts }}
|
||||
- host: {{ .name }}
|
||||
http:
|
||||
paths:
|
||||
{{- range $ingressExtraPaths }}
|
||||
- path: {{ default "/" .path | quote }}
|
||||
backend:
|
||||
{{- if semverCompare "<1.19-0" $.Capabilities.KubeVersion.GitVersion }}
|
||||
{{- if $.Values.service.servicename }}
|
||||
serviceName: {{ $.Values.service.servicename }}
|
||||
{{- else }}
|
||||
serviceName: {{ default $serviceName .service }}
|
||||
{{- end }}
|
||||
servicePort: {{ default $servicePort .port }}
|
||||
{{- else }}
|
||||
service:
|
||||
{{- if $.Values.service.servicename }}
|
||||
name: {{ $.Values.service.servicename }}
|
||||
{{- else }}
|
||||
name: {{ default $serviceName .service }}
|
||||
{{- end }}
|
||||
port:
|
||||
number: {{ default $servicePort .port }}
|
||||
pathType: {{ default $.Values.ingress.pathType .pathType }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
- path: {{ default "/" .path | quote }}
|
||||
backend:
|
||||
{{- if semverCompare "<1.19-0" $.Capabilities.KubeVersion.GitVersion }}
|
||||
{{- if $.Values.service.servicename }}
|
||||
serviceName: {{ $.Values.service.servicename }}
|
||||
{{- else }}
|
||||
serviceName: {{ default $serviceName .service }}
|
||||
{{- end }}
|
||||
servicePort: {{ default $servicePort .servicePort }}
|
||||
{{- else }}
|
||||
service:
|
||||
{{- if $.Values.service.servicename }}
|
||||
name: {{ $.Values.service.servicename }}
|
||||
{{- else }}
|
||||
name: {{ default $serviceName .service }}
|
||||
{{- end }}
|
||||
port:
|
||||
number: {{ default $servicePort .port }}
|
||||
pathType: {{ $.Values.ingress.pathType }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
tls:
|
||||
{{- range .Values.ingress.hosts }}
|
||||
{{- if .tls }}
|
||||
- hosts:
|
||||
- {{ .name }}
|
||||
secretName: {{ .tlsSecret }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
@@ -1,16 +0,0 @@
|
||||
{{- if .Values.persistence.pv.enabled -}}
|
||||
apiVersion: v1
|
||||
kind: PersistentVolume
|
||||
metadata:
|
||||
name: {{ .Values.persistence.pv.pvname | default (include "stirlingpdf.fullname" .) }}
|
||||
labels:
|
||||
{{- include "stirlingpdf.labels" . | nindent 4 }}
|
||||
spec:
|
||||
capacity:
|
||||
storage: {{ .Values.persistence.pv.capacity.storage }}
|
||||
accessModes:
|
||||
- {{ .Values.persistence.pv.accessMode | quote }}
|
||||
nfs:
|
||||
server: {{ .Values.persistence.pv.nfs.server }}
|
||||
path: {{ .Values.persistence.pv.nfs.path | quote }}
|
||||
{{- end }}
|
||||
@@ -1,27 +0,0 @@
|
||||
{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}}
|
||||
kind: PersistentVolumeClaim
|
||||
apiVersion: v1
|
||||
metadata:
|
||||
name: {{ include "stirlingpdf.fullname" . }}
|
||||
labels:
|
||||
{{- include "stirlingpdf.labels" . | nindent 4 }}
|
||||
{{- with .Values.persistence.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
accessModes:
|
||||
- {{ .Values.persistence.accessMode | quote }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.persistence.size | quote }}
|
||||
{{- if .Values.persistence.storageClass }}
|
||||
{{- if (eq "-" .Values.persistence.storageClass) }}
|
||||
storageClassName: ""
|
||||
{{- else }}
|
||||
storageClassName: "{{ .Values.persistence.storageClass }}"
|
||||
{{- end }}
|
||||
{{- if .Values.persistence.volumeName }}
|
||||
volumeName: "{{ .Values.persistence.volumeName }}"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -1,48 +0,0 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ .Values.service.servicename | default (include "stirlingpdf.fullname" .) }}
|
||||
{{- with .Values.service.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "stirlingpdf.labels" . | nindent 4 }}
|
||||
{{- with .Values.service.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
type: {{ .Values.service.type }}
|
||||
{{- if (or (eq .Values.service.type "LoadBalancer") (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort)))) }}
|
||||
externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy }}
|
||||
{{- end }}
|
||||
{{- if (and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerIP) }}
|
||||
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
|
||||
{{- end }}
|
||||
{{- if (and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerSourceRanges) }}
|
||||
loadBalancerSourceRanges:
|
||||
{{- with .Values.service.loadBalancerSourceRanges }}
|
||||
{{ toYaml . | indent 2 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if eq .Values.service.type "ClusterIP" }}
|
||||
{{- if .Values.service.clusterIP }}
|
||||
clusterIP: {{ .Values.service.clusterIP }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
ports:
|
||||
- port: {{ .Values.service.externalPort }}
|
||||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }}
|
||||
nodePort: {{.Values.service.nodePort}}
|
||||
{{- end }}
|
||||
{{- if .Values.service.targetPort }}
|
||||
targetPort: {{ .Values.service.targetPort }}
|
||||
name: {{ .Values.service.targetPort }}
|
||||
{{- else }}
|
||||
targetPort: http
|
||||
name: http
|
||||
{{- end }}
|
||||
protocol: TCP
|
||||
|
||||
selector:
|
||||
{{- include "stirlingpdf.selectorLabels" . | nindent 4 }}
|
||||
@@ -1,13 +0,0 @@
|
||||
{{- if .Values.serviceAccount.create -}}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ include "stirlingpdf.serviceAccountName" . }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{ toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "stirlingpdf.labels" . | nindent 4 }}
|
||||
{{- end }}
|
||||
@@ -1,31 +0,0 @@
|
||||
{{- if and ( .Capabilities.APIVersions.Has "monitoring.coreos.com/v1" ) ( .Values.serviceMonitor.enabled ) }}
|
||||
apiVersion: monitoring.coreos.com/v1
|
||||
kind: ServiceMonitor
|
||||
metadata:
|
||||
name: {{ include "stirlingpdf.fullname" . }}
|
||||
namespace: {{ .Values.serviceMonitor.namespace | default .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "stirlingpdf.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceMonitor.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
endpoints:
|
||||
- targetPort: 8080
|
||||
{{- if .Values.serviceMonitor.interval }}
|
||||
interval: {{ .Values.serviceMonitor.interval }}
|
||||
{{- end }}
|
||||
{{- if .Values.serviceMonitor.metricsPath }}
|
||||
path: {{ .Values.serviceMonitor.metricsPath }}
|
||||
{{- end }}
|
||||
{{- if .Values.serviceMonitor.timeout }}
|
||||
scrapeTimeout: {{ .Values.serviceMonitor.timeout }}
|
||||
{{- end }}
|
||||
jobLabel: {{ include "stirlingpdf.fullname" . }}
|
||||
namespaceSelector:
|
||||
matchNames:
|
||||
- {{ .Release.Namespace }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "stirlingpdf.selectorLabels" . | nindent 6 }}
|
||||
{{- end }}
|
||||
@@ -1,240 +0,0 @@
|
||||
extraArgs: []
|
||||
# - --storage-timestamp-tolerance 1s
|
||||
replicaCount: 1
|
||||
strategy:
|
||||
type: RollingUpdate
|
||||
image:
|
||||
repository: frooodle/s-pdf
|
||||
# took Chart appVersion by default
|
||||
tag: ~
|
||||
pullPolicy: IfNotPresent
|
||||
secret:
|
||||
labels: {}
|
||||
## Labels to apply to all resources
|
||||
##
|
||||
commonLabels: {}
|
||||
# team_name: dev
|
||||
|
||||
# rootpath for the application
|
||||
rootPath: /
|
||||
|
||||
envs: []
|
||||
# - name: UI_APP_NAME
|
||||
# value: "Stirling PDF"
|
||||
# - name: UI_HOME_DESCRIPTION
|
||||
# value: "Your locally hosted one-stop-shop for all your PDF needs."
|
||||
# - name: UI_APP_NAVBAR_NAME
|
||||
# value: "Stirling PDF"
|
||||
# - name: ALLOW_GOOGLE_VISIBILITY
|
||||
# value: "true"
|
||||
# - name: APP_LOCALE
|
||||
# value: "en_GB"
|
||||
|
||||
deployment:
|
||||
## stirling-pdf Deployment annotations
|
||||
annotations: {}
|
||||
# name: value
|
||||
labels: {}
|
||||
# name: value
|
||||
# additional volumes
|
||||
extraVolumes: []
|
||||
# - name: nginx-config
|
||||
# secret:
|
||||
# secretName: nginx-config
|
||||
# additional volumes to mount
|
||||
extraVolumeMounts: []
|
||||
## sidecarContainers for the stirling-pdf
|
||||
# Can be used to add a proxy to the pod that does
|
||||
# scanning for secrets, signing, authentication, validation
|
||||
# of the chart's content, send notifications...
|
||||
sidecarContainers: {}
|
||||
## Example sidecarContainer which uses an extraVolume from above and
|
||||
## a named port that can be referenced in the service as targetPort.
|
||||
# proxy:
|
||||
# image: nginx:latest
|
||||
# ports:
|
||||
# - name: proxy
|
||||
# containerPort: 8081
|
||||
# volumeMounts:
|
||||
# - name: nginx-config
|
||||
# readOnly: true
|
||||
# mountPath: /etc/nginx
|
||||
|
||||
## Pod annotations
|
||||
## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
|
||||
## Read more about kube2iam to provide access to s3 https://github.com/jtblin/kube2iam
|
||||
##
|
||||
podAnnotations: {}
|
||||
# iam.amazonaws.com/role: role-arn
|
||||
|
||||
## Pod labels
|
||||
## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
|
||||
podLabels: {}
|
||||
# name: value
|
||||
|
||||
service:
|
||||
servicename:
|
||||
type: ClusterIP
|
||||
externalTrafficPolicy: Local
|
||||
## Uses pre-assigned IP address from cloud provider
|
||||
## Only valid if service.type: LoadBalancer
|
||||
loadBalancerIP:
|
||||
## Limits which cidr blocks can connect to service's load balancer
|
||||
## Only valid if service.type: LoadBalancer
|
||||
loadBalancerSourceRanges: []
|
||||
# clusterIP: None
|
||||
externalPort: 8080
|
||||
## targetPort of the container to use. If a sidecar should handle the
|
||||
## requests first, use the named port from the sidecar. See sidecar example
|
||||
## from deployment above. Leave empty to use stirling-pdf directly.
|
||||
targetPort:
|
||||
nodePort:
|
||||
annotations: {}
|
||||
labels: {}
|
||||
|
||||
serviceMonitor:
|
||||
enabled: false
|
||||
# namespace: prometheus
|
||||
labels: {}
|
||||
metricsPath: "/metrics"
|
||||
# timeout: 60
|
||||
# interval: 60
|
||||
|
||||
resources: {}
|
||||
# limits:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
# requests:
|
||||
# cpu: 80m
|
||||
# memory: 64Mi
|
||||
|
||||
probes:
|
||||
liveness:
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 1
|
||||
successThreshold: 1
|
||||
failureThreshold: 3
|
||||
livenessHttpGetConfig:
|
||||
scheme: HTTP
|
||||
readiness:
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 1
|
||||
successThreshold: 1
|
||||
failureThreshold: 3
|
||||
readinessHttpGetConfig:
|
||||
scheme: HTTP
|
||||
|
||||
serviceAccount:
|
||||
create: true
|
||||
name: ""
|
||||
automountServiceAccountToken: false
|
||||
## Annotations for the Service Account
|
||||
annotations: {}
|
||||
|
||||
# UID/GID 1000 is the default user "stirling-pdf" used in
|
||||
# the container image starting in v0.8.0 and above. This
|
||||
# is required for local persistent storage. If your cluster
|
||||
# does not allow this, try setting securityContext: {}
|
||||
securityContext:
|
||||
enabled: true
|
||||
fsGroup: 1000
|
||||
## Optionally, specify supplementalGroups and/or
|
||||
## runAsNonRoot for security purposes
|
||||
# runAsNonRoot: true
|
||||
# supplementalGroups: [1000]
|
||||
|
||||
containerSecurityContext: {}
|
||||
|
||||
priorityClassName: ""
|
||||
|
||||
nodeSelector: {}
|
||||
|
||||
tolerations: []
|
||||
|
||||
affinity: {}
|
||||
|
||||
persistence:
|
||||
enabled: false
|
||||
accessMode: ReadWriteOnce
|
||||
size: 8Gi
|
||||
labels: {}
|
||||
# name: value
|
||||
path: /tmp
|
||||
## A manually managed Persistent Volume and Claim
|
||||
## Requires persistence.enabled: true
|
||||
## If defined, PVC must be created manually before volume will be bound
|
||||
# existingClaim:
|
||||
|
||||
## stirling-pdf data Persistent Volume Storage Class
|
||||
## If defined, storageClassName: <storageClass>
|
||||
## If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||
## If undefined (the default) or set to null, no storageClassName spec is
|
||||
## set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||
## GKE, AWS & OpenStack)
|
||||
##
|
||||
# storageClass: "-"
|
||||
# volumeName:
|
||||
pv:
|
||||
enabled: false
|
||||
pvname:
|
||||
capacity:
|
||||
storage: 8Gi
|
||||
accessMode: ReadWriteOnce
|
||||
nfs:
|
||||
server:
|
||||
path:
|
||||
|
||||
## Init containers parameters:
|
||||
## volumePermissions: Change the owner of the persistent volume mountpoint to RunAsUser:fsGroup
|
||||
##
|
||||
volumePermissions:
|
||||
image:
|
||||
registry: docker.io
|
||||
repository: bitnami/minideb
|
||||
tag: buster
|
||||
pullPolicy: Always
|
||||
## Optionally specify an array of imagePullSecrets.
|
||||
## Secrets must be manually created in the namespace.
|
||||
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||
##
|
||||
# pullSecrets:
|
||||
# - myRegistryKeySecretName
|
||||
|
||||
## Ingress for load balancer
|
||||
ingress:
|
||||
enabled: false
|
||||
pathType: "ImplementationSpecific"
|
||||
## stirling-pdf Ingress labels
|
||||
##
|
||||
labels: {}
|
||||
# dns: "route53"
|
||||
|
||||
## stirling-pdf Ingress annotations
|
||||
##
|
||||
annotations: {}
|
||||
# kubernetes.io/ingress.class: nginx
|
||||
# kubernetes.io/tls-acme: "true"
|
||||
|
||||
## stirling-pdf Ingress hostnames
|
||||
## Must be provided if Ingress is enabled
|
||||
##
|
||||
hosts: []
|
||||
# - name: stirling-pdf.domain1.com
|
||||
# path: /
|
||||
# tls: false
|
||||
# - name: stirling-pdf.domain2.com
|
||||
# path: /
|
||||
#
|
||||
# ## Set this to true in order to enable TLS on the ingress record
|
||||
# tls: true
|
||||
#
|
||||
# ## If TLS is set to true, you must declare what secret will store the key/certificate for TLS
|
||||
# ## Secrets must be added manually to the namespace
|
||||
# tlsSecret: stirling-pdf.domain2-tls
|
||||
|
||||
# For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName
|
||||
# See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress
|
||||
ingressClassName:
|
||||
|
||||
@@ -145,7 +145,7 @@ Feature: API Validation
|
||||
And the response file should have extension ".pdf"
|
||||
And the response file should have size greater than 100
|
||||
|
||||
@compress @ghostscript @positive
|
||||
@compress @qpdf @positive
|
||||
Scenario: Compress
|
||||
Given I use an example file at "exampleFiles/ghost3.pdf" as parameter "fileInput"
|
||||
And the request data includes
|
||||
@@ -156,7 +156,7 @@ Feature: API Validation
|
||||
And the response file should have extension ".pdf"
|
||||
And the response file should have size greater than 100
|
||||
|
||||
@compress @ghostscript @positive
|
||||
@compress @qpdf @positive
|
||||
Scenario: Compress
|
||||
Given I use an example file at "exampleFiles/ghost2.pdf" as parameter "fileInput"
|
||||
And the request data includes
|
||||
@@ -169,7 +169,7 @@ Feature: API Validation
|
||||
And the response file should have size greater than 100
|
||||
|
||||
|
||||
@compress @ghostscript @positive
|
||||
@compress @qpdf @positive
|
||||
Scenario: Compress
|
||||
Given I use an example file at "exampleFiles/ghost1.pdf" as parameter "fileInput"
|
||||
And the request data includes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
services:
|
||||
stirling-pdf:
|
||||
container_name: Stirling-PDF-Security-Fat
|
||||
image: frooodle/s-pdf:latest-fat
|
||||
image: stirlingtools/stirling-pdf:latest-fat
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
services:
|
||||
stirling-pdf:
|
||||
container_name: Stirling-PDF-Security
|
||||
image: frooodle/s-pdf:latest
|
||||
image: stirlingtools/stirling-pdf:latest
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
services:
|
||||
stirling-pdf:
|
||||
container_name: Stirling-PDF-Security
|
||||
image: frooodle/s-pdf:latest
|
||||
image: stirlingtools/stirling-pdf:latest
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
services:
|
||||
stirling-pdf:
|
||||
container_name: Stirling-PDF-Ultra-Lite-Security
|
||||
image: frooodle/s-pdf:latest-ultra-lite
|
||||
image: stirlingtools/stirling-pdf:latest-ultra-lite
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
services:
|
||||
stirling-pdf:
|
||||
container_name: Stirling-PDF-Ultra-Lite
|
||||
image: frooodle/s-pdf:latest-ultra-lite
|
||||
image: stirlingtools/stirling-pdf:latest-ultra-lite
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
services:
|
||||
stirling-pdf:
|
||||
container_name: Stirling-PDF
|
||||
image: frooodle/s-pdf:latest
|
||||
image: stirlingtools/stirling-pdf:latest
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
|
||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
@@ -3,6 +3,11 @@ ignore = [
|
||||
'language.direction',
|
||||
]
|
||||
|
||||
[az_AZ]
|
||||
ignore = [
|
||||
'language.direction',
|
||||
]
|
||||
|
||||
[bg_BG]
|
||||
ignore = [
|
||||
'language.direction',
|
||||
@@ -13,13 +18,11 @@ ignore = [
|
||||
'PDFToText.tags',
|
||||
'adminUserSettings.admin',
|
||||
'language.direction',
|
||||
'survey.button',
|
||||
'watermark.type.1',
|
||||
]
|
||||
|
||||
[cs_CZ]
|
||||
ignore = [
|
||||
'info',
|
||||
'language.direction',
|
||||
'pipeline.header',
|
||||
'text',
|
||||
@@ -39,10 +42,12 @@ ignore = [
|
||||
'addPageNumbers.selectText.3',
|
||||
'alphabet',
|
||||
'certSign.name',
|
||||
'home.pipeline.title',
|
||||
'language.direction',
|
||||
'licenses.version',
|
||||
'pipeline.title',
|
||||
'pipelineOptions.pipelineHeader',
|
||||
'pro',
|
||||
'sponsor',
|
||||
'text',
|
||||
'watermark.type.1',
|
||||
@@ -79,7 +84,6 @@ ignore = [
|
||||
'alphabet',
|
||||
'compare.document.1',
|
||||
'compare.document.2',
|
||||
'info',
|
||||
'language.direction',
|
||||
'licenses.license',
|
||||
'licenses.module',
|
||||
@@ -87,8 +91,6 @@ ignore = [
|
||||
'licenses.version',
|
||||
'pdfOrganiser.mode',
|
||||
'pipeline.title',
|
||||
'pipelineOptions.pipelineHeader',
|
||||
'sponsor',
|
||||
'watermark.type.2',
|
||||
]
|
||||
|
||||
@@ -105,11 +107,8 @@ ignore = [
|
||||
[hr_HR]
|
||||
ignore = [
|
||||
'PDFToBook.selectText.1',
|
||||
'font',
|
||||
'home.pipeline.title',
|
||||
'info',
|
||||
'language.direction',
|
||||
'pdfOrganiser.tags',
|
||||
'showJS.tags',
|
||||
]
|
||||
|
||||
@@ -125,7 +124,6 @@ ignore = [
|
||||
|
||||
[it_IT]
|
||||
ignore = [
|
||||
'font',
|
||||
'language.direction',
|
||||
'no',
|
||||
'password',
|
||||
@@ -148,18 +146,10 @@ ignore = [
|
||||
|
||||
[nl_NL]
|
||||
ignore = [
|
||||
'HTMLToPDF.print',
|
||||
'adjustContrast.contrast',
|
||||
'compare.document.1',
|
||||
'compare.document.2',
|
||||
'error',
|
||||
'getPdfInfo.downloadJson',
|
||||
'help',
|
||||
'info',
|
||||
'language.direction',
|
||||
'navbar.allTools',
|
||||
'printFile.submit',
|
||||
'showJS.downloadJS',
|
||||
'sponsor',
|
||||
]
|
||||
|
||||
@@ -181,7 +171,6 @@ ignore = [
|
||||
|
||||
[pt_BR]
|
||||
ignore = [
|
||||
'changeMetadata.trapped',
|
||||
'language.direction',
|
||||
'pipelineOptions.pipelineHeader',
|
||||
]
|
||||
@@ -227,7 +216,6 @@ ignore = [
|
||||
[th_TH]
|
||||
ignore = [
|
||||
'language.direction',
|
||||
'pipeline.title',
|
||||
'pipelineOptions.pipelineHeader',
|
||||
'showJS.tags',
|
||||
]
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#!/bin/bash
|
||||
|
||||
translation_key="pdfToPDFA.credit"
|
||||
old_value="OCRmyPDF"
|
||||
new_value="ghostscript"
|
||||
old_value="qpdf"
|
||||
new_value="liibreoffice"
|
||||
|
||||
for file in ../src/main/resources/messages_*.properties; do
|
||||
sed -i "/^$translation_key=/s/$old_value/$new_value/" "$file"
|
||||
|
||||
@@ -117,7 +117,6 @@ public class EndpointConfiguration {
|
||||
addEndpointToGroup("Convert", "img-to-pdf");
|
||||
addEndpointToGroup("Convert", "pdf-to-pdfa");
|
||||
addEndpointToGroup("Convert", "file-to-pdf");
|
||||
addEndpointToGroup("Convert", "xlsx-to-pdf");
|
||||
addEndpointToGroup("Convert", "pdf-to-word");
|
||||
addEndpointToGroup("Convert", "pdf-to-presentation");
|
||||
addEndpointToGroup("Convert", "pdf-to-text");
|
||||
@@ -163,7 +162,6 @@ public class EndpointConfiguration {
|
||||
addEndpointToGroup("CLI", "repair");
|
||||
addEndpointToGroup("CLI", "pdf-to-pdfa");
|
||||
addEndpointToGroup("CLI", "file-to-pdf");
|
||||
addEndpointToGroup("CLI", "xlsx-to-pdf");
|
||||
addEndpointToGroup("CLI", "pdf-to-word");
|
||||
addEndpointToGroup("CLI", "pdf-to-presentation");
|
||||
addEndpointToGroup("CLI", "pdf-to-html");
|
||||
@@ -184,24 +182,28 @@ public class EndpointConfiguration {
|
||||
addEndpointToGroup("Python", "html-to-pdf");
|
||||
addEndpointToGroup("Python", "url-to-pdf");
|
||||
addEndpointToGroup("Python", "pdf-to-img");
|
||||
addEndpointToGroup("Python", "file-to-pdf");
|
||||
|
||||
// openCV
|
||||
addEndpointToGroup("OpenCV", "extract-image-scans");
|
||||
|
||||
// LibreOffice
|
||||
addEndpointToGroup("LibreOffice", "repair");
|
||||
addEndpointToGroup("qpdf", "repair");
|
||||
addEndpointToGroup("LibreOffice", "file-to-pdf");
|
||||
addEndpointToGroup("LibreOffice", "xlsx-to-pdf");
|
||||
addEndpointToGroup("LibreOffice", "pdf-to-word");
|
||||
addEndpointToGroup("LibreOffice", "pdf-to-presentation");
|
||||
addEndpointToGroup("LibreOffice", "pdf-to-rtf");
|
||||
addEndpointToGroup("LibreOffice", "pdf-to-html");
|
||||
addEndpointToGroup("LibreOffice", "pdf-to-xml");
|
||||
|
||||
// OCRmyPDF
|
||||
addEndpointToGroup("OCRmyPDF", "compress-pdf");
|
||||
addEndpointToGroup("OCRmyPDF", "pdf-to-pdfa");
|
||||
addEndpointToGroup("OCRmyPDF", "ocr-pdf");
|
||||
// Unoconv
|
||||
addEndpointToGroup("Unoconv", "file-to-pdf");
|
||||
|
||||
// qpdf
|
||||
addEndpointToGroup("qpdf", "compress-pdf");
|
||||
addEndpointToGroup("qpdf", "pdf-to-pdfa");
|
||||
|
||||
addEndpointToGroup("tesseract", "ocr-pdf");
|
||||
|
||||
// Java
|
||||
addEndpointToGroup("Java", "merge-pdfs");
|
||||
@@ -247,9 +249,10 @@ public class EndpointConfiguration {
|
||||
addEndpointToGroup("Javascript", "compare");
|
||||
addEndpointToGroup("Javascript", "adjust-contrast");
|
||||
|
||||
// Ghostscript dependent endpoints
|
||||
addEndpointToGroup("Ghostscript", "compress-pdf");
|
||||
addEndpointToGroup("Ghostscript", "pdf-to-pdfa");
|
||||
// qpdf dependent endpoints
|
||||
addEndpointToGroup("qpdf", "compress-pdf");
|
||||
addEndpointToGroup("qpdf", "pdf-to-pdfa");
|
||||
addEndpointToGroup("qpdf", "repair");
|
||||
|
||||
// Weasyprint dependent endpoints
|
||||
addEndpointToGroup("Weasyprint", "html-to-pdf");
|
||||
|
||||
@@ -37,11 +37,13 @@ public class ExternalAppDepConfig {
|
||||
private final Map<String, List<String>> commandToGroupMapping =
|
||||
new HashMap<>() {
|
||||
{
|
||||
put("gs", List.of("Ghostscript"));
|
||||
put("soffice", List.of("LibreOffice"));
|
||||
put("ocrmypdf", List.of("OCRmyPDF"));
|
||||
put("weasyprint", List.of("Weasyprint"));
|
||||
put("pdftohtml", List.of("Pdftohtml"));
|
||||
put("unoconv", List.of("Unoconv"));
|
||||
put("qpdf", List.of("qpdf"));
|
||||
put("tesseract", List.of("tesseract"));
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
@@ -96,11 +98,12 @@ public class ExternalAppDepConfig {
|
||||
public void checkDependencies() {
|
||||
|
||||
// Check core dependencies
|
||||
checkDependencyAndDisableGroup("gs");
|
||||
checkDependencyAndDisableGroup("tesseract");
|
||||
checkDependencyAndDisableGroup("soffice");
|
||||
checkDependencyAndDisableGroup("ocrmypdf");
|
||||
checkDependencyAndDisableGroup("qpdf");
|
||||
checkDependencyAndDisableGroup("weasyprint");
|
||||
checkDependencyAndDisableGroup("pdftohtml");
|
||||
checkDependencyAndDisableGroup("unoconv");
|
||||
|
||||
// Special handling for Python/OpenCV dependencies
|
||||
boolean pythonAvailable = isCommandAvailable("python3") || isCommandAvailable("python");
|
||||
|
||||
@@ -156,10 +156,14 @@ public class SecurityConfiguration {
|
||||
http.rememberMe(
|
||||
rememberMeConfigurer ->
|
||||
rememberMeConfigurer // Use the configurator directly
|
||||
.key("uniqueAndSecret")
|
||||
.tokenRepository(persistentTokenRepository())
|
||||
.tokenValiditySeconds(1209600) // 2 weeks
|
||||
);
|
||||
.tokenValiditySeconds(14 * 24 * 60 * 60) // 14 days
|
||||
.userDetailsService(
|
||||
userDetailsService) // Your existing UserDetailsService
|
||||
.useSecureCookie(true) // Enable secure cookie
|
||||
.rememberMeParameter("remember-me") // Form parameter name
|
||||
.rememberMeCookieName("remember-me") // Cookie name
|
||||
.alwaysRemember(false));
|
||||
http.authorizeHttpRequests(
|
||||
authz ->
|
||||
authz.requestMatchers(
|
||||
@@ -448,7 +452,7 @@ public class SecurityConfiguration {
|
||||
RelyingPartyRegistration rp =
|
||||
RelyingPartyRegistration.withRegistrationId(samlConf.getRegistrationId())
|
||||
.signingX509Credentials((c) -> c.add(signingCredential))
|
||||
.assertingPartyDetails(
|
||||
.assertingPartyMetadata(
|
||||
(details) ->
|
||||
details.entityId(samlConf.getIdpIssuer())
|
||||
.singleSignOnServiceLocation(
|
||||
|
||||
@@ -19,10 +19,12 @@ import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.security.oauth2.core.user.OAuth2User;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import stirling.software.SPDF.config.interfaces.DatabaseBackupInterface;
|
||||
import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal;
|
||||
import stirling.software.SPDF.config.security.session.SessionPersistentRegistry;
|
||||
import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface;
|
||||
import stirling.software.SPDF.model.ApplicationProperties;
|
||||
import stirling.software.SPDF.model.AuthenticationType;
|
||||
import stirling.software.SPDF.model.Authority;
|
||||
import stirling.software.SPDF.model.Role;
|
||||
@@ -31,6 +33,7 @@ import stirling.software.SPDF.repository.AuthorityRepository;
|
||||
import stirling.software.SPDF.repository.UserRepository;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class UserService implements UserServiceInterface {
|
||||
|
||||
@Autowired private UserRepository userRepository;
|
||||
@@ -45,6 +48,8 @@ public class UserService implements UserServiceInterface {
|
||||
|
||||
@Autowired DatabaseBackupInterface databaseBackupHelper;
|
||||
|
||||
@Autowired ApplicationProperties applicationProperties;
|
||||
|
||||
// Handle OAUTH2 login and user auto creation.
|
||||
public boolean processOAuth2PostLogin(String username, boolean autoCreateUser)
|
||||
throws IllegalArgumentException, IOException {
|
||||
@@ -299,7 +304,13 @@ public class UserService implements UserServiceInterface {
|
||||
boolean isValidEmail =
|
||||
username.matches(
|
||||
"^(?=.{1,64}@)[A-Za-z0-9]+(\\.[A-Za-z0-9_+.-]+)*@[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$");
|
||||
return isValidSimpleUsername || isValidEmail;
|
||||
|
||||
List<String> notAllowedUserList = new ArrayList<>();
|
||||
notAllowedUserList.add("ALL_USERS".toLowerCase());
|
||||
|
||||
boolean notAllowedUser = notAllowedUserList.contains(username.toLowerCase());
|
||||
|
||||
return (isValidSimpleUsername || isValidEmail) && !notAllowedUser;
|
||||
}
|
||||
|
||||
private String getInvalidUsernameMessage() {
|
||||
@@ -354,6 +365,14 @@ public class UserService implements UserServiceInterface {
|
||||
|
||||
if (principal instanceof UserDetails) {
|
||||
return ((UserDetails) principal).getUsername();
|
||||
} else if (principal instanceof OAuth2User) {
|
||||
return ((OAuth2User) principal)
|
||||
.getAttribute(
|
||||
applicationProperties.getSecurity().getOauth2().getUseAsUsername());
|
||||
} else if (principal instanceof CustomSaml2AuthenticatedPrincipal) {
|
||||
return ((CustomSaml2AuthenticatedPrincipal) principal).getName();
|
||||
} else if (principal instanceof String) {
|
||||
return (String) principal;
|
||||
} else {
|
||||
return principal.toString();
|
||||
}
|
||||
|
||||
@@ -34,6 +34,12 @@ public class DatabaseBackupHelper implements DatabaseBackupInterface {
|
||||
@Value("${spring.datasource.url}")
|
||||
private String url;
|
||||
|
||||
@Value("${spring.datasource.username}")
|
||||
private String databaseUsername;
|
||||
|
||||
@Value("${spring.datasource.password}")
|
||||
private String databasePassword;
|
||||
|
||||
private Path backupPath = Paths.get("configs/db/backup/");
|
||||
|
||||
@Override
|
||||
@@ -134,7 +140,8 @@ public class DatabaseBackupHelper implements DatabaseBackupInterface {
|
||||
this.getBackupFilePath("backup_" + dateNow.format(myFormatObj) + ".sql");
|
||||
String query = "SCRIPT SIMPLE COLUMNS DROP to ?;";
|
||||
|
||||
try (Connection conn = DriverManager.getConnection(url, "sa", "");
|
||||
try (Connection conn =
|
||||
DriverManager.getConnection(url, databaseUsername, databasePassword);
|
||||
PreparedStatement stmt = conn.prepareStatement(query)) {
|
||||
stmt.setString(1, insertOutputFilePath.toString());
|
||||
stmt.execute();
|
||||
@@ -147,7 +154,8 @@ public class DatabaseBackupHelper implements DatabaseBackupInterface {
|
||||
// Retrieves the H2 database version.
|
||||
public String getH2Version() {
|
||||
String version = "Unknown";
|
||||
try (Connection conn = DriverManager.getConnection(url, "sa", "")) {
|
||||
try (Connection conn =
|
||||
DriverManager.getConnection(url, databaseUsername, databasePassword)) {
|
||||
try (Statement stmt = conn.createStatement();
|
||||
ResultSet rs = stmt.executeQuery("SELECT H2VERSION() AS version")) {
|
||||
if (rs.next()) {
|
||||
@@ -189,7 +197,8 @@ public class DatabaseBackupHelper implements DatabaseBackupInterface {
|
||||
private boolean executeDatabaseScript(Path scriptPath) {
|
||||
String query = "RUNSCRIPT from ?;";
|
||||
|
||||
try (Connection conn = DriverManager.getConnection(url, "sa", "");
|
||||
try (Connection conn =
|
||||
DriverManager.getConnection(url, databaseUsername, databasePassword);
|
||||
PreparedStatement stmt = conn.prepareStatement(query)) {
|
||||
stmt.setString(1, scriptPath.toString());
|
||||
stmt.execute();
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
package stirling.software.SPDF.controller.api;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Hidden;
|
||||
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import stirling.software.SPDF.service.LanguageService;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/js")
|
||||
public class AdditionalLanguageJsController {
|
||||
|
||||
@Autowired private LanguageService languageService;
|
||||
|
||||
@Hidden
|
||||
@GetMapping(value = "/additionalLanguageCode.js", produces = "application/javascript")
|
||||
public void generateAdditionalLanguageJs(HttpServletResponse response) throws IOException {
|
||||
List<String> supportedLanguages = languageService.getSupportedLanguages();
|
||||
|
||||
response.setContentType("application/javascript");
|
||||
PrintWriter writer = response.getWriter();
|
||||
|
||||
// Erstelle das JavaScript dynamisch
|
||||
writer.println("const supportedLanguages = " + toJsonArray(supportedLanguages) + ";");
|
||||
|
||||
// Generiere die `getDetailedLanguageCode`-Funktion
|
||||
writer.println(
|
||||
"""
|
||||
function getDetailedLanguageCode() {
|
||||
const userLanguages = navigator.languages ? navigator.languages : [navigator.language];
|
||||
for (let lang of userLanguages) {
|
||||
let matchedLang = supportedLanguages.find(supportedLang => supportedLang.startsWith(lang.replace('-', '_')));
|
||||
if (matchedLang) {
|
||||
return matchedLang;
|
||||
}
|
||||
}
|
||||
// Fallback
|
||||
return "en_GB";
|
||||
}
|
||||
""");
|
||||
|
||||
writer.flush();
|
||||
}
|
||||
|
||||
// Hilfsfunktion zum Konvertieren der Liste in ein JSON-Array
|
||||
private String toJsonArray(List<String> list) {
|
||||
StringBuilder jsonArray = new StringBuilder("[");
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
jsonArray.append("\"").append(list.get(i)).append("\"");
|
||||
if (i < list.size() - 1) {
|
||||
jsonArray.append(",");
|
||||
}
|
||||
}
|
||||
jsonArray.append("]");
|
||||
return jsonArray.toString();
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,13 @@
|
||||
package stirling.software.SPDF.controller.api.converters;
|
||||
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.File;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.http.MediaType;
|
||||
@@ -37,59 +38,90 @@ public class ConvertPDFToPDFA {
|
||||
@Operation(
|
||||
summary = "Convert a PDF to a PDF/A",
|
||||
description =
|
||||
"This endpoint converts a PDF file to a PDF/A file. PDF/A is a format designed for long-term archiving of digital documents. Input:PDF Output:PDF Type:SISO")
|
||||
"This endpoint converts a PDF file to a PDF/A file using LibreOffice. PDF/A is a format designed for long-term archiving of digital documents. Input:PDF Output:PDF Type:SISO")
|
||||
public ResponseEntity<byte[]> pdfToPdfA(@ModelAttribute PdfToPdfARequest request)
|
||||
throws Exception {
|
||||
MultipartFile inputFile = request.getFileInput();
|
||||
String outputFormat = request.getOutputFormat();
|
||||
|
||||
// Convert MultipartFile to byte[]
|
||||
byte[] pdfBytes = inputFile.getBytes();
|
||||
|
||||
// Save the uploaded file to a temporary location
|
||||
Path tempInputFile = Files.createTempFile("input_", ".pdf");
|
||||
try (OutputStream outputStream = new FileOutputStream(tempInputFile.toFile())) {
|
||||
outputStream.write(pdfBytes);
|
||||
// Validate input file type
|
||||
if (!"application/pdf".equals(inputFile.getContentType())) {
|
||||
logger.error("Invalid input file type: {}", inputFile.getContentType());
|
||||
throw new IllegalArgumentException("Input file must be a PDF");
|
||||
}
|
||||
|
||||
// Prepare the output file path
|
||||
Path tempOutputFile = Files.createTempFile("output_", ".pdf");
|
||||
|
||||
// Prepare the ghostscript command
|
||||
List<String> command = new ArrayList<>();
|
||||
command.add("gs");
|
||||
command.add("-dPDFA=" + ("pdfa".equals(outputFormat) ? "2" : "1"));
|
||||
command.add("-dNOPAUSE");
|
||||
command.add("-dBATCH");
|
||||
command.add("-sColorConversionStrategy=sRGB");
|
||||
command.add("-sDEVICE=pdfwrite");
|
||||
command.add("-dPDFACompatibilityPolicy=2");
|
||||
command.add("-o");
|
||||
command.add(tempOutputFile.toString());
|
||||
command.add(tempInputFile.toString());
|
||||
|
||||
ProcessExecutorResult returnCode =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT)
|
||||
.runCommandWithOutputHandling(command);
|
||||
|
||||
if (returnCode.getRc() != 0) {
|
||||
logger.info(
|
||||
outputFormat + " conversion failed with return code: " + returnCode.getRc());
|
||||
// Get the original filename without extension
|
||||
String originalFileName = Filenames.toSimpleFileName(inputFile.getOriginalFilename());
|
||||
if (originalFileName == null || originalFileName.trim().isEmpty()) {
|
||||
originalFileName = "output.pdf";
|
||||
}
|
||||
String baseFileName =
|
||||
originalFileName.contains(".")
|
||||
? originalFileName.substring(0, originalFileName.lastIndexOf('.'))
|
||||
: originalFileName;
|
||||
|
||||
Path tempInputFile = null;
|
||||
Path tempOutputDir = null;
|
||||
byte[] fileBytes;
|
||||
|
||||
try {
|
||||
byte[] pdfBytesOutput = Files.readAllBytes(tempOutputFile);
|
||||
// Return the optimized PDF as a response
|
||||
String outputFilename =
|
||||
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
|
||||
.replaceFirst("[.][^.]+$", "")
|
||||
+ "_PDFA.pdf";
|
||||
// Save uploaded file to temp location
|
||||
tempInputFile = Files.createTempFile("input_", ".pdf");
|
||||
inputFile.transferTo(tempInputFile);
|
||||
|
||||
// Create temp output directory
|
||||
tempOutputDir = Files.createTempDirectory("output_");
|
||||
|
||||
// Determine PDF/A filter based on requested format
|
||||
String pdfFilter =
|
||||
"pdfa".equals(outputFormat)
|
||||
? "writer_pdf_Export:{'SelectPdfVersion':{'Value':'2'}}:writer_pdf_Export"
|
||||
: "writer_pdf_Export:{'SelectPdfVersion':{'Value':'1'}}:writer_pdf_Export";
|
||||
|
||||
// Prepare LibreOffice command
|
||||
List<String> command =
|
||||
new ArrayList<>(
|
||||
Arrays.asList(
|
||||
"soffice",
|
||||
"--headless",
|
||||
"--nologo",
|
||||
"--convert-to",
|
||||
"pdf:" + pdfFilter,
|
||||
"--outdir",
|
||||
tempOutputDir.toString(),
|
||||
tempInputFile.toString()));
|
||||
|
||||
ProcessExecutorResult returnCode =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.LIBRE_OFFICE)
|
||||
.runCommandWithOutputHandling(command);
|
||||
|
||||
if (returnCode.getRc() != 0) {
|
||||
logger.error("PDF/A conversion failed with return code: {}", returnCode.getRc());
|
||||
throw new RuntimeException("PDF/A conversion failed");
|
||||
}
|
||||
|
||||
// Get the output file
|
||||
File[] outputFiles = tempOutputDir.toFile().listFiles();
|
||||
if (outputFiles == null || outputFiles.length != 1) {
|
||||
throw new RuntimeException(
|
||||
"Expected exactly one output file but found "
|
||||
+ (outputFiles == null ? "none" : outputFiles.length));
|
||||
}
|
||||
|
||||
fileBytes = FileUtils.readFileToByteArray(outputFiles[0]);
|
||||
String outputFilename = baseFileName + "_PDFA.pdf";
|
||||
|
||||
return WebResponseUtils.bytesToWebResponse(
|
||||
pdfBytesOutput, outputFilename, MediaType.APPLICATION_PDF);
|
||||
fileBytes, outputFilename, MediaType.APPLICATION_PDF);
|
||||
|
||||
} finally {
|
||||
// Clean up the temporary files
|
||||
Files.deleteIfExists(tempInputFile);
|
||||
Files.deleteIfExists(tempOutputFile);
|
||||
// Clean up temporary files
|
||||
if (tempInputFile != null) {
|
||||
Files.deleteIfExists(tempInputFile);
|
||||
}
|
||||
if (tempOutputDir != null) {
|
||||
FileUtils.deleteDirectory(tempOutputDir.toFile());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package stirling.software.SPDF.controller.api.converters;
|
||||
|
||||
import java.io.StringWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.csv.CSVFormat;
|
||||
import org.apache.commons.csv.QuoteMode;
|
||||
import org.apache.pdfbox.Loader;
|
||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||
import org.apache.pdfbox.pdmodel.PDPage;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.http.ContentDisposition;
|
||||
@@ -18,21 +18,23 @@ import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import com.opencsv.CSVWriter;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import stirling.software.SPDF.controller.api.CropController;
|
||||
import stirling.software.SPDF.controller.api.strippers.PDFTableStripper;
|
||||
import stirling.software.SPDF.model.api.extract.PDFFilePage;
|
||||
import stirling.software.SPDF.pdf.FlexibleCSVWriter;
|
||||
import technology.tabula.ObjectExtractor;
|
||||
import technology.tabula.Page;
|
||||
import technology.tabula.Table;
|
||||
import technology.tabula.extractors.SpreadsheetExtractionAlgorithm;
|
||||
import technology.tabula.writers.Writer;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/convert")
|
||||
@Tag(name = "Convert", description = "Convert APIs")
|
||||
public class ExtractCSVController {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(CropController.class);
|
||||
private static final Logger logger = LoggerFactory.getLogger(ExtractCSVController.class);
|
||||
|
||||
@PostMapping(value = "/pdf/csv", consumes = "multipart/form-data")
|
||||
@Operation(
|
||||
@@ -40,57 +42,16 @@ public class ExtractCSVController {
|
||||
description =
|
||||
"This operation takes an input PDF file and returns CSV file of whole page. Input:PDF Output:CSV Type:SISO")
|
||||
public ResponseEntity<String> PdfToCsv(@ModelAttribute PDFFilePage form) throws Exception {
|
||||
|
||||
ArrayList<String> tableData = new ArrayList<>();
|
||||
int columnsCount = 0;
|
||||
|
||||
try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) {
|
||||
final double res = 72; // PDF units are at 72 DPI
|
||||
PDFTableStripper stripper = new PDFTableStripper();
|
||||
PDPage pdPage = document.getPage(form.getPageId() - 1);
|
||||
stripper.extractTable(pdPage);
|
||||
columnsCount = stripper.getColumns();
|
||||
for (int c = 0; c < columnsCount; ++c) {
|
||||
for (int r = 0; r < stripper.getRows(); ++r) {
|
||||
tableData.add(stripper.getText(r, c));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ArrayList<String> notEmptyColumns = new ArrayList<>();
|
||||
|
||||
for (String item : tableData) {
|
||||
if (!item.trim().isEmpty()) {
|
||||
notEmptyColumns.add(item);
|
||||
} else {
|
||||
columnsCount--;
|
||||
}
|
||||
}
|
||||
|
||||
List<String> fullTable =
|
||||
notEmptyColumns.stream()
|
||||
.map(
|
||||
(entity) ->
|
||||
entity.replace('\n', ' ')
|
||||
.replace('\r', ' ')
|
||||
.trim()
|
||||
.replaceAll("\\s{2,}", "|"))
|
||||
.toList();
|
||||
|
||||
int rowsCount = fullTable.get(0).split("\\|").length;
|
||||
|
||||
ArrayList<String> headersList = getTableHeaders(columnsCount, fullTable);
|
||||
ArrayList<String> recordList = getRecordsList(rowsCount, fullTable);
|
||||
|
||||
if (headersList.size() == 0 && recordList.size() == 0) {
|
||||
throw new Exception("No table detected, no headers or records found");
|
||||
}
|
||||
|
||||
StringWriter writer = new StringWriter();
|
||||
try (CSVWriter csvWriter = new CSVWriter(writer)) {
|
||||
csvWriter.writeNext(headersList.toArray(new String[0]));
|
||||
for (String record : recordList) {
|
||||
csvWriter.writeNext(record.split("\\|"));
|
||||
try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) {
|
||||
CSVFormat format =
|
||||
CSVFormat.EXCEL.builder().setEscape('"').setQuoteMode(QuoteMode.ALL).build();
|
||||
Writer csvWriter = new FlexibleCSVWriter(format);
|
||||
SpreadsheetExtractionAlgorithm sea = new SpreadsheetExtractionAlgorithm();
|
||||
try (ObjectExtractor extractor = new ObjectExtractor(document)) {
|
||||
Page page = extractor.extract(form.getPageId());
|
||||
List<Table> tables = sea.extract(page);
|
||||
csvWriter.write(writer, tables);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,33 +68,4 @@ public class ExtractCSVController {
|
||||
|
||||
return ResponseEntity.ok().headers(headers).body(writer.toString());
|
||||
}
|
||||
|
||||
private ArrayList<String> getRecordsList(int rowsCounts, List<String> items) {
|
||||
ArrayList<String> recordsList = new ArrayList<>();
|
||||
|
||||
for (int b = 1; b < rowsCounts; b++) {
|
||||
StringBuilder strbldr = new StringBuilder();
|
||||
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
String[] parts = items.get(i).split("\\|");
|
||||
strbldr.append(parts[b]);
|
||||
if (i != items.size() - 1) {
|
||||
strbldr.append("|");
|
||||
}
|
||||
}
|
||||
recordsList.add(strbldr.toString());
|
||||
}
|
||||
|
||||
return recordsList;
|
||||
}
|
||||
|
||||
private ArrayList<String> getTableHeaders(int columnsCount, List<String> items) {
|
||||
ArrayList<String> resultList = new ArrayList<>();
|
||||
for (int i = 0; i < columnsCount; i++) {
|
||||
String[] parts = items.get(i).split("\\|");
|
||||
resultList.add(parts[0]);
|
||||
}
|
||||
|
||||
return resultList;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@ import java.util.List;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.pdfbox.Loader;
|
||||
import org.apache.pdfbox.cos.COSName;
|
||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||
@@ -53,6 +52,54 @@ public class CompressController {
|
||||
this.pdfDocumentFactory = pdfDocumentFactory;
|
||||
}
|
||||
|
||||
private void compressImagesInPDF(Path pdfFile, double initialScaleFactor) throws Exception {
|
||||
byte[] fileBytes = Files.readAllBytes(pdfFile);
|
||||
try (PDDocument doc = Loader.loadPDF(fileBytes)) {
|
||||
double scaleFactor = initialScaleFactor;
|
||||
|
||||
for (PDPage page : doc.getPages()) {
|
||||
PDResources res = page.getResources();
|
||||
if (res != null && res.getXObjectNames() != null) {
|
||||
for (COSName name : res.getXObjectNames()) {
|
||||
PDXObject xobj = res.getXObject(name);
|
||||
if (xobj instanceof PDImageXObject) {
|
||||
PDImageXObject image = (PDImageXObject) xobj;
|
||||
BufferedImage bufferedImage = image.getImage();
|
||||
|
||||
int newWidth = (int) (bufferedImage.getWidth() * scaleFactor);
|
||||
int newHeight = (int) (bufferedImage.getHeight() * scaleFactor);
|
||||
|
||||
if (newWidth == 0 || newHeight == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Image scaledImage =
|
||||
bufferedImage.getScaledInstance(
|
||||
newWidth, newHeight, Image.SCALE_SMOOTH);
|
||||
|
||||
BufferedImage scaledBufferedImage =
|
||||
new BufferedImage(
|
||||
newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
|
||||
scaledBufferedImage.getGraphics().drawImage(scaledImage, 0, 0, null);
|
||||
|
||||
ByteArrayOutputStream compressedImageStream =
|
||||
new ByteArrayOutputStream();
|
||||
ImageIO.write(scaledBufferedImage, "jpeg", compressedImageStream);
|
||||
byte[] imageBytes = compressedImageStream.toByteArray();
|
||||
compressedImageStream.close();
|
||||
|
||||
PDImageXObject compressedImage =
|
||||
PDImageXObject.createFromByteArray(
|
||||
doc, imageBytes, image.getCOSObject().toString());
|
||||
res.put(name, compressedImage);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
doc.save(pdfFile.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@PostMapping(consumes = "multipart/form-data", value = "/compress-pdf")
|
||||
@Operation(
|
||||
summary = "Optimize PDF file",
|
||||
@@ -75,209 +122,92 @@ public class CompressController {
|
||||
autoMode = true;
|
||||
}
|
||||
|
||||
// Save the uploaded file to a temporary location
|
||||
Path tempInputFile = Files.createTempFile("input_", ".pdf");
|
||||
inputFile.transferTo(tempInputFile.toFile());
|
||||
|
||||
long inputFileSize = Files.size(tempInputFile);
|
||||
|
||||
// Prepare the output file path
|
||||
|
||||
Path tempOutputFile = null;
|
||||
byte[] pdfBytes;
|
||||
try {
|
||||
tempOutputFile = Files.createTempFile("output_", ".pdf");
|
||||
// Determine initial optimization level based on expected size reduction, only if in
|
||||
// autoMode
|
||||
|
||||
if (autoMode) {
|
||||
double sizeReductionRatio = expectedOutputSize / (double) inputFileSize;
|
||||
if (sizeReductionRatio > 0.7) {
|
||||
optimizeLevel = 1;
|
||||
} else if (sizeReductionRatio > 0.5) {
|
||||
optimizeLevel = 2;
|
||||
} else if (sizeReductionRatio > 0.35) {
|
||||
optimizeLevel = 3;
|
||||
} else {
|
||||
optimizeLevel = 3;
|
||||
}
|
||||
optimizeLevel = determineOptimizeLevel(sizeReductionRatio);
|
||||
}
|
||||
|
||||
boolean sizeMet = false;
|
||||
while (!sizeMet && optimizeLevel <= 4) {
|
||||
// Prepare the Ghostscript command
|
||||
List<String> command = new ArrayList<>();
|
||||
command.add("gs");
|
||||
command.add("-sDEVICE=pdfwrite");
|
||||
command.add("-dCompatibilityLevel=1.5");
|
||||
while (!sizeMet && optimizeLevel <= 9) {
|
||||
|
||||
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");
|
||||
// Apply additional image compression for levels 6-9
|
||||
if (optimizeLevel >= 6) {
|
||||
// Calculate scale factor based on optimization level
|
||||
double scaleFactor =
|
||||
switch (optimizeLevel) {
|
||||
case 6 -> 0.9; // 90% of original size
|
||||
case 7 -> 0.8; // 80% of original size
|
||||
case 8 -> 0.65; // 70% of original size
|
||||
case 9 -> 0.5; // 60% of original size
|
||||
default -> 1.0;
|
||||
};
|
||||
compressImagesInPDF(tempInputFile, scaleFactor);
|
||||
}
|
||||
|
||||
command.add("-dNOPAUSE");
|
||||
command.add("-dQUIET");
|
||||
command.add("-dBATCH");
|
||||
command.add("-sOutputFile=" + tempOutputFile.toString());
|
||||
// Run QPDF optimization
|
||||
List<String> command = new ArrayList<>();
|
||||
command.add("qpdf");
|
||||
if (request.getNormalize()) {
|
||||
command.add("--normalize-content=y");
|
||||
}
|
||||
if (request.getLinearize()) {
|
||||
command.add("--linearize");
|
||||
}
|
||||
command.add("--optimize-images");
|
||||
command.add("--recompress-flate");
|
||||
command.add("--compression-level=" + optimizeLevel);
|
||||
command.add("--compress-streams=y");
|
||||
command.add("--object-streams=generate");
|
||||
command.add(tempInputFile.toString());
|
||||
command.add(tempOutputFile.toString());
|
||||
|
||||
ProcessExecutorResult returnCode =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT)
|
||||
.runCommandWithOutputHandling(command);
|
||||
ProcessExecutorResult returnCode = null;
|
||||
try {
|
||||
returnCode =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.QPDF)
|
||||
.runCommandWithOutputHandling(command);
|
||||
} catch (Exception e) {
|
||||
if (returnCode != null && returnCode.getRc() != 3) {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if file size is within expected size or not auto mode so instantly finish
|
||||
// Check if file size is within expected size or not auto mode
|
||||
long outputFileSize = Files.size(tempOutputFile);
|
||||
if (outputFileSize <= expectedOutputSize || !autoMode) {
|
||||
sizeMet = true;
|
||||
} else {
|
||||
// Increase optimization level for next iteration
|
||||
optimizeLevel++;
|
||||
if (autoMode && optimizeLevel > 4) {
|
||||
logger.info("Skipping level 5 due to bad results in auto mode");
|
||||
optimizeLevel =
|
||||
incrementOptimizeLevel(
|
||||
optimizeLevel, outputFileSize, expectedOutputSize);
|
||||
if (autoMode && optimizeLevel > 9) {
|
||||
logger.info("Maximum compression level reached in auto mode");
|
||||
sizeMet = true;
|
||||
} else {
|
||||
logger.info(
|
||||
"Increasing ghostscript optimisation level to " + optimizeLevel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (expectedOutputSize != null && autoMode) {
|
||||
long outputFileSize = Files.size(tempOutputFile);
|
||||
byte[] fileBytes = Files.readAllBytes(tempOutputFile);
|
||||
if (outputFileSize > expectedOutputSize) {
|
||||
try (PDDocument doc = Loader.loadPDF(fileBytes)) {
|
||||
long previousFileSize = 0;
|
||||
double scaleFactorConst = 0.9f;
|
||||
double scaleFactor = 0.9f;
|
||||
while (true) {
|
||||
for (PDPage page : doc.getPages()) {
|
||||
PDResources res = page.getResources();
|
||||
if (res != null && res.getXObjectNames() != null) {
|
||||
for (COSName name : res.getXObjectNames()) {
|
||||
PDXObject xobj = res.getXObject(name);
|
||||
if (xobj != null && xobj instanceof PDImageXObject) {
|
||||
PDImageXObject image = (PDImageXObject) xobj;
|
||||
|
||||
// Get the image in BufferedImage format
|
||||
BufferedImage bufferedImage = image.getImage();
|
||||
|
||||
// Calculate the new dimensions
|
||||
int newWidth =
|
||||
(int)
|
||||
(bufferedImage.getWidth()
|
||||
* scaleFactorConst);
|
||||
int newHeight =
|
||||
(int)
|
||||
(bufferedImage.getHeight()
|
||||
* scaleFactorConst);
|
||||
|
||||
// If the new dimensions are zero, skip this iteration
|
||||
if (newWidth == 0 || newHeight == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Otherwise, proceed with the scaling
|
||||
Image scaledImage =
|
||||
bufferedImage.getScaledInstance(
|
||||
newWidth,
|
||||
newHeight,
|
||||
Image.SCALE_SMOOTH);
|
||||
|
||||
// Convert the scaled image back to a BufferedImage
|
||||
BufferedImage scaledBufferedImage =
|
||||
new BufferedImage(
|
||||
newWidth,
|
||||
newHeight,
|
||||
BufferedImage.TYPE_INT_RGB);
|
||||
scaledBufferedImage
|
||||
.getGraphics()
|
||||
.drawImage(scaledImage, 0, 0, null);
|
||||
|
||||
// Compress the scaled image
|
||||
ByteArrayOutputStream compressedImageStream =
|
||||
new ByteArrayOutputStream();
|
||||
ImageIO.write(
|
||||
scaledBufferedImage,
|
||||
"jpeg",
|
||||
compressedImageStream);
|
||||
byte[] imageBytes = compressedImageStream.toByteArray();
|
||||
compressedImageStream.close();
|
||||
|
||||
PDImageXObject compressedImage =
|
||||
PDImageXObject.createFromByteArray(
|
||||
doc,
|
||||
imageBytes,
|
||||
image.getCOSObject().toString());
|
||||
|
||||
// Replace the image in the resources with the
|
||||
// compressed
|
||||
// version
|
||||
res.put(name, compressedImage);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 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
|
||||
|
||||
logger.info(
|
||||
"Current file size: "
|
||||
+ FileUtils.byteCountToDisplaySize(currentSize));
|
||||
logger.info("Current scale factor: " + scaleFactor);
|
||||
|
||||
// The file is still too large, reduce scaleFactor and try again
|
||||
scaleFactor *= 0.9f; // reduce scaleFactor by 10%
|
||||
// Avoid scaleFactor being too small, causing the image to shrink to
|
||||
// 0
|
||||
if (scaleFactor < 0.2f || 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
|
||||
pdfBytes = Files.readAllBytes(tempOutputFile);
|
||||
Path finalFile = 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
|
||||
finalFile = tempInputFile;
|
||||
}
|
||||
// Return the optimized PDF as a response
|
||||
|
||||
String outputFilename =
|
||||
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
|
||||
.replaceFirst("[.][^.]+$", "")
|
||||
@@ -286,10 +216,31 @@ public class CompressController {
|
||||
pdfDocumentFactory.load(finalFile.toFile()), outputFilename);
|
||||
|
||||
} finally {
|
||||
// Clean up the temporary files
|
||||
// deleted by multipart file handler deu to transferTo?
|
||||
// Files.deleteIfExists(tempInputFile);
|
||||
Files.deleteIfExists(tempOutputFile);
|
||||
}
|
||||
}
|
||||
|
||||
private int determineOptimizeLevel(double sizeReductionRatio) {
|
||||
if (sizeReductionRatio > 0.9) return 1;
|
||||
if (sizeReductionRatio > 0.8) return 2;
|
||||
if (sizeReductionRatio > 0.7) return 3;
|
||||
if (sizeReductionRatio > 0.6) return 4;
|
||||
if (sizeReductionRatio > 0.5) return 5;
|
||||
if (sizeReductionRatio > 0.4) return 6;
|
||||
if (sizeReductionRatio > 0.3) return 7;
|
||||
if (sizeReductionRatio > 0.2) return 8;
|
||||
return 9;
|
||||
}
|
||||
|
||||
private int incrementOptimizeLevel(int currentLevel, long currentSize, long targetSize) {
|
||||
double currentRatio = currentSize / (double) targetSize;
|
||||
logger.info("Current compression ratio: {}", String.format("%.2f", currentRatio));
|
||||
|
||||
if (currentRatio > 2.0) {
|
||||
return Math.min(9, currentLevel + 3);
|
||||
} else if (currentRatio > 1.5) {
|
||||
return Math.min(9, currentLevel + 2);
|
||||
}
|
||||
return Math.min(9, currentLevel + 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ public class FakeScanControllerWIP {
|
||||
@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.")
|
||||
"This endpoint repairs a given PDF file by running qpdf command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response.")
|
||||
public ResponseEntity<byte[]> fakeScan(@ModelAttribute PDFFile request) throws IOException {
|
||||
MultipartFile inputFile = request.getFileInput();
|
||||
|
||||
|
||||
@@ -1,19 +1,31 @@
|
||||
package stirling.software.SPDF.controller.api.misc;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import io.github.pixee.security.BoundedLineReader;
|
||||
import io.github.pixee.security.Filenames;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import org.apache.pdfbox.multipdf.PDFMergerUtility;
|
||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||
import org.apache.pdfbox.pdmodel.PDPage;
|
||||
import org.apache.pdfbox.rendering.PDFRenderer;
|
||||
import org.apache.pdfbox.text.PDFTextStripper;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
@@ -23,24 +35,29 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import io.github.pixee.security.Filenames;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import stirling.software.SPDF.model.ApplicationProperties;
|
||||
import stirling.software.SPDF.model.api.misc.ProcessPdfWithOcrRequest;
|
||||
import stirling.software.SPDF.service.CustomPDDocumentFactory;
|
||||
import stirling.software.SPDF.utils.ProcessExecutor;
|
||||
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/misc")
|
||||
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||
@Slf4j
|
||||
public class OCRController {
|
||||
|
||||
@Autowired ApplicationProperties applicationProperties;
|
||||
@Autowired private ApplicationProperties applicationProperties;
|
||||
|
||||
private final CustomPDDocumentFactory pdfDocumentFactory;
|
||||
|
||||
@Autowired
|
||||
public OCRController(CustomPDDocumentFactory pdfDocumentFactory) {
|
||||
this.pdfDocumentFactory = pdfDocumentFactory;
|
||||
}
|
||||
|
||||
/** Gets the list of available Tesseract languages from the tessdata directory */
|
||||
public List<String> getAvailableTesseractLanguages() {
|
||||
String tessdataDir = applicationProperties.getSystem().getTessdataDir();
|
||||
File[] files = new File(tessdataDir).listFiles();
|
||||
@@ -54,196 +71,161 @@ public class OCRController {
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private final CustomPDDocumentFactory pdfDocumentFactory;
|
||||
|
||||
@Autowired
|
||||
public OCRController(CustomPDDocumentFactory pdfDocumentFactory) {
|
||||
this.pdfDocumentFactory = pdfDocumentFactory;
|
||||
}
|
||||
|
||||
@PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf")
|
||||
@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. Input:PDF Output:PDF Type:SI-Conditional")
|
||||
public ResponseEntity<byte[]> processPdfWithOCR(
|
||||
@ModelAttribute ProcessPdfWithOcrRequest request)
|
||||
throws IOException, InterruptedException {
|
||||
MultipartFile inputFile = request.getFileInput();
|
||||
List<String> selectedLanguages = request.getLanguages();
|
||||
Boolean sidecar = request.isSidecar();
|
||||
Boolean deskew = request.isDeskew();
|
||||
Boolean clean = request.isClean();
|
||||
Boolean cleanFinal = request.isCleanFinal();
|
||||
List<String> languages = request.getLanguages();
|
||||
String ocrType = request.getOcrType();
|
||||
String ocrRenderType = request.getOcrRenderType();
|
||||
Boolean removeImagesAfter = request.isRemoveImagesAfter();
|
||||
// --output-type pdfa
|
||||
if (selectedLanguages == null || selectedLanguages.isEmpty()) {
|
||||
throw new IOException("Please select at least one language.");
|
||||
}
|
||||
|
||||
if (!"hocr".equals(ocrRenderType) && !"sandwich".equals(ocrRenderType)) {
|
||||
throw new IOException("ocrRenderType wrong");
|
||||
}
|
||||
Path tempDir = Files.createTempDirectory("ocr_process");
|
||||
Path tempInputFile = tempDir.resolve("input.pdf");
|
||||
Path tempOutputDir = tempDir.resolve("output");
|
||||
Path tempImagesDir = tempDir.resolve("images");
|
||||
Path finalOutputFile = tempDir.resolve("final_output.pdf");
|
||||
|
||||
// Get available Tesseract languages
|
||||
List<String> availableLanguages = getAvailableTesseractLanguages();
|
||||
|
||||
// Validate selected languages
|
||||
selectedLanguages =
|
||||
selectedLanguages.stream().filter(availableLanguages::contains).toList();
|
||||
|
||||
if (selectedLanguages.isEmpty()) {
|
||||
throw new IOException("None of the selected languages are valid.");
|
||||
}
|
||||
// Save the uploaded file to a temporary location
|
||||
Path tempInputFile = Files.createTempFile("input_", ".pdf");
|
||||
Path tempOutputFile = Files.createTempFile("output_", ".pdf");
|
||||
Path sidecarTextPath = null;
|
||||
Files.createDirectories(tempOutputDir);
|
||||
Files.createDirectories(tempImagesDir);
|
||||
|
||||
try {
|
||||
// Save input file
|
||||
inputFile.transferTo(tempInputFile.toFile());
|
||||
PDFMergerUtility merger = new PDFMergerUtility();
|
||||
merger.setDestinationFileName(finalOutputFile.toString());
|
||||
|
||||
// Run OCR Command
|
||||
String languageOption = String.join("+", selectedLanguages);
|
||||
try (PDDocument document = pdfDocumentFactory.load(tempInputFile.toFile())) {
|
||||
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
||||
int pageCount = document.getNumberOfPages();
|
||||
|
||||
List<String> command =
|
||||
new ArrayList<>(
|
||||
Arrays.asList(
|
||||
"ocrmypdf",
|
||||
"--verbose",
|
||||
"2",
|
||||
"--output-type",
|
||||
"pdf",
|
||||
"--pdf-renderer",
|
||||
ocrRenderType));
|
||||
for (int pageNum = 0; pageNum < pageCount; pageNum++) {
|
||||
PDPage page = document.getPage(pageNum);
|
||||
boolean hasText = false;
|
||||
|
||||
if (sidecar != null && sidecar) {
|
||||
sidecarTextPath = Files.createTempFile("sidecar", ".txt");
|
||||
command.add("--sidecar");
|
||||
command.add(sidecarTextPath.toString());
|
||||
}
|
||||
// Check for existing text
|
||||
try (PDDocument tempDoc = new PDDocument()) {
|
||||
tempDoc.addPage(page);
|
||||
PDFTextStripper stripper = new PDFTextStripper();
|
||||
hasText = !stripper.getText(tempDoc).trim().isEmpty();
|
||||
}
|
||||
|
||||
if (deskew != null && deskew) {
|
||||
command.add("--deskew");
|
||||
}
|
||||
if (clean != null && clean) {
|
||||
command.add("--clean");
|
||||
}
|
||||
if (cleanFinal != null && cleanFinal) {
|
||||
command.add("--clean-final");
|
||||
}
|
||||
if (ocrType != null && !"".equals(ocrType)) {
|
||||
if ("skip-text".equals(ocrType)) {
|
||||
command.add("--skip-text");
|
||||
} else if ("force-ocr".equals(ocrType)) {
|
||||
command.add("--force-ocr");
|
||||
} else if ("Normal".equals(ocrType)) {
|
||||
boolean shouldOcr =
|
||||
switch (ocrType) {
|
||||
case "skip-text" -> !hasText;
|
||||
case "force-ocr" -> true;
|
||||
default -> true;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
Path pageOutputPath =
|
||||
tempOutputDir.resolve(String.format("page_%d.pdf", pageNum));
|
||||
|
||||
command.addAll(
|
||||
Arrays.asList(
|
||||
"--language",
|
||||
languageOption,
|
||||
tempInputFile.toString(),
|
||||
tempOutputFile.toString()));
|
||||
if (shouldOcr) {
|
||||
// Convert page to image
|
||||
BufferedImage image = pdfRenderer.renderImageWithDPI(pageNum, 300);
|
||||
Path imagePath =
|
||||
tempImagesDir.resolve(String.format("page_%d.png", pageNum));
|
||||
ImageIO.write(image, "png", imagePath.toFile());
|
||||
|
||||
// Run CLI command
|
||||
ProcessExecutorResult result =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.OCR_MY_PDF)
|
||||
.runCommandWithOutputHandling(command);
|
||||
if (result.getRc() != 0
|
||||
&& result.getMessages().contains("multiprocessing/synchronize.py")
|
||||
&& result.getMessages()
|
||||
.contains("OSError: [Errno 38] Function not implemented")) {
|
||||
command.add("--jobs");
|
||||
command.add("1");
|
||||
result =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.OCR_MY_PDF)
|
||||
.runCommandWithOutputHandling(command);
|
||||
}
|
||||
// Build OCR command
|
||||
List<String> command = new ArrayList<>();
|
||||
command.add("tesseract");
|
||||
command.add(imagePath.toString());
|
||||
command.add(
|
||||
tempOutputDir
|
||||
.resolve(String.format("page_%d", pageNum))
|
||||
.toString());
|
||||
command.add("-l");
|
||||
command.add(String.join("+", languages));
|
||||
command.add("pdf"); // Always output PDF
|
||||
|
||||
// Remove images from the OCR processed PDF if the flag is set to true
|
||||
if (removeImagesAfter != null && removeImagesAfter) {
|
||||
Path tempPdfWithoutImages = Files.createTempFile("output_", "_no_images.pdf");
|
||||
ProcessBuilder pb = new ProcessBuilder(command);
|
||||
Process process = pb.start();
|
||||
|
||||
List<String> gsCommand =
|
||||
Arrays.asList(
|
||||
"gs",
|
||||
"-sDEVICE=pdfwrite",
|
||||
"-dFILTERIMAGE",
|
||||
"-o",
|
||||
tempPdfWithoutImages.toString(),
|
||||
tempOutputFile.toString());
|
||||
// Capture any error output
|
||||
try (BufferedReader reader =
|
||||
new BufferedReader(
|
||||
new InputStreamReader(process.getErrorStream()))) {
|
||||
String line;
|
||||
while ((line = BoundedLineReader.readLine(reader, 5_000_000)) != null) {
|
||||
log.debug("Tesseract: {}", line);
|
||||
}
|
||||
}
|
||||
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT)
|
||||
.runCommandWithOutputHandling(gsCommand);
|
||||
tempOutputFile = tempPdfWithoutImages;
|
||||
}
|
||||
// Read the OCR processed PDF file
|
||||
byte[] pdfBytes = pdfDocumentFactory.loadToBytes(tempOutputFile.toFile());
|
||||
int exitCode = process.waitFor();
|
||||
if (exitCode != 0) {
|
||||
throw new RuntimeException(
|
||||
"Tesseract failed with exit code: " + exitCode);
|
||||
}
|
||||
|
||||
// Return the OCR processed PDF as a response
|
||||
String outputFilename =
|
||||
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
|
||||
.replaceFirst("[.][^.]+$", "")
|
||||
+ "_OCR.pdf";
|
||||
|
||||
if (sidecar != null && sidecar) {
|
||||
// Create a zip file containing both the PDF and the text file
|
||||
String outputZipFilename =
|
||||
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
|
||||
.replaceFirst("[.][^.]+$", "")
|
||||
+ "_OCR.zip";
|
||||
Path tempZipFile = Files.createTempFile("output_", ".zip");
|
||||
|
||||
try (ZipOutputStream zipOut =
|
||||
new ZipOutputStream(new FileOutputStream(tempZipFile.toFile()))) {
|
||||
// Add PDF file to the zip
|
||||
ZipEntry pdfEntry = new ZipEntry(outputFilename);
|
||||
zipOut.putNextEntry(pdfEntry);
|
||||
try (ByteArrayInputStream pdfInputStream = new ByteArrayInputStream(pdfBytes)) {
|
||||
byte[] buffer = new byte[1024];
|
||||
int length;
|
||||
while ((length = pdfInputStream.read(buffer)) != -1) {
|
||||
zipOut.write(buffer, 0, length);
|
||||
// Add OCR'd PDF to merger
|
||||
merger.addSource(pageOutputPath.toFile());
|
||||
} else {
|
||||
// Save original page without OCR
|
||||
try (PDDocument pageDoc = new PDDocument()) {
|
||||
pageDoc.addPage(page);
|
||||
pageDoc.save(pageOutputPath.toFile());
|
||||
merger.addSource(pageOutputPath.toFile());
|
||||
}
|
||||
}
|
||||
zipOut.closeEntry();
|
||||
|
||||
// Add text file to the zip
|
||||
ZipEntry txtEntry = new ZipEntry(outputFilename.replace(".pdf", ".txt"));
|
||||
zipOut.putNextEntry(txtEntry);
|
||||
Files.copy(sidecarTextPath, zipOut);
|
||||
zipOut.closeEntry();
|
||||
}
|
||||
|
||||
byte[] zipBytes = Files.readAllBytes(tempZipFile);
|
||||
|
||||
// Clean up the temporary zip file
|
||||
Files.deleteIfExists(tempZipFile);
|
||||
Files.deleteIfExists(tempOutputFile);
|
||||
Files.deleteIfExists(sidecarTextPath);
|
||||
|
||||
// Return the zip file containing both the PDF and the text file
|
||||
return WebResponseUtils.bytesToWebResponse(
|
||||
zipBytes, outputZipFilename, MediaType.APPLICATION_OCTET_STREAM);
|
||||
} else {
|
||||
// Return the OCR processed PDF as a response
|
||||
Files.deleteIfExists(tempOutputFile);
|
||||
return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename);
|
||||
}
|
||||
|
||||
// Merge all pages into final PDF
|
||||
merger.mergeDocuments(null);
|
||||
|
||||
// Read the final PDF file
|
||||
byte[] pdfContent = Files.readAllBytes(finalOutputFile);
|
||||
String outputFilename =
|
||||
Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_OCR.pdf";
|
||||
|
||||
return ResponseEntity.ok()
|
||||
.header(
|
||||
"Content-Disposition",
|
||||
"attachment; filename=\"" + outputFilename + "\"")
|
||||
.contentType(MediaType.APPLICATION_PDF)
|
||||
.body(pdfContent);
|
||||
|
||||
} finally {
|
||||
// Clean up the temporary files
|
||||
Files.deleteIfExists(tempOutputFile);
|
||||
// Comment out as transferTo makes multipart handle cleanup
|
||||
// Files.deleteIfExists(tempInputFile);
|
||||
if (sidecarTextPath != null) {
|
||||
Files.deleteIfExists(sidecarTextPath);
|
||||
// Clean up temporary files
|
||||
deleteDirectory(tempDir);
|
||||
}
|
||||
}
|
||||
|
||||
private void addFileToZip(File file, String filename, ZipOutputStream zipOut)
|
||||
throws IOException {
|
||||
if (!file.exists()) {
|
||||
log.warn("File {} does not exist, skipping", file);
|
||||
return;
|
||||
}
|
||||
|
||||
try (FileInputStream fis = new FileInputStream(file)) {
|
||||
ZipEntry zipEntry = new ZipEntry(filename);
|
||||
zipOut.putNextEntry(zipEntry);
|
||||
|
||||
byte[] buffer = new byte[1024];
|
||||
int length;
|
||||
while ((length = fis.read(buffer)) >= 0) {
|
||||
zipOut.write(buffer, 0, length);
|
||||
}
|
||||
|
||||
zipOut.closeEntry();
|
||||
}
|
||||
}
|
||||
|
||||
private void deleteDirectory(Path directory) {
|
||||
try {
|
||||
Files.walk(directory)
|
||||
.sorted(Comparator.reverseOrder())
|
||||
.forEach(
|
||||
path -> {
|
||||
try {
|
||||
Files.delete(path);
|
||||
} catch (IOException e) {
|
||||
log.error("Error deleting {}: {}", path, e.getMessage());
|
||||
}
|
||||
});
|
||||
} catch (IOException e) {
|
||||
log.error("Error walking directory {}: {}", directory, e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ public class RepairController {
|
||||
@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. Input:PDF Output:PDF Type:SISO")
|
||||
"This endpoint repairs a given PDF file by running qpdf 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(@ModelAttribute PDFFile request)
|
||||
throws IOException, InterruptedException {
|
||||
MultipartFile inputFile = request.getFileInput();
|
||||
@@ -56,14 +56,15 @@ public class RepairController {
|
||||
try {
|
||||
|
||||
List<String> command = new ArrayList<>();
|
||||
command.add("gs");
|
||||
command.add("-o");
|
||||
command.add(tempOutputFile.toString());
|
||||
command.add("-sDEVICE=pdfwrite");
|
||||
command.add("qpdf");
|
||||
command.add("--replace-input"); // Automatically fixes problems it can
|
||||
command.add("--qdf"); // Linearizes and normalizes PDF structure
|
||||
command.add("--object-streams=disable"); // Can help with some corruptions
|
||||
command.add(tempInputFile.toString());
|
||||
command.add(tempOutputFile.toString());
|
||||
|
||||
ProcessExecutorResult returnCode =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT)
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.QPDF)
|
||||
.runCommandWithOutputHandling(command);
|
||||
|
||||
// Read the optimized PDF file
|
||||
|
||||
@@ -13,12 +13,14 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import stirling.software.SPDF.model.api.misc.ReplaceAndInvertColorRequest;
|
||||
import stirling.software.SPDF.service.misc.ReplaceAndInvertColorService;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/misc")
|
||||
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||
public class ReplaceAndInvertColorController {
|
||||
|
||||
private ReplaceAndInvertColorService replaceAndInvertColorService;
|
||||
|
||||
@@ -8,6 +8,7 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.security.KeyStore;
|
||||
import java.security.KeyStoreException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
@@ -21,6 +22,7 @@ import java.security.cert.X509Certificate;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.pdfbox.examples.signature.CreateSignatureBase;
|
||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||
import org.apache.pdfbox.pdmodel.PDPage;
|
||||
@@ -92,7 +94,7 @@ public class CertSignController {
|
||||
}
|
||||
|
||||
class CreateSignature extends CreateSignatureBase {
|
||||
File imageFile;
|
||||
File logoFile;
|
||||
|
||||
public CreateSignature(KeyStore keystore, char[] pin)
|
||||
throws KeyStoreException,
|
||||
@@ -102,11 +104,17 @@ public class CertSignController {
|
||||
CertificateException {
|
||||
super(keystore, pin);
|
||||
ClassPathResource resource = new ClassPathResource("static/images/signature.png");
|
||||
imageFile = resource.getFile();
|
||||
try (InputStream is = resource.getInputStream()) {
|
||||
logoFile = Files.createTempFile("signature", ".png").toFile();
|
||||
FileUtils.copyInputStreamToFile(is, logoFile);
|
||||
} catch (IOException e) {
|
||||
logger.error("Failed to load image signature file");
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
public InputStream createVisibleSignature(
|
||||
PDDocument srcDoc, PDSignature signature, Integer pageNumber, Boolean showImage)
|
||||
PDDocument srcDoc, PDSignature signature, Integer pageNumber, Boolean showLogo)
|
||||
throws IOException {
|
||||
// modified from org.apache.pdfbox.examples.signature.CreateVisibleSignature2
|
||||
try (PDDocument doc = new PDDocument()) {
|
||||
@@ -145,7 +153,7 @@ public class CertSignController {
|
||||
widget.setAppearance(appearance);
|
||||
|
||||
try (PDPageContentStream cs = new PDPageContentStream(doc, appearanceStream)) {
|
||||
if (showImage) {
|
||||
if (showLogo) {
|
||||
cs.saveGraphicsState();
|
||||
PDExtendedGraphicsState extState = new PDExtendedGraphicsState();
|
||||
extState.setBlendMode(BlendMode.MULTIPLY);
|
||||
@@ -153,7 +161,7 @@ public class CertSignController {
|
||||
cs.setGraphicsStateParameters(extState);
|
||||
cs.transform(Matrix.getScaleInstance(0.08f, 0.08f));
|
||||
PDImageXObject img =
|
||||
PDImageXObject.createFromFileByExtension(imageFile, doc);
|
||||
PDImageXObject.createFromFileByExtension(logoFile, doc);
|
||||
cs.drawImage(img, 100, 0);
|
||||
cs.restoreGraphicsState();
|
||||
}
|
||||
@@ -219,6 +227,7 @@ public class CertSignController {
|
||||
String location = request.getLocation();
|
||||
String name = request.getName();
|
||||
Integer pageNumber = request.getPageNumber() - 1;
|
||||
Boolean showLogo = request.isShowLogo();
|
||||
|
||||
if (certType == null) {
|
||||
throw new IllegalArgumentException("Cert type must be provided");
|
||||
@@ -258,7 +267,8 @@ public class CertSignController {
|
||||
pageNumber,
|
||||
name,
|
||||
location,
|
||||
reason);
|
||||
reason,
|
||||
showLogo);
|
||||
return WebResponseUtils.boasToWebResponse(
|
||||
baos,
|
||||
Filenames.toSimpleFileName(pdf.getOriginalFilename()).replaceFirst("[.][^.]+$", "")
|
||||
@@ -274,7 +284,8 @@ public class CertSignController {
|
||||
Integer pageNumber,
|
||||
String name,
|
||||
String location,
|
||||
String reason) {
|
||||
String reason,
|
||||
Boolean showLogo) {
|
||||
try (PDDocument doc = pdfDocumentFactory.load(input)) {
|
||||
PDSignature signature = new PDSignature();
|
||||
signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
|
||||
@@ -287,7 +298,7 @@ public class CertSignController {
|
||||
if (showSignature) {
|
||||
SignatureOptions signatureOptions = new SignatureOptions();
|
||||
signatureOptions.setVisualSignature(
|
||||
instance.createVisibleSignature(doc, signature, pageNumber, true));
|
||||
instance.createVisibleSignature(doc, signature, pageNumber, showLogo));
|
||||
signatureOptions.setPage(pageNumber);
|
||||
|
||||
doc.addSignature(signature, instance, signatureOptions);
|
||||
|
||||
@@ -187,18 +187,31 @@ public class WatermarkController {
|
||||
float watermarkHeight = heightSpacer + fontSize * textLines.length;
|
||||
float pageWidth = page.getMediaBox().getWidth();
|
||||
float pageHeight = page.getMediaBox().getHeight();
|
||||
int watermarkRows = (int) (pageHeight / watermarkHeight + 1);
|
||||
int watermarkCols = (int) (pageWidth / watermarkWidth + 1);
|
||||
|
||||
// Calculating the new width and height depending on the angle.
|
||||
float radians = (float) Math.toRadians(rotation);
|
||||
float newWatermarkWidth =
|
||||
(float)
|
||||
(Math.abs(watermarkWidth * Math.cos(radians))
|
||||
+ Math.abs(watermarkHeight * Math.sin(radians)));
|
||||
float newWatermarkHeight =
|
||||
(float)
|
||||
(Math.abs(watermarkWidth * Math.sin(radians))
|
||||
+ Math.abs(watermarkHeight * Math.cos(radians)));
|
||||
|
||||
// Calculating the number of rows and columns.
|
||||
int watermarkRows = (int) (pageHeight / newWatermarkHeight + 1);
|
||||
int watermarkCols = (int) (pageWidth / newWatermarkWidth + 1);
|
||||
|
||||
// Add the text watermark
|
||||
for (int i = 0; i < watermarkRows; i++) {
|
||||
for (int j = 0; j < watermarkCols; j++) {
|
||||
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));
|
||||
j * newWatermarkWidth,
|
||||
i * newWatermarkHeight));
|
||||
|
||||
for (int k = 0; k < textLines.length; ++k) {
|
||||
contentStream.showText(textLines[k]);
|
||||
|
||||
@@ -1,327 +0,0 @@
|
||||
package stirling.software.SPDF.controller.api.strippers;
|
||||
|
||||
import java.awt.Shape;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.apache.fontbox.util.BoundingBox;
|
||||
import org.apache.pdfbox.pdmodel.PDPage;
|
||||
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
||||
import org.apache.pdfbox.pdmodel.font.PDFont;
|
||||
import org.apache.pdfbox.pdmodel.font.PDType3Font;
|
||||
import org.apache.pdfbox.text.PDFTextStripper;
|
||||
import org.apache.pdfbox.text.PDFTextStripperByArea;
|
||||
import org.apache.pdfbox.text.TextPosition;
|
||||
|
||||
/**
|
||||
* Class to extract tabular data from a PDF. Works by making a first pass of the page to group all
|
||||
* nearby text items together, and then inferring a 2D grid from these regions. Each table cell is
|
||||
* then extracted using a PDFTextStripperByArea object.
|
||||
*
|
||||
* <p>Works best when headers are included in the detected region, to ensure representative text in
|
||||
* every column.
|
||||
*
|
||||
* <p>Based upon DrawPrintTextLocations PDFBox example
|
||||
* (https://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/DrawPrintTextLocations.java)
|
||||
*
|
||||
* @author Beldaz
|
||||
*/
|
||||
public class PDFTableStripper extends PDFTextStripper {
|
||||
|
||||
/**
|
||||
* This will print the documents data, for each table cell.
|
||||
*
|
||||
* @param args The command line arguments.
|
||||
* @throws IOException If there is an error parsing the document.
|
||||
*/
|
||||
/*
|
||||
* Used in methods derived from DrawPrintTextLocations
|
||||
*/
|
||||
private AffineTransform flipAT;
|
||||
|
||||
private AffineTransform rotateAT;
|
||||
|
||||
/** Regions updated by calls to writeString */
|
||||
private Set<Rectangle2D> boxes;
|
||||
|
||||
// Border to allow when finding intersections
|
||||
private double dx = 1.0; // This value works for me, feel free to tweak (or add setter)
|
||||
private double dy = 0.000; // Rows of text tend to overlap, so need to extend
|
||||
|
||||
/** Region in which to find table (otherwise whole page) */
|
||||
private Rectangle2D regionArea;
|
||||
|
||||
/** Number of rows in inferred table */
|
||||
private int nRows = 0;
|
||||
|
||||
/** Number of columns in inferred table */
|
||||
private int nCols = 0;
|
||||
|
||||
/** This is the object that does the text extraction */
|
||||
private PDFTextStripperByArea regionStripper;
|
||||
|
||||
/**
|
||||
* 1D intervals - used for calculateTableRegions()
|
||||
*
|
||||
* @author Beldaz
|
||||
*/
|
||||
public static class Interval {
|
||||
double start;
|
||||
double end;
|
||||
|
||||
public Interval(double start, double end) {
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
}
|
||||
|
||||
public void add(Interval col) {
|
||||
if (col.start < start) start = col.start;
|
||||
if (col.end > end) end = col.end;
|
||||
}
|
||||
|
||||
public static void addTo(Interval x, LinkedList<Interval> columns) {
|
||||
int p = 0;
|
||||
Iterator<Interval> it = columns.iterator();
|
||||
// Find where x should go
|
||||
while (it.hasNext()) {
|
||||
Interval col = it.next();
|
||||
if (x.end >= col.start) {
|
||||
if (x.start <= col.end) { // overlaps
|
||||
x.add(col);
|
||||
it.remove();
|
||||
}
|
||||
break;
|
||||
}
|
||||
++p;
|
||||
}
|
||||
while (it.hasNext()) {
|
||||
Interval col = it.next();
|
||||
if (x.start > col.end) break;
|
||||
x.add(col);
|
||||
it.remove();
|
||||
}
|
||||
columns.add(p, x);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiate a new PDFTableStripper object.
|
||||
*
|
||||
* @throws IOException If there is an error loading the properties.
|
||||
*/
|
||||
public PDFTableStripper() throws IOException {
|
||||
super.setShouldSeparateByBeads(false);
|
||||
regionStripper = new PDFTextStripperByArea();
|
||||
regionStripper.setSortByPosition(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the region to group text by.
|
||||
*
|
||||
* @param rect The rectangle area to retrieve the text from.
|
||||
*/
|
||||
public void setRegion(Rectangle2D rect) {
|
||||
regionArea = rect;
|
||||
}
|
||||
|
||||
public int getRows() {
|
||||
return nRows;
|
||||
}
|
||||
|
||||
public int getColumns() {
|
||||
return nCols;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the text for the region, this should be called after extractTable().
|
||||
*
|
||||
* @return The text that was identified in that region.
|
||||
*/
|
||||
public String getText(int row, int col) {
|
||||
return regionStripper.getTextForRegion("el" + col + "x" + row);
|
||||
}
|
||||
|
||||
public void extractTable(PDPage pdPage) throws IOException {
|
||||
setStartPage(getCurrentPageNo());
|
||||
setEndPage(getCurrentPageNo());
|
||||
|
||||
boxes = new HashSet<Rectangle2D>();
|
||||
// flip y-axis
|
||||
flipAT = new AffineTransform();
|
||||
flipAT.translate(0, pdPage.getBBox().getHeight());
|
||||
flipAT.scale(1, -1);
|
||||
|
||||
// page may be rotated
|
||||
rotateAT = new AffineTransform();
|
||||
int rotation = pdPage.getRotation();
|
||||
if (rotation != 0) {
|
||||
PDRectangle mediaBox = pdPage.getMediaBox();
|
||||
switch (rotation) {
|
||||
case 90:
|
||||
rotateAT.translate(mediaBox.getHeight(), 0);
|
||||
break;
|
||||
case 270:
|
||||
rotateAT.translate(0, mediaBox.getWidth());
|
||||
break;
|
||||
case 180:
|
||||
rotateAT.translate(mediaBox.getWidth(), mediaBox.getHeight());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
rotateAT.rotate(Math.toRadians(rotation));
|
||||
}
|
||||
// Trigger processing of the document so that writeString is called.
|
||||
try (Writer dummy = new OutputStreamWriter(new ByteArrayOutputStream())) {
|
||||
super.output = dummy;
|
||||
super.processPage(pdPage);
|
||||
}
|
||||
|
||||
Rectangle2D[][] regions = calculateTableRegions();
|
||||
|
||||
// System.err.println("Drawing " + nCols + "x" + nRows + "="+ nRows*nCols + "
|
||||
// regions");
|
||||
for (int i = 0; i < nCols; ++i) {
|
||||
for (int j = 0; j < nRows; ++j) {
|
||||
final Rectangle2D region = regions[i][j];
|
||||
regionStripper.addRegion("el" + i + "x" + j, region);
|
||||
}
|
||||
}
|
||||
|
||||
regionStripper.extractRegions(pdPage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Infer a rectangular grid of regions from the boxes field.
|
||||
*
|
||||
* @return 2D array of table regions (as Rectangle2D objects). Note that some of these regions
|
||||
* may have no content.
|
||||
*/
|
||||
private Rectangle2D[][] calculateTableRegions() {
|
||||
|
||||
// Build up a list of all table regions, based upon the populated
|
||||
// regions of boxes field. Treats the horizontal and vertical extents
|
||||
// of each box as distinct
|
||||
LinkedList<Interval> columns = new LinkedList<Interval>();
|
||||
LinkedList<Interval> rows = new LinkedList<Interval>();
|
||||
|
||||
for (Rectangle2D box : boxes) {
|
||||
Interval x = new Interval(box.getMinX(), box.getMaxX());
|
||||
Interval y = new Interval(box.getMinY(), box.getMaxY());
|
||||
|
||||
Interval.addTo(x, columns);
|
||||
Interval.addTo(y, rows);
|
||||
}
|
||||
|
||||
nRows = rows.size();
|
||||
nCols = columns.size();
|
||||
Rectangle2D[][] regions = new Rectangle2D[nCols][nRows];
|
||||
int i = 0;
|
||||
// Label regions from top left, rather than the transformed orientation
|
||||
for (Interval column : columns) {
|
||||
int j = 0;
|
||||
for (Interval row : rows) {
|
||||
regions[nCols - i - 1][nRows - j - 1] =
|
||||
new Rectangle2D.Double(
|
||||
column.start,
|
||||
row.start,
|
||||
column.end - column.start,
|
||||
row.end - row.start);
|
||||
++j;
|
||||
}
|
||||
++i;
|
||||
}
|
||||
|
||||
return regions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register each character's bounding box, updating boxes field to maintain a list of all
|
||||
* distinct groups of characters.
|
||||
*
|
||||
* <p>Overrides the default functionality of PDFTextStripper. Most of this is taken from
|
||||
* DrawPrintTextLocations.java, with extra steps at end of main loop
|
||||
*/
|
||||
@Override
|
||||
protected void writeString(String string, List<TextPosition> textPositions) throws IOException {
|
||||
for (TextPosition text : textPositions) {
|
||||
// glyph space -> user space
|
||||
// note: text.getTextMatrix() is *not* the Text Matrix, it's the Text Rendering Matrix
|
||||
AffineTransform at = text.getTextMatrix().createAffineTransform();
|
||||
PDFont font = text.getFont();
|
||||
BoundingBox bbox = font.getBoundingBox();
|
||||
|
||||
// advance width, bbox height (glyph space)
|
||||
float xadvance =
|
||||
font.getWidth(text.getCharacterCodes()[0]); // todo: should iterate all chars
|
||||
Rectangle2D.Float rect =
|
||||
new Rectangle2D.Float(0, bbox.getLowerLeftY(), xadvance, bbox.getHeight());
|
||||
|
||||
if (font instanceof PDType3Font) {
|
||||
// bbox and font matrix are unscaled
|
||||
at.concatenate(font.getFontMatrix().createAffineTransform());
|
||||
} else {
|
||||
// bbox and font matrix are already scaled to 1000
|
||||
at.scale(1 / 1000f, 1 / 1000f);
|
||||
}
|
||||
Shape s = at.createTransformedShape(rect);
|
||||
s = flipAT.createTransformedShape(s);
|
||||
s = rotateAT.createTransformedShape(s);
|
||||
|
||||
//
|
||||
// Merge character's bounding box with boxes field
|
||||
//
|
||||
Rectangle2D bounds = s.getBounds2D();
|
||||
// Pad sides to detect almost touching boxes
|
||||
Rectangle2D hitbox = bounds.getBounds2D();
|
||||
hitbox.add(bounds.getMinX() - dx, bounds.getMinY() - dy);
|
||||
hitbox.add(bounds.getMaxX() + dx, bounds.getMaxY() + dy);
|
||||
|
||||
// Find all overlapping boxes
|
||||
List<Rectangle2D> intersectList = new ArrayList<Rectangle2D>();
|
||||
for (Rectangle2D box : boxes) {
|
||||
if (box.intersects(hitbox)) {
|
||||
intersectList.add(box);
|
||||
}
|
||||
}
|
||||
|
||||
// Combine all touching boxes and update
|
||||
// (NOTE: Potentially this could leave some overlapping boxes un-merged,
|
||||
// but it's sufficient for now and get's fixed up in calculateTableRegions)
|
||||
for (Rectangle2D box : intersectList) {
|
||||
bounds.add(box);
|
||||
boxes.remove(box);
|
||||
}
|
||||
boxes.add(bounds);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method does nothing in this derived class, because beads and regions are incompatible.
|
||||
* Beads are ignored when stripping by area.
|
||||
*
|
||||
* @param aShouldSeparateByBeads The new grouping of beads.
|
||||
*/
|
||||
@Override
|
||||
public final void setShouldSeparateByBeads(boolean aShouldSeparateByBeads) {}
|
||||
|
||||
/** Adapted from PDFTextStripperByArea {@inheritDoc} */
|
||||
@Override
|
||||
protected void processTextPosition(TextPosition text) {
|
||||
if (regionArea != null && !regionArea.contains(text.getX(), text.getY())) {
|
||||
// skip character
|
||||
} else {
|
||||
super.processTextPosition(text);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -34,7 +34,9 @@ public class DatabaseWebController {
|
||||
}
|
||||
|
||||
List<FileInfo> backupList = databaseBackupHelper.getBackupList();
|
||||
model.addAttribute("systemUpdate", backupList);
|
||||
model.addAttribute("backupFiles", backupList);
|
||||
|
||||
model.addAttribute("databaseVersion", databaseBackupHelper.getH2Version());
|
||||
|
||||
return "database";
|
||||
}
|
||||
|
||||
@@ -55,6 +55,11 @@ public class HomeWebController {
|
||||
return "licenses";
|
||||
}
|
||||
|
||||
@GetMapping("/releases")
|
||||
public String getReleaseNotes(Model model) {
|
||||
return "releases";
|
||||
}
|
||||
|
||||
@GetMapping("/")
|
||||
public String home(Model model) {
|
||||
model.addAttribute("currentPage", "home");
|
||||
|
||||
@@ -15,7 +15,7 @@ import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface;
|
||||
import stirling.software.SPDF.service.SignatureService;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/api/v1/general/")
|
||||
@RequestMapping("/api/v1/general")
|
||||
public class SignatureController {
|
||||
|
||||
@Autowired private SignatureService signatureService;
|
||||
|
||||
@@ -47,6 +47,7 @@ public class ApplicationProperties {
|
||||
private AutomaticallyGenerated automaticallyGenerated = new AutomaticallyGenerated();
|
||||
private EnterpriseEdition enterpriseEdition = new EnterpriseEdition();
|
||||
private AutoPipeline autoPipeline = new AutoPipeline();
|
||||
private ProcessExecutor processExecutor = new ProcessExecutor();
|
||||
|
||||
@Data
|
||||
public static class AutoPipeline {
|
||||
@@ -309,4 +310,98 @@ public class ApplicationProperties {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class ProcessExecutor {
|
||||
private SessionLimit sessionLimit = new SessionLimit();
|
||||
private TimeoutMinutes timeoutMinutes = new TimeoutMinutes();
|
||||
|
||||
@Data
|
||||
public static class SessionLimit {
|
||||
private int libreOfficeSessionLimit;
|
||||
private int pdfToHtmlSessionLimit;
|
||||
private int pythonOpenCvSessionLimit;
|
||||
private int weasyPrintSessionLimit;
|
||||
private int installAppSessionLimit;
|
||||
private int calibreSessionLimit;
|
||||
private int qpdfSessionLimit;
|
||||
private int tesseractSessionLimit;
|
||||
|
||||
public int getQpdfSessionLimit() {
|
||||
return qpdfSessionLimit > 0 ? qpdfSessionLimit : 2;
|
||||
}
|
||||
|
||||
public int getTesseractSessionLimit() {
|
||||
return tesseractSessionLimit > 0 ? tesseractSessionLimit : 1;
|
||||
}
|
||||
|
||||
public int getLibreOfficeSessionLimit() {
|
||||
return libreOfficeSessionLimit > 0 ? libreOfficeSessionLimit : 1;
|
||||
}
|
||||
|
||||
public int getPdfToHtmlSessionLimit() {
|
||||
return pdfToHtmlSessionLimit > 0 ? pdfToHtmlSessionLimit : 1;
|
||||
}
|
||||
|
||||
public int getPythonOpenCvSessionLimit() {
|
||||
return pythonOpenCvSessionLimit > 0 ? pythonOpenCvSessionLimit : 8;
|
||||
}
|
||||
|
||||
public int getWeasyPrintSessionLimit() {
|
||||
return weasyPrintSessionLimit > 0 ? weasyPrintSessionLimit : 16;
|
||||
}
|
||||
|
||||
public int getInstallAppSessionLimit() {
|
||||
return installAppSessionLimit > 0 ? installAppSessionLimit : 1;
|
||||
}
|
||||
|
||||
public int getCalibreSessionLimit() {
|
||||
return calibreSessionLimit > 0 ? calibreSessionLimit : 1;
|
||||
}
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class TimeoutMinutes {
|
||||
private long libreOfficeTimeoutMinutes;
|
||||
private long pdfToHtmlTimeoutMinutes;
|
||||
private long pythonOpenCvTimeoutMinutes;
|
||||
private long weasyPrintTimeoutMinutes;
|
||||
private long installAppTimeoutMinutes;
|
||||
private long calibreTimeoutMinutes;
|
||||
private long tesseractTimeoutMinutes;
|
||||
private long qpdfTimeoutMinutes;
|
||||
|
||||
public long getTesseractTimeoutMinutes() {
|
||||
return tesseractTimeoutMinutes > 0 ? tesseractTimeoutMinutes : 30;
|
||||
}
|
||||
|
||||
public long getQpdfTimeoutMinutes() {
|
||||
return qpdfTimeoutMinutes > 0 ? qpdfTimeoutMinutes : 30;
|
||||
}
|
||||
|
||||
public long getLibreOfficeTimeoutMinutes() {
|
||||
return libreOfficeTimeoutMinutes > 0 ? libreOfficeTimeoutMinutes : 30;
|
||||
}
|
||||
|
||||
public long getPdfToHtmlTimeoutMinutes() {
|
||||
return pdfToHtmlTimeoutMinutes > 0 ? pdfToHtmlTimeoutMinutes : 20;
|
||||
}
|
||||
|
||||
public long getPythonOpenCvTimeoutMinutes() {
|
||||
return pythonOpenCvTimeoutMinutes > 0 ? pythonOpenCvTimeoutMinutes : 30;
|
||||
}
|
||||
|
||||
public long getWeasyPrintTimeoutMinutes() {
|
||||
return weasyPrintTimeoutMinutes > 0 ? weasyPrintTimeoutMinutes : 30;
|
||||
}
|
||||
|
||||
public long getInstallAppTimeoutMinutes() {
|
||||
return installAppTimeoutMinutes > 0 ? installAppTimeoutMinutes : 60;
|
||||
}
|
||||
|
||||
public long getCalibreTimeoutMinutes() {
|
||||
return calibreTimeoutMinutes > 0 ? calibreTimeoutMinutes : 30;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,4 +18,15 @@ public class OptimizePdfRequest extends PDFFile {
|
||||
|
||||
@Schema(description = "The expected output size, e.g. '100MB', '25KB', etc.")
|
||||
private String expectedOutputSize;
|
||||
|
||||
@Schema(
|
||||
description = "Whether to linearize the PDF for faster web viewing. Default is false.",
|
||||
defaultValue = "false")
|
||||
private Boolean linearize = false;
|
||||
|
||||
@Schema(
|
||||
description =
|
||||
"Whether to normalize the PDF content for better compatibility. Default is true.",
|
||||
defaultValue = "true")
|
||||
private Boolean normalize = true;
|
||||
}
|
||||
|
||||
@@ -15,18 +15,6 @@ public class ProcessPdfWithOcrRequest extends PDFFile {
|
||||
@Schema(description = "List of languages to use in OCR processing")
|
||||
private List<String> languages;
|
||||
|
||||
@Schema(description = "Include OCR text in a sidecar text file if set to true")
|
||||
private boolean sidecar;
|
||||
|
||||
@Schema(description = "Deskew the input file if set to true")
|
||||
private boolean deskew;
|
||||
|
||||
@Schema(description = "Clean the input file if set to true")
|
||||
private boolean clean;
|
||||
|
||||
@Schema(description = "Clean the final output if set to true")
|
||||
private boolean cleanFinal;
|
||||
|
||||
@Schema(
|
||||
description = "Specify the OCR type, e.g., 'skip-text', 'force-ocr', or 'Normal'",
|
||||
allowableValues = {"skip-text", "force-ocr", "Normal"})
|
||||
@@ -37,7 +25,4 @@ public class ProcessPdfWithOcrRequest extends PDFFile {
|
||||
allowableValues = {"hocr", "sandwich"},
|
||||
defaultValue = "hocr")
|
||||
private String ocrRenderType = "hocr";
|
||||
|
||||
@Schema(description = "Remove images from the output PDF if set to true")
|
||||
private boolean removeImagesAfter;
|
||||
}
|
||||
|
||||
@@ -50,4 +50,7 @@ public class SignPDFWithCertRequest extends PDFFile {
|
||||
description =
|
||||
"The page number where the signature should be visible. This is required if showSignature is set to true")
|
||||
private Integer pageNumber;
|
||||
|
||||
@Schema(description = "Whether to visually show a signature logo along with the signature")
|
||||
private boolean showLogo;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package stirling.software.SPDF.pdf;
|
||||
|
||||
import org.apache.commons.csv.CSVFormat;
|
||||
|
||||
import technology.tabula.writers.CSVWriter;
|
||||
|
||||
public class FlexibleCSVWriter extends CSVWriter {
|
||||
|
||||
public FlexibleCSVWriter() {
|
||||
super();
|
||||
}
|
||||
|
||||
public FlexibleCSVWriter(CSVFormat csvFormat) {
|
||||
super(csvFormat);
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import java.util.Date;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.web.authentication.rememberme.PersistentRememberMeToken;
|
||||
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import stirling.software.SPDF.model.PersistentLogin;
|
||||
|
||||
@@ -13,6 +14,7 @@ public class JPATokenRepositoryImpl implements PersistentTokenRepository {
|
||||
@Autowired private PersistentLoginRepository persistentLoginRepository;
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void createNewToken(PersistentRememberMeToken token) {
|
||||
PersistentLogin newToken = new PersistentLogin();
|
||||
newToken.setSeries(token.getSeries());
|
||||
@@ -23,6 +25,7 @@ public class JPATokenRepositoryImpl implements PersistentTokenRepository {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void updateToken(String series, String tokenValue, Date lastUsed) {
|
||||
PersistentLogin existingToken = persistentLoginRepository.findById(series).orElse(null);
|
||||
if (existingToken != null) {
|
||||
@@ -43,11 +46,11 @@ public class JPATokenRepositoryImpl implements PersistentTokenRepository {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void removeUserTokens(String username) {
|
||||
for (PersistentLogin token : persistentLoginRepository.findAll()) {
|
||||
if (token.getUsername().equals(username)) {
|
||||
persistentLoginRepository.delete(token);
|
||||
}
|
||||
try {
|
||||
persistentLoginRepository.deleteByUsername(username);
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,4 +6,6 @@ import org.springframework.stereotype.Repository;
|
||||
import stirling.software.SPDF.model.PersistentLogin;
|
||||
|
||||
@Repository
|
||||
public interface PersistentLoginRepository extends JpaRepository<PersistentLogin, String> {}
|
||||
public interface PersistentLoginRepository extends JpaRepository<PersistentLogin, String> {
|
||||
void deleteByUsername(String username);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
package stirling.software.SPDF.service;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class LanguageService {
|
||||
|
||||
private final PathMatchingResourcePatternResolver resourcePatternResolver =
|
||||
new PathMatchingResourcePatternResolver();
|
||||
|
||||
public List<String> getSupportedLanguages() {
|
||||
List<String> supportedLanguages = new ArrayList<>();
|
||||
|
||||
try {
|
||||
Resource[] resources =
|
||||
resourcePatternResolver.getResources("classpath*:messages_*.properties");
|
||||
for (Resource resource : resources) {
|
||||
if (resource.exists() && resource.isReadable()) {
|
||||
String filename = resource.getFilename();
|
||||
if (filename != null
|
||||
&& filename.startsWith("messages_")
|
||||
&& filename.endsWith(".properties")) {
|
||||
String languageCode =
|
||||
filename.replace("messages_", "").replace(".properties", "");
|
||||
supportedLanguages.add(languageCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return supportedLanguages;
|
||||
}
|
||||
}
|
||||
@@ -24,7 +24,7 @@ public class MetricsAggregatorService {
|
||||
this.postHogService = postHogService;
|
||||
}
|
||||
|
||||
@Scheduled(fixedRate = 900000) // Run every 15 minutes
|
||||
@Scheduled(fixedRate = 1800000) // Run every 30 minutes
|
||||
public void aggregateAndSendMetrics() {
|
||||
Map<String, Object> metrics = new HashMap<>();
|
||||
Search.in(meterRegistry)
|
||||
@@ -32,11 +32,17 @@ public class MetricsAggregatorService {
|
||||
.counters()
|
||||
.forEach(
|
||||
counter -> {
|
||||
String method = counter.getId().getTag("method");
|
||||
String uri = counter.getId().getTag("uri");
|
||||
|
||||
// Skip if either method or uri is null
|
||||
if (method == null || uri == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
String key =
|
||||
String.format(
|
||||
"http_requests_%s_%s",
|
||||
counter.getId().getTag("method"),
|
||||
counter.getId().getTag("uri").replace("/", "_"));
|
||||
"http_requests_%s_%s", method, uri.replace("/", "_"));
|
||||
|
||||
double currentCount = counter.count();
|
||||
double lastCount = lastSentMetrics.getOrDefault(key, 0.0);
|
||||
|
||||
@@ -15,6 +15,7 @@ import java.util.TimeZone;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.posthog.java.PostHog;
|
||||
@@ -26,19 +27,25 @@ import stirling.software.SPDF.model.ApplicationProperties;
|
||||
public class PostHogService {
|
||||
private final PostHog postHog;
|
||||
private final String uniqueId;
|
||||
private final String appVersion;
|
||||
private final ApplicationProperties applicationProperties;
|
||||
private final UserServiceInterface userService;
|
||||
private final Environment env;
|
||||
|
||||
@Autowired
|
||||
public PostHogService(
|
||||
PostHog postHog,
|
||||
@Qualifier("UUID") String uuid,
|
||||
@Qualifier("appVersion") String appVersion,
|
||||
ApplicationProperties applicationProperties,
|
||||
@Autowired(required = false) UserServiceInterface userService) {
|
||||
@Autowired(required = false) UserServiceInterface userService,
|
||||
Environment env) {
|
||||
this.postHog = postHog;
|
||||
this.uniqueId = uuid;
|
||||
this.appVersion = appVersion;
|
||||
this.applicationProperties = applicationProperties;
|
||||
this.userService = userService;
|
||||
this.env = env;
|
||||
captureSystemInfo();
|
||||
}
|
||||
|
||||
@@ -64,6 +71,16 @@ public class PostHogService {
|
||||
Map<String, Object> metrics = new HashMap<>();
|
||||
|
||||
try {
|
||||
// Application version
|
||||
metrics.put("app_version", appVersion);
|
||||
String deploymentType = "JAR"; // default
|
||||
if ("true".equalsIgnoreCase(env.getProperty("BROWSER_OPEN"))) {
|
||||
deploymentType = "EXE";
|
||||
} else if (isRunningInDocker()) {
|
||||
deploymentType = "DOCKER";
|
||||
}
|
||||
metrics.put("deployment_type", deploymentType);
|
||||
|
||||
// System info
|
||||
metrics.put("os_name", System.getProperty("os.name"));
|
||||
metrics.put("os_version", System.getProperty("os.version"));
|
||||
@@ -132,7 +149,6 @@ public class PostHogService {
|
||||
|
||||
// Docker detection and stats
|
||||
boolean isDocker = isRunningInDocker();
|
||||
metrics.put("is_docker", isDocker);
|
||||
if (isDocker) {
|
||||
metrics.put("docker_metrics", getDockerMetrics());
|
||||
}
|
||||
|
||||
@@ -18,19 +18,23 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import io.github.pixee.security.BoundedLineReader;
|
||||
|
||||
import stirling.software.SPDF.model.ApplicationProperties;
|
||||
|
||||
public class ProcessExecutor {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(ProcessExecutor.class);
|
||||
|
||||
private static ApplicationProperties applicationProperties = new ApplicationProperties();
|
||||
|
||||
public enum Processes {
|
||||
LIBRE_OFFICE,
|
||||
PDFTOHTML,
|
||||
OCR_MY_PDF,
|
||||
PYTHON_OPENCV,
|
||||
GHOSTSCRIPT,
|
||||
WEASYPRINT,
|
||||
INSTALL_APP,
|
||||
CALIBRE
|
||||
CALIBRE,
|
||||
TESSERACT,
|
||||
QPDF
|
||||
}
|
||||
|
||||
private static final Map<Processes, ProcessExecutor> instances = new ConcurrentHashMap<>();
|
||||
@@ -45,26 +49,90 @@ public class ProcessExecutor {
|
||||
key -> {
|
||||
int semaphoreLimit =
|
||||
switch (key) {
|
||||
case LIBRE_OFFICE -> 1;
|
||||
case PDFTOHTML -> 1;
|
||||
case OCR_MY_PDF -> 2;
|
||||
case PYTHON_OPENCV -> 8;
|
||||
case GHOSTSCRIPT -> 16;
|
||||
case WEASYPRINT -> 16;
|
||||
case INSTALL_APP -> 1;
|
||||
case CALIBRE -> 1;
|
||||
case LIBRE_OFFICE ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getSessionLimit()
|
||||
.getLibreOfficeSessionLimit();
|
||||
case PDFTOHTML ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getSessionLimit()
|
||||
.getPdfToHtmlSessionLimit();
|
||||
case PYTHON_OPENCV ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getSessionLimit()
|
||||
.getPythonOpenCvSessionLimit();
|
||||
case WEASYPRINT ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getSessionLimit()
|
||||
.getWeasyPrintSessionLimit();
|
||||
case INSTALL_APP ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getSessionLimit()
|
||||
.getInstallAppSessionLimit();
|
||||
case TESSERACT ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getSessionLimit()
|
||||
.getTesseractSessionLimit();
|
||||
case QPDF ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getSessionLimit()
|
||||
.getQpdfSessionLimit();
|
||||
case CALIBRE ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getSessionLimit()
|
||||
.getCalibreSessionLimit();
|
||||
};
|
||||
|
||||
long timeoutMinutes =
|
||||
switch (key) {
|
||||
case LIBRE_OFFICE -> 30;
|
||||
case PDFTOHTML -> 20;
|
||||
case OCR_MY_PDF -> 30;
|
||||
case PYTHON_OPENCV -> 30;
|
||||
case GHOSTSCRIPT -> 30;
|
||||
case WEASYPRINT -> 30;
|
||||
case INSTALL_APP -> 60;
|
||||
case CALIBRE -> 30;
|
||||
case LIBRE_OFFICE ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getTimeoutMinutes()
|
||||
.getLibreOfficeTimeoutMinutes();
|
||||
case PDFTOHTML ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getTimeoutMinutes()
|
||||
.getPdfToHtmlTimeoutMinutes();
|
||||
case PYTHON_OPENCV ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getTimeoutMinutes()
|
||||
.getPythonOpenCvTimeoutMinutes();
|
||||
case WEASYPRINT ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getTimeoutMinutes()
|
||||
.getWeasyPrintTimeoutMinutes();
|
||||
case INSTALL_APP ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getTimeoutMinutes()
|
||||
.getInstallAppTimeoutMinutes();
|
||||
case TESSERACT ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getTimeoutMinutes()
|
||||
.getTesseractTimeoutMinutes();
|
||||
case QPDF ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getTimeoutMinutes()
|
||||
.getQpdfTimeoutMinutes();
|
||||
case CALIBRE ->
|
||||
applicationProperties
|
||||
.getProcessExecutor()
|
||||
.getTimeoutMinutes()
|
||||
.getCalibreTimeoutMinutes();
|
||||
};
|
||||
return new ProcessExecutor(semaphoreLimit, liveUpdates, timeoutMinutes);
|
||||
});
|
||||
|
||||
@@ -35,7 +35,7 @@ spring.mvc.async.request-timeout=${SYSTEM_CONNECTIONTIMEOUTMILLISECONDS:1200000}
|
||||
#spring.thymeleaf.prefix=file:/customFiles/templates/,classpath:/templates/
|
||||
#spring.thymeleaf.cache=false
|
||||
|
||||
spring.datasource.url=jdbc:h2:file:./configs/stirling-pdf-DB;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
|
||||
spring.datasource.url=jdbc:h2:file:./configs/stirling-pdf-DB-2.3.232;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
|
||||
spring.datasource.driver-class-name=org.h2.Driver
|
||||
spring.datasource.username=sa
|
||||
spring.datasource.password=
|
||||
@@ -50,4 +50,4 @@ springdoc.swagger-ui.url=/v1/api-docs
|
||||
|
||||
|
||||
posthog.api.key=phc_fiR65u5j6qmXTYL56MNrLZSWqLaDW74OrZH0Insd2xq
|
||||
posthog.host=https://eu.i.posthog.com
|
||||
posthog.host=https://eu.i.posthog.com
|
||||
|
||||
@@ -76,17 +76,18 @@ donate=تبرع
|
||||
color=لون
|
||||
sponsor=راعٍ
|
||||
info=معلومات
|
||||
pro=Pro
|
||||
page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
pro=محترف
|
||||
page=صفحة
|
||||
pages=صفحات
|
||||
loading=جارٍ التحميل...
|
||||
addToDoc=إضافة إلى المستند
|
||||
reset=إعداة ضبط
|
||||
|
||||
legal.privacy=Privacy Policy
|
||||
legal.terms=Terms and Conditions
|
||||
legal.accessibility=Accessibility
|
||||
legal.cookie=Cookie Policy
|
||||
legal.impressum=Impressum
|
||||
legal.privacy=سياسة الخصوصية
|
||||
legal.terms=شروط الاستخدام
|
||||
legal.accessibility=إمكانية الوصول
|
||||
legal.cookie=سياسة ملفات تعريف الارتباط
|
||||
legal.impressum=بيان الهوية
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
@@ -116,21 +117,21 @@ pipelineOptions.validateButton=تحقق
|
||||
########################
|
||||
# ENTERPRISE EDITION #
|
||||
########################
|
||||
enterpriseEdition.button=Upgrade to Pro
|
||||
enterpriseEdition.warning=This feature is only available to Pro users.
|
||||
enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features.
|
||||
enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro
|
||||
enterpriseEdition.button=ترقية إلى محترف
|
||||
enterpriseEdition.warning=هذه الخاصية متوفرة فقط للمستخدمين المحترفين.
|
||||
enterpriseEdition.yamlAdvert=يدعم Stirling PDF Pro ملفات الإعدادات YAML وميزات SSO أخرى
|
||||
enterpriseEdition.ssoAdvert=هل تبحث عن المزيد من ميزات إدارة المستخدمين؟ اطلع على Stirling PDF Pro
|
||||
|
||||
|
||||
#################
|
||||
# Analytics #
|
||||
#################
|
||||
analytics.title=Do you want make Stirling PDF better?
|
||||
analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.
|
||||
analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.
|
||||
analytics.enable=Enable analytics
|
||||
analytics.disable=Disable analytics
|
||||
analytics.settings=You can change the settings for analytics in the config/settings.yml file
|
||||
analytics.title=هل تريد تحسين Stirling PDF؟
|
||||
analytics.paragraph1=Stirling PDF يحتوي على إحصائيات مختصة للمساعدة في تحسين المنتج. لا نتبع أي معلومات شخصية أو محتوى الملفات.
|
||||
analytics.paragraph2=يرجى مراعاة تفعيل الإحصائيات لمساعدتنا على نمو Stirling-PDF وتوفير فهم أفضل لمستخدمينا.
|
||||
analytics.enable=تفعيل الإحصائيات
|
||||
analytics.disable=تعطيل الإحصائيات
|
||||
analytics.settings=يمكنك تغيير إعدادات الإحصائيات في ملف config/settings.yml
|
||||
|
||||
#############
|
||||
# NAVBAR #
|
||||
@@ -141,13 +142,14 @@ navbar.language=اللغات
|
||||
navbar.settings=إعدادات
|
||||
navbar.allTools=أدوات
|
||||
navbar.multiTool=أدوات متعددة
|
||||
navbar.search=البحث
|
||||
navbar.sections.organize=تنظيم
|
||||
navbar.sections.convertTo=تحويل الى PDF
|
||||
navbar.sections.convertFrom=تحويل من PDF
|
||||
navbar.sections.security=التوقيع والأمان
|
||||
navbar.sections.advance=متقدم
|
||||
navbar.sections.edit=عرض وتعديل
|
||||
navbar.sections.popular=Popular
|
||||
navbar.sections.popular=المفضل
|
||||
|
||||
#############
|
||||
# SETTINGS #
|
||||
@@ -245,7 +247,8 @@ database.fileNotFound=لم يتم العثور على الملف
|
||||
database.fileNullOrEmpty=يجب ألا يكون الملف فارغًا أو خاليًا
|
||||
database.failedImportFile=فشل استيراد الملف
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.expired=لقد انتهت جلستك. يرجى تحديث الصفحة والمحاولة مرة أخرى
|
||||
session.refreshPage=تحديث الصفحة
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -505,28 +508,28 @@ home.removeImagePdf.desc=إزالة الصورة من PDF لتقليل حجم ا
|
||||
removeImagePdf.tags=إزالة الصورة,عمليات الصفحة,الخلفية,جانب الخادم
|
||||
|
||||
|
||||
home.splitPdfByChapters.title=Split PDF by Chapters
|
||||
home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure.
|
||||
splitPdfByChapters.tags=split,chapters,bookmarks,organize
|
||||
home.splitPdfByChapters.title=تجزئة المستندات PDF حسب الفصول
|
||||
home.splitPdfByChapters.desc=قسم مستند PDF إلى ملفات متعددة بناءً على هيكل فصوله.
|
||||
splitPdfByChapters.tags=تجزئة، فصول، علامات تبويب، تنظيم
|
||||
|
||||
#replace-invert-color
|
||||
replace-color.title=Replace-Invert-Color
|
||||
replace-color.header=Replace-Invert Color PDF
|
||||
home.replaceColorPdf.title=Replace and Invert Color
|
||||
home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size
|
||||
replaceColorPdf.tags=Replace Color,Page operations,Back end,server side
|
||||
replace-color.selectText.1=Replace or Invert color Options
|
||||
replace-color.selectText.2=Default(Default high contrast colors)
|
||||
replace-color.selectText.3=Custom(Customized colors)
|
||||
replace-color.selectText.4=Full-Invert(Invert all colors)
|
||||
replace-color.selectText.5=High contrast color options
|
||||
replace-color.selectText.6=white text on black background
|
||||
replace-color.selectText.7=Black text on white background
|
||||
replace-color.selectText.8=Yellow text on black background
|
||||
replace-color.selectText.9=Green text on black background
|
||||
replace-color.selectText.10=Choose text Color
|
||||
replace-color.selectText.11=Choose background Color
|
||||
replace-color.submit=Replace
|
||||
replace-color.title=إستبدال-عكس اللون
|
||||
replace-color.header=استبدال-عكس لون PDF
|
||||
home.replaceColorPdf.title=إستبدال و عكس الألوان
|
||||
home.replaceColorPdf.desc=استبدال الألوان للنصوص والخلفيات في المستندات PDF وإلغاء تعكير اللون الكامل للمستند لتقليل حجم الملف
|
||||
replaceColorPdf.tags=استبدال اللون، عمليات الصفحة، الخلفية، جانب الخادم
|
||||
replace-color.selectText.1=خيارات استبدال أو عكس الألوان
|
||||
replace-color.selectText.2=افتراضي(ألوان التباين العالي الافتراضية)
|
||||
replace-color.selectText.3=خصيصة (ألوان شخصية)
|
||||
replace-color.selectText.4=عكس كامل(عكس جميع الألوان)
|
||||
replace-color.selectText.5=خيارات ألوان التباين العالي
|
||||
replace-color.selectText.6=نص أبيض على خلفية سوداء
|
||||
replace-color.selectText.7=نص أسود على خلفية بيضاء
|
||||
replace-color.selectText.8=نص صفرة على خلفية سوداء
|
||||
replace-color.selectText.9=نص أخضر على خلفية سوداء
|
||||
replace-color.selectText.10=اختر لون النص
|
||||
replace-color.selectText.11=اختر لون الخلفية
|
||||
replace-color.submit=استبدال
|
||||
|
||||
|
||||
|
||||
@@ -553,9 +556,9 @@ login.oauth2AccessDenied=تم رفض الوصول
|
||||
login.oauth2InvalidTokenResponse=استجابة الرمز المميز غير صالحة
|
||||
login.oauth2InvalidIdToken=رمز الهوية غير صالح
|
||||
login.userIsDisabled=تم تعطيل المستخدم، تم حظر تسجيل الدخول حاليًا باستخدام اسم المستخدم هذا. يرجى الاتصال بالمسؤول.
|
||||
login.alreadyLoggedIn=You are already logged in to
|
||||
login.alreadyLoggedIn2=devices. Please log out of the devices and try again.
|
||||
login.toManySessions=You have too many active sessions
|
||||
login.alreadyLoggedIn=لقد تسجل دخولًا إلى
|
||||
login.alreadyLoggedIn2=أجهزة أخرى. يرجى تسجيل الخروج من الأجهزة وحاول مرة أخرى.
|
||||
login.toManySessions=لديك عدة جلسات نشطة
|
||||
|
||||
#auto-redact
|
||||
autoRedact.title=حجب تلقائي
|
||||
@@ -730,7 +733,7 @@ pageLayout.submit=إرسال
|
||||
scalePages.title=ضبط مقياس الصفحة
|
||||
scalePages.header=ضبط مقياس الصفحة
|
||||
scalePages.pageSize=حجم صفحة المستند.
|
||||
scalePages.keepPageSize=Original Size
|
||||
scalePages.keepPageSize=الحجم الأصلي
|
||||
scalePages.scaleFactor=مستوى التكبير (الاقتصاص) للصفحة.
|
||||
scalePages.submit=إرسال
|
||||
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=إظهار التوقيع
|
||||
certSign.reason=السبب
|
||||
certSign.location=الموقع
|
||||
certSign.name=الاسم
|
||||
certSign.showLogo=عرض الشعار
|
||||
certSign.submit=توقيع PDF
|
||||
|
||||
|
||||
@@ -784,9 +788,9 @@ compare.highlightColor.2=لون التظليل 2:
|
||||
compare.document.1=المستند 1
|
||||
compare.document.2=المستند 2
|
||||
compare.submit=مقارنة
|
||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
||||
compare.complex.message=أو كلا المستندين المقدمين كبيران حجمًا، مما يؤدي إلى تقليل دقة المقارنة
|
||||
compare.large.file.message=أو كلا المستندين المقدمين كبيرة حجمهما للتعامل معهما
|
||||
compare.no.text.message=أحد أو كلي المستندات المرجوة للمقارنة لا يحتوي على محتوى نصي. يرجى اختيار مستندات تحتوي على نص لم يتم التعرف عليه.
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=الكتب والكوميكس إلى PDF
|
||||
@@ -809,12 +813,17 @@ sign.draw=رسم التوقيع
|
||||
sign.text=إدخال النص
|
||||
sign.clear=مسح
|
||||
sign.add=إضافة
|
||||
sign.saved=Saved Signatures
|
||||
sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.saved=توقيعات تم حفظها
|
||||
sign.save=حفظ توقيع
|
||||
sign.personalSigs=توقيعات شخصية
|
||||
sign.sharedSigs=توقيعات مشتركة
|
||||
sign.noSavedSigs=لم يتم العثور على توقيعات محفوظة
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=إصلاح
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=وضع التعرف الضوئي على الحروف
|
||||
ocr.selectText.11=إزالة الصور بعد التعرف الضوئي على الحروف (يزيل كل الصور، يكون مفيدًا فقط إذا كان جزءًا من خطوة التحويل)
|
||||
ocr.selectText.12=نوع العرض (متقدم)
|
||||
ocr.help=يرجى قراءة هذه الوثائق حول كيفية استخدام هذا للغات أخرى و/أو الاستخدام ليس في Docker
|
||||
ocr.credit=تستخدم هذه الخدمة OCRmyPDF و Tesseract للتعرف الضوئي على الحروف.
|
||||
ocr.credit=تستخدم هذه الخدمة qpdf و Tesseract للتعرف الضوئي على الحروف.
|
||||
ocr.submit=معالجة PDF باستخدام OCR
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=تحويل إلى PDF
|
||||
#compress
|
||||
compress.title=ضغط
|
||||
compress.header=ضغط ملف PDF
|
||||
compress.credit=تستخدم هذه الخدمة OCRmyPDF لضغط / تحسين PDF.
|
||||
compress.credit=تستخدم هذه الخدمة qpdf لضغط / تحسين PDF.
|
||||
compress.selectText.1=الوضع اليدوي - من 1 إلى 4
|
||||
compress.selectText.2=مستوى التحسين:
|
||||
compress.selectText.3=4 (رهيب للصور النصية)
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(مثال: 1,3,2 أو 4-8,2,10-12 أو 2n-1)
|
||||
multiTool.title=أداة متعددة PDF
|
||||
multiTool.header=أداة متعددة PDF
|
||||
multiTool.uploadPrompts=اسم الملف
|
||||
multiTool.selectAll=تحديد الكل
|
||||
multiTool.deselectAll=إلغاء تحديد الكل
|
||||
multiTool.selectPages=تحديد الصفحة
|
||||
multiTool.selectedPages=الصفحات المحددة
|
||||
multiTool.page=صفحة
|
||||
multiTool.deleteSelected=حذف المحدد
|
||||
multiTool.downloadAll=تصدير
|
||||
multiTool.downloadSelected=تصدير المحدد
|
||||
|
||||
multiTool.insertPageBreak=إدراج فاصل صفحات
|
||||
multiTool.addFile=إضافة ملف
|
||||
multiTool.rotateLeft=تدوير إلى اليسار
|
||||
multiTool.rotateRight=تدوير إلى اليمين
|
||||
multiTool.split=تقسيم
|
||||
multiTool.moveLeft=تحريك إلى اليسار
|
||||
multiTool.moveRight=تحريك إلى اليمين
|
||||
multiTool.delete=حذف
|
||||
multiTool.dragDropMessage=الصفحات المحددة
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=هذه الميزة متوفرة في <a href="{0}">صفحة الأدوات المتعددة</a> لدينا. اطلع عليها للحصول على واجهة مستخدم محسّنة لكل صفحة وميزات إضافية!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=عرض PDF
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=تغيير
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF إلى PDF/A
|
||||
pdfToPDFA.header=PDF إلى PDF/A
|
||||
pdfToPDFA.credit=تستخدم هذه الخدمة ghostscript لتحويل PDF/A.
|
||||
pdfToPDFA.credit=تستخدم هذه الخدمة qpdf لتحويل PDF/A.
|
||||
pdfToPDFA.submit=تحويل
|
||||
pdfToPDFA.tip=لا يعمل حاليًا لمدخلات متعددة في وقت واحد
|
||||
pdfToPDFA.outputFormat=تنسيق الإخراج
|
||||
@@ -1191,8 +1221,8 @@ licenses.license=الترخيص
|
||||
survey.nav=استطلاع
|
||||
survey.title=استطلاع Stirling-PDF
|
||||
survey.description=Stirling-PDF لا يحتوي على تتبع لذا نريد أن نسمع من مستخدمينا لتحسين Stirling-PDF!
|
||||
survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here:
|
||||
survey.changes2=With these changes we are getting paid business support and funding
|
||||
survey.changes=تحديث Stirling-PDF منذ آخر استبيان! للحصول على المزيد من المعلومات الرجاء زيارة مقالتنا في المدونة هنا:
|
||||
survey.changes2=مع هذه التحديثات، نستفيد من الدعم العملي والمنحة المالية
|
||||
survey.please=يرجى النظر في المشاركة في استطلاعنا!
|
||||
survey.disabled=(سيتم تعطيل النافذة المنبثقة للاستطلاع في التحديثات التالية ولكنها ستكون متاحة في أسفل الصفحة)
|
||||
survey.button=المشاركة في الاستطلاع
|
||||
@@ -1220,13 +1250,13 @@ removeImage.removeImage=إزالة الصورة
|
||||
removeImage.submit=إزالة الصورة
|
||||
|
||||
|
||||
splitByChapters.title=Split PDF by Chapters
|
||||
splitByChapters.header=Split PDF by Chapters
|
||||
splitByChapters.bookmarkLevel=Bookmark Level
|
||||
splitByChapters.includeMetadata=Include Metadata
|
||||
splitByChapters.allowDuplicates=Allow Duplicates
|
||||
splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure.
|
||||
splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.).
|
||||
splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF.
|
||||
splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs.
|
||||
splitByChapters.submit=Split PDF
|
||||
splitByChapters.title=تجزئة المستند حسب الفصول
|
||||
splitByChapters.header=تجزئة المستند حسب الفصول
|
||||
splitByChapters.bookmarkLevel=مستوى العلامات التذكارية
|
||||
splitByChapters.includeMetadata=شامل البيانات المرفقة
|
||||
splitByChapters.allowDuplicates=السماح بالتكرار
|
||||
splitByChapters.desc.1=هذه الأداة تقوم بتقسيم ملف PDF إلى عدة ملفات PDF استناداً إلى بنية فصوله
|
||||
splitByChapters.desc.2=مستوى الإشارة المرجعية: اختر مستوى الإشارات المرجعية التي تريد استخدامها للتقسيم (0 للمستوى الأعلى، 1 للمستوى الثاني، وما إلى ذلك)
|
||||
splitByChapters.desc.3=تمثيل البيانات الأصلية: إذا تم اختيارها، سترمز البيانات المرجعية الأصلية إلى كل PDF مجزأ.
|
||||
splitByChapters.desc.4=سماح بالتكرار: إذا تم اختياره، يسمح بوجود معاينات متعددة في الصفحة نفسها لخلق ملفات PDF منفصلة.
|
||||
splitByChapters.submit=تقطيع ملف PDF
|
||||
|
||||
1262
src/main/resources/messages_az_AZ.properties
Normal file
1262
src/main/resources/messages_az_AZ.properties
Normal file
File diff suppressed because it is too large
Load Diff
@@ -81,6 +81,7 @@ page=Страница
|
||||
pages=Страници
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Политика за поверителност
|
||||
legal.terms=Правила и условия
|
||||
@@ -141,6 +142,7 @@ navbar.language=Езици
|
||||
navbar.settings=Настройки
|
||||
navbar.allTools=Инструменти
|
||||
navbar.multiTool=Мулти инструменти
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Организирайте
|
||||
navbar.sections.convertTo=Преобразуване в PDF
|
||||
navbar.sections.convertFrom=Преобразуване от PDF
|
||||
@@ -246,6 +248,7 @@ database.fileNullOrEmpty=Файлът не трябва да е нулев ил
|
||||
database.failedImportFile=Неуспешно импортиране на файл
|
||||
|
||||
session.expired=Вашата сесия е изтекла. Моля, опреснете страницата и опитайте отново.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=Показване на подпис
|
||||
certSign.reason=Причина
|
||||
certSign.location=Местоположение
|
||||
certSign.name=Име
|
||||
certSign.showLogo=Show Logo
|
||||
certSign.submit=Подпишете PDF
|
||||
|
||||
|
||||
@@ -814,7 +818,12 @@ sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Поправи
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=OCR режим
|
||||
ocr.selectText.11=Премахване на изображения след OCR (Премахва ВСИЧКИ изображения, полезно само ако е част от стъпката на преобразуване)
|
||||
ocr.selectText.12=Тип изобразяване (Разширен)
|
||||
ocr.help=Моля, прочетете тази документация за това как да използвате това за други езици и/или да не използвате в docker
|
||||
ocr.credit=Тази услуга използва OCRmyPDF и Tesseract за OCR.
|
||||
ocr.credit=Тази услуга използва qpdf и Tesseract за OCR.
|
||||
ocr.submit=Обработка на PDF чрез OCR
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Преобразуване към PDF
|
||||
#compress
|
||||
compress.title=Компресиране
|
||||
compress.header=Компресиране на PDF
|
||||
compress.credit=Тази услуга използва Ghostscript за PDF компресиране/оптимизиране.
|
||||
compress.credit=Тази услуга използва qpdf за PDF компресиране/оптимизиране.
|
||||
compress.selectText.1=Ръчен режим - от 1 до 4
|
||||
compress.selectText.2=Ниво на оптимизация:
|
||||
compress.selectText.3=4 (Ужасно за текстови изображения)
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(напр. 1,3,2 или 4-8,2,10-12 или 2n-1)
|
||||
multiTool.title=PDF Мулти инструмент
|
||||
multiTool.header=PDF Мулти инструмент
|
||||
multiTool.uploadPrompts=Име на файл
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=Преглед на PDF
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=Промени
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF към PDF/A
|
||||
pdfToPDFA.header=PDF към PDF/A
|
||||
pdfToPDFA.credit=Тази услуга използва ghostscript за PDF/A преобразуване.
|
||||
pdfToPDFA.credit=Тази услуга използва qpdf за PDF/A преобразуване.
|
||||
pdfToPDFA.submit=Преобразуване
|
||||
pdfToPDFA.tip=В момента не работи за няколко входа наведнъж
|
||||
pdfToPDFA.outputFormat=Изходен формат
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,8 +3,8 @@
|
||||
###########
|
||||
# the direction that the language is written (ltr = left to right, rtl = right to left)
|
||||
language.direction=ltr
|
||||
addPageNumbers.fontSize=Font Size
|
||||
addPageNumbers.fontName=Font Name
|
||||
addPageNumbers.fontSize=Velikost písma
|
||||
addPageNumbers.fontName=Název písma
|
||||
pdfPrompt=Vyberte PDF soubory
|
||||
multiPdfPrompt=Vyberte PDF soubory (2+)
|
||||
multiPdfDropPrompt=Vyberte (nebo přetáhněte) všechny požadované PDF soubory
|
||||
@@ -56,12 +56,12 @@ userNotFoundMessage=Uživatel nenalezen.
|
||||
incorrectPasswordMessage=Současné heslo není správné.
|
||||
usernameExistsMessage=Nové uživatelské jméno již existuje.
|
||||
invalidUsernameMessage=Nesprávné uživatelské jméno, smí obsahovat pouze písmena, číslice a následující speciální znaky @._+- nebo musí být validní emailová adresa.
|
||||
invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end.
|
||||
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||
invalidPasswordMessage=Heslo nemůže být prázdné a nemůže mít mezery na začátku nebo konci.
|
||||
confirmPasswordErrorMessage=Nové heslo musí shodovat s potvrzujícím novým heslem.
|
||||
deleteCurrentUserMessage=Nelze smazat aktuální přihlášeného uživatele.
|
||||
deleteUsernameExistsMessage=Uživatelské jméno neexistuje a nelze ho smazat.
|
||||
downgradeCurrentUserMessage=Nelze snížit roli aktuálního uživatele.
|
||||
disabledCurrentUserMessage=The current user cannot be disabled
|
||||
disabledCurrentUserMessage=Současný uživatel nemůže být zakázán
|
||||
downgradeCurrentUserLongMessage=Nelze snížit roli aktuálního uživatele. Proto nebude aktuální uživatel zobrazen.
|
||||
userAlreadyExistsOAuthMessage=Uživatel již existuje jako OAuth2 uživatel.
|
||||
userAlreadyExistsWebMessage=Uživatel již existuje jako webový uživatel.
|
||||
@@ -75,18 +75,19 @@ visitGithub=Navštivte Github repozitář
|
||||
donate=Přispějte
|
||||
color=Barva
|
||||
sponsor=Sponzor
|
||||
info=Info
|
||||
info=Informace
|
||||
pro=Pro
|
||||
page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
page=Strana
|
||||
pages=Strany
|
||||
loading=Načítání...
|
||||
addToDoc=Přidat do dokumentu
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Privacy Policy
|
||||
legal.terms=Terms and Conditions
|
||||
legal.accessibility=Accessibility
|
||||
legal.cookie=Cookie Policy
|
||||
legal.impressum=Impressum
|
||||
legal.privacy=Politika soukromí
|
||||
legal.terms=Podmínky použití
|
||||
legal.accessibility=Snaha o přístupnost
|
||||
legal.cookie=Zásada cookies
|
||||
legal.impressum=Odborné prohlášení
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
@@ -98,7 +99,7 @@ pipeline.defaultOption=Vlastní
|
||||
pipeline.submitButton=Odeslat
|
||||
pipeline.help=Pomoc s pipeline
|
||||
pipeline.scanHelp=Pomoc se skenováním adresáře
|
||||
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||
pipeline.deletePrompt=Opravdu chcete smazat tento kanál?
|
||||
|
||||
######################
|
||||
# Pipeline Options #
|
||||
@@ -116,21 +117,21 @@ pipelineOptions.validateButton=Ověřit
|
||||
########################
|
||||
# ENTERPRISE EDITION #
|
||||
########################
|
||||
enterpriseEdition.button=Upgrade to Pro
|
||||
enterpriseEdition.warning=This feature is only available to Pro users.
|
||||
enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features.
|
||||
enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro
|
||||
enterpriseEdition.button=Upgradujte na Pro
|
||||
enterpriseEdition.warning=Tato funkce je k dispozici pouze pro uživatelé s předplatným Pro.
|
||||
enterpriseEdition.yamlAdvert=Stirling PDF Pro podporuje konfigurační soubory YAML a další funkce SSO.
|
||||
enterpriseEdition.ssoAdvert=Hledáte větší počet správních funkcí uživatelů? Podívejte se na Stirling PDF Pro
|
||||
|
||||
|
||||
#################
|
||||
# Analytics #
|
||||
#################
|
||||
analytics.title=Do you want make Stirling PDF better?
|
||||
analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.
|
||||
analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.
|
||||
analytics.enable=Enable analytics
|
||||
analytics.disable=Disable analytics
|
||||
analytics.settings=You can change the settings for analytics in the config/settings.yml file
|
||||
analytics.title=Chcete-li zlepšit Stirling PDF, pomozte nám.
|
||||
analytics.paragraph1=Stirling PDF má povolené analýzy pro to, abychom mohli zlepšovat produkt. Nezaznamenáváme žádné osobní informace nebo obsah souborů.
|
||||
analytics.paragraph2=Považte za možnost povolení analýz k tomu, abychom mohli růst Stirling-PDF a lépe pochopit naši skupinu uživatelů.
|
||||
analytics.enable=Zapnout analýzy
|
||||
analytics.disable=Vypnout analýzy
|
||||
analytics.settings=Můžete změnit nastavení pro analýzy v souboru config/settings.yml
|
||||
|
||||
#############
|
||||
# NAVBAR #
|
||||
@@ -141,13 +142,14 @@ navbar.language=Jazyky
|
||||
navbar.settings=Nastavení
|
||||
navbar.allTools=Nástroje
|
||||
navbar.multiTool=Multifunkční nástroje
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Organizovat
|
||||
navbar.sections.convertTo=Převést do PDF
|
||||
navbar.sections.convertFrom=Převést z PDF
|
||||
navbar.sections.security=Podpis a Bezpečnost
|
||||
navbar.sections.advance=Pokročilé
|
||||
navbar.sections.edit=Prohlédnout a Upravit
|
||||
navbar.sections.popular=Popular
|
||||
navbar.sections.popular=Populární
|
||||
|
||||
#############
|
||||
# SETTINGS #
|
||||
@@ -164,7 +166,7 @@ settings.zipThreshold=Zazipuj soubory, když překročí počet stažených soub
|
||||
settings.signOut=Odhlásit
|
||||
settings.accountSettings=Nastavení Účtu
|
||||
settings.bored.help=Umožňuje hru s easter eggy
|
||||
settings.cacheInputs.name=Save form inputs
|
||||
settings.cacheInputs.name=Ukládání vstupů formuláře
|
||||
settings.cacheInputs.help=Umožňuje uložit dříve použité vstupy pro budoucí použití
|
||||
|
||||
changeCreds.title=Změnit pověření
|
||||
@@ -200,13 +202,13 @@ account.syncToAccount=Synchronizovat Účet <- Prohlížeč
|
||||
|
||||
|
||||
adminUserSettings.title=Nastavení Uživatelského Nastavení
|
||||
adminUserSettings.header=Admin User Control Settings
|
||||
adminUserSettings.admin=Admin
|
||||
adminUserSettings.header=Nastavení správce uživatelů
|
||||
adminUserSettings.admin=Správce
|
||||
adminUserSettings.user=Uživatel
|
||||
adminUserSettings.addUser=Přidat Nového Uživatele
|
||||
adminUserSettings.deleteUser=Delete User
|
||||
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||
adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled?
|
||||
adminUserSettings.deleteUser=Smazat uživatele
|
||||
adminUserSettings.confirmDeleteUser=Měli by se uživatel smazat?
|
||||
adminUserSettings.confirmChangeUserStatus=Měli by se změnit stav uživatele (vytřída/aktivace)?
|
||||
adminUserSettings.usernameInfo=Uživatelské Jméno může obsahovat pouze písmena, čísla a následující speciální znaky @._+- nebo musí být správná emailová adresa.
|
||||
adminUserSettings.roles=Role
|
||||
adminUserSettings.role=Role
|
||||
@@ -220,32 +222,33 @@ adminUserSettings.forceChange=Vynutit uživateli změnu hesla při přihlášen
|
||||
adminUserSettings.submit=Uložit Uživatele
|
||||
adminUserSettings.changeUserRole=Zmenit Roli Uživatele
|
||||
adminUserSettings.authenticated=Ověřeno
|
||||
adminUserSettings.editOwnProfil=Edit own profile
|
||||
adminUserSettings.enabledUser=enabled user
|
||||
adminUserSettings.disabledUser=disabled user
|
||||
adminUserSettings.activeUsers=Active Users:
|
||||
adminUserSettings.disabledUsers=Disabled Users:
|
||||
adminUserSettings.totalUsers=Total Users:
|
||||
adminUserSettings.lastRequest=Last Request
|
||||
adminUserSettings.editOwnProfil=Upravit vlastní profil
|
||||
adminUserSettings.enabledUser=povolený uživatel
|
||||
adminUserSettings.disabledUser=zakázáný uživatel
|
||||
adminUserSettings.activeUsers=Aktivní uživatelé:
|
||||
adminUserSettings.disabledUsers=Zakázанные uživatelé:
|
||||
adminUserSettings.totalUsers=Celkem uživatelů:
|
||||
adminUserSettings.lastRequest=Poslední žádost
|
||||
|
||||
|
||||
database.title=Database Import/Export
|
||||
database.header=Database Import/Export
|
||||
database.fileName=File Name
|
||||
database.creationDate=Creation Date
|
||||
database.fileSize=File Size
|
||||
database.deleteBackupFile=Delete Backup File
|
||||
database.importBackupFile=Import Backup File
|
||||
database.downloadBackupFile=Download Backup File
|
||||
database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application.
|
||||
database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention.
|
||||
database.submit=Import Backup
|
||||
database.importIntoDatabaseSuccessed=Import into database successed
|
||||
database.title=Import/Export databáze
|
||||
database.header=Import/Export databáze
|
||||
database.fileName=Název souboru
|
||||
database.creationDate=Datum vytvoření
|
||||
database.fileSize=Velikost souboru
|
||||
database.deleteBackupFile=Smazat záložní soubor
|
||||
database.importBackupFile=Import zálohy souboru
|
||||
database.downloadBackupFile=Stáhnout zálohový soubor
|
||||
database.info_1=Při importu dat je důležité zajistit správnou strukturu. Pokud jste nejistí, jak se chovat, hledajte konzultaci a podporu od profesionala. Chyba v struktuře může vést k selhání aplikace, dokonce i k tomu, že by aplikace nemohla být spuštěna.
|
||||
database.info_2=Název souboru nezáleží při nahrávání. Bude jeho zpětně znovu pojmenován podle formáту backup_user_yyyyMMddHHmm.sql, což zajišťuje konzistentní pravidlo označení.
|
||||
database.submit=Import zálohy
|
||||
database.importIntoDatabaseSuccessed=Import do databáze byl úspěšný
|
||||
database.fileNotFound=File not Found
|
||||
database.fileNullOrEmpty=File must not be null or empty
|
||||
database.fileNullOrEmpty=Soubor nemůže být null nebo prázdný
|
||||
database.failedImportFile=Failed Import File
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.expired=Vaše sesace vypršela. Prosím obnovte stránku a zkusit to znovu.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -349,7 +352,7 @@ PDFToPresentation.tags=snímky,přehled,kancelář,microsoft
|
||||
|
||||
home.PDFToText.title=PDF na RTF (Text)
|
||||
home.PDFToText.desc=Převod PDF do formátu Textu nebo RTF
|
||||
PDFToText.tags=richformat,richtextformat,rich text format
|
||||
PDFToText.tags=bohatý formátování, bohaté formátování, bohatej formátkace textu
|
||||
|
||||
home.PDFToHTML.title=PDF na HTML
|
||||
home.PDFToHTML.desc=Převod PDF do formátu HTML
|
||||
@@ -392,9 +395,9 @@ home.certSign.title=Podpis s certifikátem
|
||||
home.certSign.desc=Podpis PDF s certifikátem/klíčem (PEM/P12)
|
||||
certSign.tags=autentizace,PEM,P12,oficiální,šifrování
|
||||
|
||||
home.removeCertSign.title=Remove Certificate Sign
|
||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
||||
home.removeCertSign.title=Odstranit certifikátovou podepsanost
|
||||
home.removeCertSign.desc=Odstranit certifikátovou podepsanost z PDF
|
||||
removeCertSign.tags=autentizace, PEM, P12, úřední, dešifrování
|
||||
|
||||
home.pageLayout.title=Vícestránkové rozložení
|
||||
home.pageLayout.desc=Sloučení více stránek dokumentu PDF do jedné stránky
|
||||
@@ -500,33 +503,33 @@ home.BookToPDF.title=Kniha na PDF
|
||||
home.BookToPDF.desc=Převádí formáty knih/komiksů do PDF pomocí calibre
|
||||
BookToPDF.tags=Kniha,Komiks,Calibre,Konvertovat,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf
|
||||
|
||||
home.removeImagePdf.title=Remove image
|
||||
home.removeImagePdf.desc=Remove image from PDF to reduce file size
|
||||
removeImagePdf.tags=Remove Image,Page operations,Back end,server side
|
||||
home.removeImagePdf.title=Odstranit obrázek
|
||||
home.removeImagePdf.desc=Odstranit obrázek z PDF k snížení velikosti souboru
|
||||
removeImagePdf.tags=Odstranit obrázek, operace na stránkách, záložní strana, serverové čidla
|
||||
|
||||
|
||||
home.splitPdfByChapters.title=Split PDF by Chapters
|
||||
home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure.
|
||||
splitPdfByChapters.tags=split,chapters,bookmarks,organize
|
||||
home.splitPdfByChapters.title=Rozdělit PDF podle kapitol
|
||||
home.splitPdfByChapters.desc=Rozdělit PDF do více souborů na základě jeho struktury kapitol.
|
||||
splitPdfByChapters.tags=rozdělení, kapitoly, zápisky, organizace
|
||||
|
||||
#replace-invert-color
|
||||
replace-color.title=Replace-Invert-Color
|
||||
replace-color.header=Replace-Invert Color PDF
|
||||
replace-color.header=Nahradit inverzní barvu PDF
|
||||
home.replaceColorPdf.title=Replace and Invert Color
|
||||
home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size
|
||||
replaceColorPdf.tags=Replace Color,Page operations,Back end,server side
|
||||
replace-color.selectText.1=Replace or Invert color Options
|
||||
replace-color.selectText.2=Default(Default high contrast colors)
|
||||
replace-color.selectText.3=Custom(Customized colors)
|
||||
replace-color.selectText.4=Full-Invert(Invert all colors)
|
||||
replace-color.selectText.5=High contrast color options
|
||||
replace-color.selectText.6=white text on black background
|
||||
replace-color.selectText.7=Black text on white background
|
||||
replace-color.selectText.8=Yellow text on black background
|
||||
replace-color.selectText.9=Green text on black background
|
||||
replace-color.selectText.10=Choose text Color
|
||||
replace-color.selectText.11=Choose background Color
|
||||
replace-color.submit=Replace
|
||||
home.replaceColorPdf.desc=Nahradit barvy pro text a pozadí v PDF a inverzní celý barvový spektrum PDF k snižení velikosti souboru
|
||||
replaceColorPdf.tags=Nahrazovat barvu, operace na stránkách, záložní strana, serverové čidla
|
||||
replace-color.selectText.1=Možnosti nahrazení nebo inverze barev
|
||||
replace-color.selectText.2=Výchozí (vysoká kontrastová barva)
|
||||
replace-color.selectText.3=Vlastní (vlastní barvy)
|
||||
replace-color.selectText.4=Celé inverzní (inverzní všechny barvy)
|
||||
replace-color.selectText.5=Možnosti vysoké kontrastové barvy
|
||||
replace-color.selectText.6=Bílá text na černém pozadí
|
||||
replace-color.selectText.7=Černý text na bílé pozadí
|
||||
replace-color.selectText.8=Zlutý text na černém pozadí
|
||||
replace-color.selectText.9=Zelený text na černém pozadí
|
||||
replace-color.selectText.10=Vyberte barvu textu
|
||||
replace-color.selectText.11=Vyberte barvu pozadí
|
||||
replace-color.submit=Nahradit
|
||||
|
||||
|
||||
|
||||
@@ -536,45 +539,45 @@ replace-color.submit=Replace
|
||||
# #
|
||||
###########################
|
||||
#login
|
||||
login.title=Sign in
|
||||
login.header=Sign in
|
||||
login.signin=Sign in
|
||||
login.rememberme=Remember me
|
||||
login.invalid=Invalid username or password.
|
||||
login.locked=Your account has been locked.
|
||||
login.signinTitle=Please sign in
|
||||
login.ssoSignIn=Login via Single Sign-on
|
||||
login.oauth2AutoCreateDisabled=OAUTH2 Auto-Create User Disabled
|
||||
login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator.
|
||||
login.oauth2RequestNotFound=Authorization request not found
|
||||
login.oauth2InvalidUserInfoResponse=Invalid User Info Response
|
||||
login.oauth2invalidRequest=Invalid Request
|
||||
login.oauth2AccessDenied=Access Denied
|
||||
login.oauth2InvalidTokenResponse=Invalid Token Response
|
||||
login.oauth2InvalidIdToken=Invalid Id Token
|
||||
login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator.
|
||||
login.alreadyLoggedIn=You are already logged in to
|
||||
login.alreadyLoggedIn2=devices. Please log out of the devices and try again.
|
||||
login.toManySessions=You have too many active sessions
|
||||
login.title=Přihlášení
|
||||
login.header=Přihlášení
|
||||
login.signin=Přihlásit se
|
||||
login.rememberme=Zapamatovat si mě
|
||||
login.invalid=Neplatné uživatelské jméno nebo heslo.
|
||||
login.locked=Vaše účto bylo zablokováno.
|
||||
login.signinTitle=Prosím, přihlaste se
|
||||
login.ssoSignIn=Přihlášení prostřednictvím jednotného přihlašovacího systému
|
||||
login.oauth2AutoCreateDisabled=Automatické vytvoření uživatele OAUTH2 je vypnuté
|
||||
login.oauth2AdminBlockedUser=Registrace nebo přihlášení nepozitrovených uživatelů aktuálně jsou zablokovaná. Štěňte na správce.
|
||||
login.oauth2RequestNotFound=Požadavek na autorizaci nenalezen
|
||||
login.oauth2InvalidUserInfoResponse=Neplatný odpověď s informacemi o uživateli
|
||||
login.oauth2invalidRequest=Neplatný požadavek
|
||||
login.oauth2AccessDenied=Přístup zazobán
|
||||
login.oauth2InvalidTokenResponse=Neplatná odpověď tokenu
|
||||
login.oauth2InvalidIdToken=Neplatný identifikační token
|
||||
login.userIsDisabled=Uživatel je deaktivován, přihlášení aktuálně pro tuto uživatelskou jmena je zakázáno. Kontaktujte správce.
|
||||
login.alreadyLoggedIn=Jste již přihlášeni na
|
||||
login.alreadyLoggedIn2=zariadení. Odhlašujte se z těchto zařízení a zkuste to znovu.
|
||||
login.toManySessions=Máte příliš mnoho aktivních sesií
|
||||
|
||||
#auto-redact
|
||||
autoRedact.title=Auto Redact
|
||||
autoRedact.header=Auto Redact
|
||||
autoRedact.colorLabel=Colour
|
||||
autoRedact.textsToRedactLabel=Text to Redact (line-separated)
|
||||
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret
|
||||
autoRedact.useRegexLabel=Use Regex
|
||||
autoRedact.wholeWordSearchLabel=Whole Word Search
|
||||
autoRedact.customPaddingLabel=Custom Extra Padding
|
||||
autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box)
|
||||
autoRedact.submitButton=Submit
|
||||
autoRedact.title=Automatické smazání
|
||||
autoRedact.header=Automatické smazání
|
||||
autoRedact.colorLabel=Barva
|
||||
autoRedact.textsToRedactLabel=Text k smazání (řádkově oddělený)
|
||||
autoRedact.textsToRedactPlaceholder=např. \nKonfidenciální \nSkrytější
|
||||
autoRedact.useRegexLabel=Použít regulární výraz
|
||||
autoRedact.wholeWordSearchLabel=Hledání celých slov
|
||||
autoRedact.customPaddingLabel=Vlastní doplňující vzdálenost
|
||||
autoRedact.convertPDFToImageLabel=Převést PDF do PDF-Obrázku (Pro odstranění textu za obdélníkem)
|
||||
autoRedact.submitButton=Odeslat
|
||||
|
||||
|
||||
#showJS
|
||||
showJS.title=Show Javascript
|
||||
showJS.header=Show Javascript
|
||||
showJS.downloadJS=Download Javascript
|
||||
showJS.submit=Show
|
||||
showJS.title=Zobrazit JavaScript
|
||||
showJS.header=Zobrazit JavaScript
|
||||
showJS.downloadJS=Stáhnout JavaScript
|
||||
showJS.submit=Zobrazit
|
||||
|
||||
|
||||
#pdfToSinglePage
|
||||
@@ -730,7 +733,7 @@ pageLayout.submit=Odeslat
|
||||
scalePages.title=Upravit měřítko stránky
|
||||
scalePages.header=Upravit měřítko stránky
|
||||
scalePages.pageSize=Velikost stránky dokumentu.
|
||||
scalePages.keepPageSize=Original Size
|
||||
scalePages.keepPageSize=Původní velikost
|
||||
scalePages.scaleFactor=Úroveň přiblížení (oříznutí) stránky.
|
||||
scalePages.submit=Odeslat
|
||||
|
||||
@@ -750,14 +753,15 @@ certSign.showSig=Ukázat podpis
|
||||
certSign.reason=Důvod
|
||||
certSign.location=Umístění
|
||||
certSign.name=Název
|
||||
certSign.showLogo=Zobraz loga
|
||||
certSign.submit=Podepsat PDF
|
||||
|
||||
|
||||
#removeCertSign
|
||||
removeCertSign.title=Remove Certificate Signature
|
||||
removeCertSign.header=Remove the digital certificate from the PDF
|
||||
removeCertSign.selectPDF=Select a PDF file:
|
||||
removeCertSign.submit=Remove Signature
|
||||
removeCertSign.title=Odstranit certifikátovou podpisu
|
||||
removeCertSign.header=Odstranění digitálního certifikátu z PDF
|
||||
removeCertSign.selectPDF=Vyberte soubor PDF:
|
||||
removeCertSign.submit=Odstranit podpis
|
||||
|
||||
|
||||
#removeBlanks
|
||||
@@ -779,14 +783,14 @@ removeAnnotations.submit=Odebrat
|
||||
#compare
|
||||
compare.title=Porovnat
|
||||
compare.header=Porovnat PDF
|
||||
compare.highlightColor.1=Highlight Color 1:
|
||||
compare.highlightColor.2=Highlight Color 2:
|
||||
compare.highlightColor.1=Podtržovací barva 1:
|
||||
compare.highlightColor.2=Podtržovací barva 2:
|
||||
compare.document.1=Dokument 1
|
||||
compare.document.2=Dokument 2
|
||||
compare.submit=Porovnat
|
||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
||||
compare.complex.message=Jedno nebo oba z předložených dokumentů jsou velké soubory, přesnost porovnání může být snižena
|
||||
compare.large.file.message=Jeden nebo oba předložené dokumenty jsou příliš velké na zpracování
|
||||
compare.no.text.message=Jedno nebo oba vybrané PDF soubory nemají textový obsah. Zvolte PDF soubory se textem pro porovnání.
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Knihy a komiksy do PDF
|
||||
@@ -809,12 +813,17 @@ sign.draw=Nakreslit podpis
|
||||
sign.text=Vstup textu
|
||||
sign.clear=Vymazat
|
||||
sign.add=Přidat
|
||||
sign.saved=Saved Signatures
|
||||
sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.saved=Uložené podpisy
|
||||
sign.save=Uložit podpis
|
||||
sign.personalSigs=Osobní podpisy
|
||||
sign.sharedSigs=Sdílené podpisy
|
||||
sign.noSavedSigs=Nenašly se žádné uložené podpisy
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Opravit
|
||||
@@ -832,7 +841,7 @@ flatten.submit=Zploštit
|
||||
#ScannerImageSplit
|
||||
ScannerImageSplit.selectText.1=Práh úhlu:
|
||||
ScannerImageSplit.selectText.2=Nastaví minimální absolutní úhel, který je vyžadován k otočení obrázku (výchozí: 10).
|
||||
ScannerImageSplit.selectText.3=Tolerance:
|
||||
ScannerImageSplit.selectText.3=Tolerancie:
|
||||
ScannerImageSplit.selectText.4=Určuje rozsah barevné variace kolem odhadované barvy pozadí (výchozí: 30).
|
||||
ScannerImageSplit.selectText.5=Minimální plocha:
|
||||
ScannerImageSplit.selectText.6=Nastaví minimální plošný práh pro fotografii (výchozí: 10000).
|
||||
@@ -840,7 +849,7 @@ ScannerImageSplit.selectText.7=Minimální plocha kontury:
|
||||
ScannerImageSplit.selectText.8=Nastaví minimální plošný práh kontury pro fotografii
|
||||
ScannerImageSplit.selectText.9=Velikost okraje:
|
||||
ScannerImageSplit.selectText.10=Nastaví velikost okraje přidaného a odebraného k zabránění bílých ohraničení ve výstupu (výchozí: 1).
|
||||
ScannerImageSplit.info=Python is not installed. It is required to run.
|
||||
ScannerImageSplit.info=Python není nainstalován. Je potřeba pro jeho spuštění.
|
||||
|
||||
|
||||
#OCR
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=Režim OCR
|
||||
ocr.selectText.11=Odstranit obrázky po OCR (Odstraní VŠECHNY obrázky, užitečné pouze jako součást kroku konverze)
|
||||
ocr.selectText.12=Typ vykreslení (Pokročilé)
|
||||
ocr.help=Prosím, přečtěte si tuto dokumentaci o použití pro jiné jazyky a/nebo použití mimo Docker
|
||||
ocr.credit=Tato služba používá OCRmyPDF a Tesseract pro OCR.
|
||||
ocr.credit=Tato služba používá qpdf a Tesseract pro OCR.
|
||||
ocr.submit=Zpracovat PDF s OCR
|
||||
|
||||
|
||||
@@ -867,7 +876,7 @@ ocr.submit=Zpracovat PDF s OCR
|
||||
extractImages.title=Extrahovat obrázky
|
||||
extractImages.header=Extrahovat obrázky
|
||||
extractImages.selectText=Vyberte formát obrázku pro extrahované obrázky
|
||||
extractImages.allowDuplicates=Save duplicate images
|
||||
extractImages.allowDuplicates=Uložit duplikátní obrázky
|
||||
extractImages.submit=Extrahovat
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Převést na PDF
|
||||
#compress
|
||||
compress.title=Komprese
|
||||
compress.header=Komprimovat PDF
|
||||
compress.credit=Tato služba používá Ghostscript pro kompresi/optimalizaci PDF.
|
||||
compress.credit=Tato služba používá qpdf pro kompresi/optimalizaci PDF.
|
||||
compress.selectText.1=Ruční režim - Od 1 do 4
|
||||
compress.selectText.2=Úroveň optimalizace:
|
||||
compress.selectText.3=4 (Hrozné pro textové obrázky)
|
||||
@@ -905,7 +914,7 @@ merge.title=Sloučit
|
||||
merge.header=Sloučit více PDF (2+)
|
||||
merge.sortByName=Seřadit podle názvu
|
||||
merge.sortByDate=Seřadit podle data
|
||||
merge.removeCertSign=Remove digital signature in the merged file?
|
||||
merge.removeCertSign=Odebrat digitální podpis v převedeném souboru?
|
||||
merge.submit=Sloučit
|
||||
|
||||
|
||||
@@ -923,7 +932,7 @@ pdfOrganiser.mode.6=Liché-Sudé rozdělení
|
||||
pdfOrganiser.mode.7=Odstranit první
|
||||
pdfOrganiser.mode.8=Odstranit poslední
|
||||
pdfOrganiser.mode.9=Odstranit první a poslední
|
||||
pdfOrganiser.mode.10=Odd-Even Merge
|
||||
pdfOrganiser.mode.10=Lomeno spojení
|
||||
pdfOrganiser.placeholder=(např. 1,3,2 nebo 4-8,2,10-12 nebo 2n-1)
|
||||
|
||||
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(např. 1,3,2 nebo 4-8,2,10-12 nebo 2n-1)
|
||||
multiTool.title=Vícefunkční nástroj pro PDF
|
||||
multiTool.header=Vícefunkční nástroj pro PDF
|
||||
multiTool.uploadPrompts=Název souboru
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=Zobrazit PDF
|
||||
@@ -992,7 +1022,7 @@ pdfToImage.color=Barevný
|
||||
pdfToImage.grey=Stupně šedi
|
||||
pdfToImage.blackwhite=Černobílý (Může dojít k ztrátě dat!)
|
||||
pdfToImage.submit=Převést
|
||||
pdfToImage.info=Python is not installed. Required for WebP conversion.
|
||||
pdfToImage.info=Python není nainstalován. Potřebuje se pro konverzi do WebP.
|
||||
|
||||
|
||||
#addPassword
|
||||
@@ -1029,7 +1059,7 @@ watermark.selectText.6=Výška mezery (Mezera mezi každým vodoznakem svisle):
|
||||
watermark.selectText.7=Průhlednost (0% - 100%):
|
||||
watermark.selectText.8=Typ vodoznaku:
|
||||
watermark.selectText.9=Obrázek vodoznaku:
|
||||
watermark.selectText.10=Convert PDF to PDF-Image
|
||||
watermark.selectText.10=Převést PDF na PDF-Obrázek
|
||||
watermark.submit=Přidat vodoznak
|
||||
watermark.type.1=Text
|
||||
watermark.type.2=Obrázek
|
||||
@@ -1082,11 +1112,11 @@ changeMetadata.submit=Změnit
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF na PDF/A
|
||||
pdfToPDFA.header=PDF na PDF/A
|
||||
pdfToPDFA.credit=Tato služba používá ghostscript pro konverzi do formátu PDF/A
|
||||
pdfToPDFA.credit=Tato služba používá qpdf pro konverzi do formátu PDF/A
|
||||
pdfToPDFA.submit=Převést
|
||||
pdfToPDFA.tip=V současné době nepracuje pro více vstupů najednou
|
||||
pdfToPDFA.outputFormat=Výstupní formát
|
||||
pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step.
|
||||
pdfToPDFA.pdfWithDigitalSignature=PDF obsahuje digitální podpis, který bude odebrán v následujícím kroku.
|
||||
|
||||
|
||||
#PDFToWord
|
||||
@@ -1188,15 +1218,15 @@ licenses.version=Verze
|
||||
licenses.license=Licence
|
||||
|
||||
#survey
|
||||
survey.nav=Survey
|
||||
survey.title=Stirling-PDF Survey
|
||||
survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF!
|
||||
survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here:
|
||||
survey.changes2=With these changes we are getting paid business support and funding
|
||||
survey.nav=Přehled
|
||||
survey.title=Stirling-PDF Přehled
|
||||
survey.description=Stirling-PDF nemá sledování, proto chceme vaše názory k podnětom k lepšímu Stirling-PDF!
|
||||
survey.changes=Stirling-PDF se změnil od posledního příspěvku! Další informace najdete na našem blogu zde:
|
||||
survey.changes2=S těmito změnami získáváme platné podpory a finanční podporu od business partnerů.
|
||||
survey.please=Please consider taking our survey!
|
||||
survey.disabled=(Survey popup will be disabled in following updates but available at foot of page)
|
||||
survey.button=Take Survey
|
||||
survey.dontShowAgain=Don't show again
|
||||
survey.disabled=(Přehled bude v budoucnu zakázán, ale zůstane k dispozici na nástavbě)
|
||||
survey.button=Udělat Příspěvek
|
||||
survey.dontShowAgain=Neukazuj to znovu
|
||||
|
||||
|
||||
#error
|
||||
@@ -1214,19 +1244,19 @@ error.discordSubmit=Discord - Odeslat příspěvek podpory
|
||||
|
||||
|
||||
#remove-image
|
||||
removeImage.title=Remove image
|
||||
removeImage.header=Remove image
|
||||
removeImage.removeImage=Remove image
|
||||
removeImage.submit=Remove image
|
||||
removeImage.title=Odstranit obrázek
|
||||
removeImage.header=Odstranit obrázek
|
||||
removeImage.removeImage=Odstranit obrázek
|
||||
removeImage.submit=Odebrat obrázek
|
||||
|
||||
|
||||
splitByChapters.title=Split PDF by Chapters
|
||||
splitByChapters.header=Split PDF by Chapters
|
||||
splitByChapters.bookmarkLevel=Bookmark Level
|
||||
splitByChapters.includeMetadata=Include Metadata
|
||||
splitByChapters.allowDuplicates=Allow Duplicates
|
||||
splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure.
|
||||
splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.).
|
||||
splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF.
|
||||
splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs.
|
||||
splitByChapters.submit=Split PDF
|
||||
splitByChapters.title=Podělit PDF podle kapitol
|
||||
splitByChapters.header=Podělení PDF na kapitoly
|
||||
splitByChapters.bookmarkLevel=Úroveň záhlaví
|
||||
splitByChapters.includeMetadata=Zahrnout metadatů
|
||||
splitByChapters.allowDuplicates=Povolit duplicitní záznamy
|
||||
splitByChapters.desc.1=Tento nástroj podělí PDF soubor na více PDF soubory na základě struktury kapitol.
|
||||
splitByChapters.desc.2=Úroveň záhlaví: Zvolte úroveň záhlaví pro použití při oddělování (0 pro hlavní, 1 pro druhou úroveň atd.).
|
||||
splitByChapters.desc.3=Zahrnout metadatů: Pokud je zaškrtnuto, původní metadata PDF souboru budou zahrnuty do každého odděleného PDF souboru.
|
||||
splitByChapters.desc.4=Povolit duplicitní záznamy: Pokud je zaškrtnuto, návštěvníci mohou vytvořit samostatné PDF soubory z více záhlaví na stejné straně.
|
||||
splitByChapters.submit=Podělit se PDF
|
||||
|
||||
@@ -74,19 +74,20 @@ seeDockerHub=Se Docker Hub
|
||||
visitGithub=Besøg Github Repository
|
||||
donate=Donér
|
||||
color=Farve
|
||||
sponsor=Sponsor
|
||||
sponsor=Sponsorer
|
||||
info=Info
|
||||
pro=Pro
|
||||
page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
page=Sidenummer
|
||||
pages=Sideantal
|
||||
loading=Laster...
|
||||
addToDoc=Tilføj til Dokument
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Privacy Policy
|
||||
legal.terms=Terms and Conditions
|
||||
legal.accessibility=Accessibility
|
||||
legal.cookie=Cookie Policy
|
||||
legal.impressum=Impressum
|
||||
legal.terms=Vilkår og betingelser
|
||||
legal.accessibility=Adgangsnævnteglen
|
||||
legal.cookie=Cokiebelejring
|
||||
legal.impressum=Angivelse af ansvar
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
@@ -116,21 +117,21 @@ pipelineOptions.validateButton=Validér
|
||||
########################
|
||||
# ENTERPRISE EDITION #
|
||||
########################
|
||||
enterpriseEdition.button=Upgrade to Pro
|
||||
enterpriseEdition.warning=This feature is only available to Pro users.
|
||||
enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features.
|
||||
enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro
|
||||
enterpriseEdition.button=Opgrader til Pro
|
||||
enterpriseEdition.warning=Denne funktion er kun tilgængelig for Pro-brugere.
|
||||
enterpriseEdition.yamlAdvert=Stirling PDF Pro understøtter YAML-konfigurationsfiler og andre SSO-funktioner.
|
||||
enterpriseEdition.ssoAdvert=søger du flere funktioner til brugerstyring? Prøv Stirling PDF Pro
|
||||
|
||||
|
||||
#################
|
||||
# Analytics #
|
||||
#################
|
||||
analytics.title=Do you want make Stirling PDF better?
|
||||
analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.
|
||||
analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.
|
||||
analytics.enable=Enable analytics
|
||||
analytics.disable=Disable analytics
|
||||
analytics.settings=You can change the settings for analytics in the config/settings.yml file
|
||||
analytics.title=Vil du gøre Stirling PDF bedre?
|
||||
analytics.paragraph1=Stirling PDF har indsat analytics for at hjælpe os med at forbedre produktet. Vi følger ikke nogen personoplysninger eller filinhold.
|
||||
analytics.paragraph2=Bevægelsesmæssigt aktiver du analytics for at hjælpe Stirling-PDF med at vokse og til atstå os bedre at forstå vores brugere.
|
||||
analytics.enable=Aktivér analytics
|
||||
analytics.disable=Deaktiver analytics
|
||||
analytics.settings=Du kan ændre analytics-indstillingerne i config/settings.yml-filen
|
||||
|
||||
#############
|
||||
# NAVBAR #
|
||||
@@ -141,13 +142,14 @@ navbar.language=Sprog
|
||||
navbar.settings=Indstillinger
|
||||
navbar.allTools=Værktøjer
|
||||
navbar.multiTool=Multi Værktøjer
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Organisér
|
||||
navbar.sections.convertTo=Konvertér til PDF
|
||||
navbar.sections.convertFrom=Konvertér fra PDF
|
||||
navbar.sections.security=Signér & Sikkerhed
|
||||
navbar.sections.advance=Avanceret
|
||||
navbar.sections.edit=Vis & Redigér
|
||||
navbar.sections.popular=Popular
|
||||
navbar.sections.popular=Populære
|
||||
|
||||
#############
|
||||
# SETTINGS #
|
||||
@@ -201,7 +203,7 @@ account.syncToAccount=Synkroniser Konto <- Browser
|
||||
|
||||
adminUserSettings.title=Brugerkontrolindstillinger
|
||||
adminUserSettings.header=Admin Brugerkontrolindstillinger
|
||||
adminUserSettings.admin=Admin
|
||||
adminUserSettings.admin=Administrer
|
||||
adminUserSettings.user=Bruger
|
||||
adminUserSettings.addUser=Tilføj Ny Bruger
|
||||
adminUserSettings.deleteUser=Slet Bruger
|
||||
@@ -245,7 +247,8 @@ database.fileNotFound=Fil ikke fundet
|
||||
database.fileNullOrEmpty=Fil må ikke være null eller tom
|
||||
database.failedImportFile=Kunne ikke importere fil
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.expired=Din sesions tid har udløbet. Genlad siden og prøv igen.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -505,28 +508,28 @@ home.removeImagePdf.desc=Fjern billede fra PDF for at reducere filstørrelse
|
||||
removeImagePdf.tags=Fjern Billede,Sideoperationer,Back end,server side
|
||||
|
||||
|
||||
home.splitPdfByChapters.title=Split PDF by Chapters
|
||||
home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure.
|
||||
splitPdfByChapters.tags=split,chapters,bookmarks,organize
|
||||
home.splitPdfByChapters.title=Partitioner PDF efter kapitler
|
||||
home.splitPdfByChapters.desc=Partitioner en PDF i flere filer baseret på dens kapitelstruktur.
|
||||
splitPdfByChapters.tags=partitionering,kapitler,merker,organisering
|
||||
|
||||
#replace-invert-color
|
||||
replace-color.title=Replace-Invert-Color
|
||||
replace-color.header=Replace-Invert Color PDF
|
||||
replace-color.header=Erstat-omgivende Farve PDF
|
||||
home.replaceColorPdf.title=Replace and Invert Color
|
||||
home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size
|
||||
replaceColorPdf.tags=Replace Color,Page operations,Back end,server side
|
||||
replace-color.selectText.1=Replace or Invert color Options
|
||||
replace-color.selectText.2=Default(Default high contrast colors)
|
||||
replace-color.selectText.3=Custom(Customized colors)
|
||||
replace-color.selectText.4=Full-Invert(Invert all colors)
|
||||
replace-color.selectText.5=High contrast color options
|
||||
replace-color.selectText.6=white text on black background
|
||||
replace-color.selectText.7=Black text on white background
|
||||
replace-color.selectText.8=Yellow text on black background
|
||||
replace-color.selectText.9=Green text on black background
|
||||
replace-color.selectText.10=Choose text Color
|
||||
replace-color.selectText.11=Choose background Color
|
||||
replace-color.submit=Replace
|
||||
home.replaceColorPdf.desc=Erstatt farve for tekst og baggrund i en PDF og omgivende farve til fuld farve af PDF for at redusere filstørrelsen.
|
||||
replaceColorPdf.tags=Erstat Farve,Side operationer,Behandling,server side
|
||||
replace-color.selectText.1=Erstatt eller omgivende Farvemuligheder
|
||||
replace-color.selectText.2=Standard (høj kontrastfarver)
|
||||
replace-color.selectText.3=Brugerdefineret (anpassede farver)
|
||||
replace-color.selectText.4=Inverter alle farver
|
||||
replace-color.selectText.5=Høj kontrastfarveindstillinger
|
||||
replace-color.selectText.6=Hvid tekst på sort baggrund
|
||||
replace-color.selectText.7=Sort tekst på hvid baggrund
|
||||
replace-color.selectText.8=Gul tekst på sort baggrund
|
||||
replace-color.selectText.9=Grøn tekst på sort baggrund
|
||||
replace-color.selectText.10=Vælg tekstfarve
|
||||
replace-color.selectText.11=Vælg baggrundsfarve
|
||||
replace-color.submit=Erstat
|
||||
|
||||
|
||||
|
||||
@@ -553,9 +556,9 @@ login.oauth2AccessDenied=Adgang Nægtet
|
||||
login.oauth2InvalidTokenResponse=Ugyldigt Token Svar
|
||||
login.oauth2InvalidIdToken=Ugyldigt Id Token
|
||||
login.userIsDisabled=Bruger er deaktiveret, login er i øjeblikket blokeret med dette brugernavn. Kontakt venligst administratoren.
|
||||
login.alreadyLoggedIn=You are already logged in to
|
||||
login.alreadyLoggedIn2=devices. Please log out of the devices and try again.
|
||||
login.toManySessions=You have too many active sessions
|
||||
login.alreadyLoggedIn=Du er allerede logget ind på
|
||||
login.alreadyLoggedIn2=enheder. Log ud af disse enheder og prøv igen.
|
||||
login.toManySessions=Du har for mange aktive sessoner
|
||||
|
||||
#auto-redact
|
||||
autoRedact.title=Auto Rediger
|
||||
@@ -573,7 +576,7 @@ autoRedact.submitButton=Indsend
|
||||
#showJS
|
||||
showJS.title=Vis Javascript
|
||||
showJS.header=Vis Javascript
|
||||
showJS.downloadJS=Download Javascript
|
||||
showJS.downloadJS=Last ned Javascript
|
||||
showJS.submit=Vis
|
||||
|
||||
|
||||
@@ -630,7 +633,7 @@ HTMLToPDF.printBackground=Render baggrunden af hjemmesider.
|
||||
HTMLToPDF.defaultHeader=Aktivér Standard Header (Navn og sidenummerAS
|
||||
HTMLToPDF.cssMediaType=Ændre CSS-medietypen for siden.
|
||||
HTMLToPDF.none=Ingen
|
||||
HTMLToPDF.print=Print
|
||||
HTMLToPDF.print=Skriv ud
|
||||
HTMLToPDF.screen=Skærm
|
||||
|
||||
|
||||
@@ -642,9 +645,9 @@ AddStampRequest.stampText=Stempeltekst
|
||||
AddStampRequest.stampImage=Stempelbillede
|
||||
AddStampRequest.alphabet=Alfabet
|
||||
AddStampRequest.fontSize=Skrift/Billedstørrelse
|
||||
AddStampRequest.rotation=Rotation
|
||||
AddStampRequest.rotation=Vendelse
|
||||
AddStampRequest.opacity=Gennemsigtighed
|
||||
AddStampRequest.position=Position
|
||||
AddStampRequest.position=Plassering
|
||||
AddStampRequest.overrideX=Tilsidesæt X-koordinat
|
||||
AddStampRequest.overrideY=Tilsidesæt Y-koordinat
|
||||
AddStampRequest.customMargin=Brugerdefineret Margin
|
||||
@@ -668,7 +671,7 @@ addPageNumbers.title=Tilføj Sidenumre
|
||||
addPageNumbers.header=Tilføj Sidenumre
|
||||
addPageNumbers.selectText.1=Vælg PDF-fil:
|
||||
addPageNumbers.selectText.2=Marginstørrelse
|
||||
addPageNumbers.selectText.3=Position
|
||||
addPageNumbers.selectText.3=Plassering
|
||||
addPageNumbers.selectText.4=Startnummer
|
||||
addPageNumbers.selectText.5=Sider at nummerere
|
||||
addPageNumbers.selectText.6=Brugerdefineret Tekst
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=Vis Underskrift
|
||||
certSign.reason=Årsag
|
||||
certSign.location=Placering
|
||||
certSign.name=Navn
|
||||
certSign.showLogo=Vis Logo
|
||||
certSign.submit=Underskriv PDF
|
||||
|
||||
|
||||
@@ -784,9 +788,9 @@ compare.highlightColor.2=Fremhævningsfarve 2:
|
||||
compare.document.1=Dokument 1
|
||||
compare.document.2=Dokument 2
|
||||
compare.submit=Sammenlign
|
||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
||||
compare.complex.message=Et eller begge af de angivne dokumenter er store filer, præcisionen ved sammenligningen kan geminse.
|
||||
compare.large.file.message=Et eller Begge af de Angivne Dokumenter Er For Store At Behandle
|
||||
compare.no.text.message=Et eller Begge Af de Vælgede PDFs Har Ingen Tekstindhold. Vælg Vores PDFs Med Tekst for Sammenligning.
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Bøger og Tegneserier til PDF
|
||||
@@ -809,12 +813,17 @@ sign.draw=Tegn Underskrift
|
||||
sign.text=Tekstinput
|
||||
sign.clear=Ryd
|
||||
sign.add=Tilføj
|
||||
sign.saved=Saved Signatures
|
||||
sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.saved=Gemte Signaturer
|
||||
sign.save=Gem Signatur
|
||||
sign.personalSigs=Personlige Signaturer
|
||||
sign.sharedSigs=Delte Signaturer
|
||||
sign.noSavedSigs=Ingen Gemte Signaturer Fundet
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Reparér
|
||||
@@ -832,7 +841,7 @@ flatten.submit=Udjævn
|
||||
#ScannerImageSplit
|
||||
ScannerImageSplit.selectText.1=Vinkeltærskel:
|
||||
ScannerImageSplit.selectText.2=Indstiller den minimale absolutte vinkel, der kræves for at billedet roteres (standard: 10).
|
||||
ScannerImageSplit.selectText.3=Tolerance:
|
||||
ScannerImageSplit.selectText.3=Tolerancen:
|
||||
ScannerImageSplit.selectText.4=Bestemmer området for farvevariation omkring den estimerede baggrundsfarve (standard: 30).
|
||||
ScannerImageSplit.selectText.5=Minimum Areal:
|
||||
ScannerImageSplit.selectText.6=Indstiller den minimale arealtærskel for et foto (standard: 10000).
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=OCR-tilstand
|
||||
ocr.selectText.11=Fjern billeder efter OCR (Fjerner ALLE billeder, kun nyttigt hvis det er en del af konverteringstrinnet)
|
||||
ocr.selectText.12=Renderingstype (Avanceret)
|
||||
ocr.help=Læs venligst denne dokumentation om, hvordan man bruger dette til andre sprog og/eller brug uden for docker
|
||||
ocr.credit=Denne tjeneste bruger OCRmyPDF og Tesseract til OCR.
|
||||
ocr.credit=Denne tjeneste bruger qpdf og Tesseract til OCR.
|
||||
ocr.submit=Behandl PDF med OCR
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Konvertér til PDF
|
||||
#compress
|
||||
compress.title=Komprimer
|
||||
compress.header=Komprimer PDF
|
||||
compress.credit=Denne tjeneste bruger Ghostscript til PDF Komprimering/Optimering.
|
||||
compress.credit=Denne tjeneste bruger qpdf til PDF Komprimering/Optimering.
|
||||
compress.selectText.1=Manuel Tilstand - Fra 1 til 4
|
||||
compress.selectText.2=Optimeringsniveau:
|
||||
compress.selectText.3=4 (Forfærdelig for tekstbilleder)
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1)
|
||||
multiTool.title=PDF Multi Værktøj
|
||||
multiTool.header=PDF Multi Værktøj
|
||||
multiTool.uploadPrompts=Filnavn
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=Se PDF
|
||||
@@ -1023,7 +1053,7 @@ watermark.header=Tilføj Vandmærke
|
||||
watermark.selectText.1=Vælg PDF til at tilføje vandmærke:
|
||||
watermark.selectText.2=Vandmærketekst:
|
||||
watermark.selectText.3=Skriftstørrelse:
|
||||
watermark.selectText.4=Rotation (0-360):
|
||||
watermark.selectText.4=Vendt Side (0-360):
|
||||
watermark.selectText.5=breddeAfstand (Afstand mellem hvert vandmærke vandret):
|
||||
watermark.selectText.6=højdeAfstand (Afstand mellem hvert vandmærke lodret):
|
||||
watermark.selectText.7=Gennemsigtighed (0% - 100%):
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=Ændre
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF Til PDF/A
|
||||
pdfToPDFA.header=PDF Til PDF/A
|
||||
pdfToPDFA.credit=Denne tjeneste bruger ghostscript til PDF/A-konvertering
|
||||
pdfToPDFA.credit=Denne tjeneste bruger qpdf til PDF/A-konvertering
|
||||
pdfToPDFA.submit=Konvertér
|
||||
pdfToPDFA.tip=Fungerer i øjeblikket ikke for flere input på én gang
|
||||
pdfToPDFA.outputFormat=Outputformat
|
||||
@@ -1191,8 +1221,8 @@ licenses.license=License
|
||||
survey.nav=Undersøgelse
|
||||
survey.title=Stirling-PDF Undersøgelse
|
||||
survey.description=Stirling-PDF har ingen sporing, så vi vil gerne høre fra vores brugere for at forbedre Stirling-PDF!
|
||||
survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here:
|
||||
survey.changes2=With these changes we are getting paid business support and funding
|
||||
survey.changes=Stirling-PDF Har Endtes Sidst Ganger du Foresatte En Kig! For At Lære Mere, Se Vores Blog Indlæg Her:
|
||||
survey.changes2=Med Disse Endringer Er Vi Kommet I Betalende Forretningsstøtte og Finansiering
|
||||
survey.please=Overvej venligst at deltage i vores undersøgelse!
|
||||
survey.disabled=(Undersøgelsespop-up vil blive deaktiveret i følgende opdateringer, men vil være tilgængelig i bunden af siden)
|
||||
survey.button=Tag Undersøgelsen
|
||||
@@ -1220,13 +1250,13 @@ removeImage.removeImage=Fjern billede
|
||||
removeImage.submit=Fjern
|
||||
|
||||
|
||||
splitByChapters.title=Split PDF by Chapters
|
||||
splitByChapters.header=Split PDF by Chapters
|
||||
splitByChapters.bookmarkLevel=Bookmark Level
|
||||
splitByChapters.includeMetadata=Include Metadata
|
||||
splitByChapters.allowDuplicates=Allow Duplicates
|
||||
splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure.
|
||||
splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.).
|
||||
splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF.
|
||||
splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs.
|
||||
splitByChapters.submit=Split PDF
|
||||
splitByChapters.title=Del PDF ved Kapitler
|
||||
splitByChapters.header=Splitter PDF efter kapitel
|
||||
splitByChapters.bookmarkLevel=Bogmærke niveau
|
||||
splitByChapters.includeMetadata=Inkluder metadata
|
||||
splitByChapters.allowDuplicates=Tillad duplikater
|
||||
splitByChapters.desc.1=Denne værktøj splitter en PDF-fil op i flere PDF'er baseret på dens kapitelstruktur.
|
||||
splitByChapters.desc.2=Bogmærke niveau: Vælg nivået af bogmærker, der skal bruges til at splittere (0 for hovedniveau, 1 for anden niveau osv.).
|
||||
splitByChapters.desc.3=Inkluder metadata: Hvis markeret, vil den originale PDF's metadata inkluderes i hver splitterdels PDF.
|
||||
splitByChapters.desc.4=Tillad duplikater: Hvis markeret, tillader det flere bogmærker på samme side til at oprette separate PDF'er.
|
||||
splitByChapters.submit=Splitter PDF
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
###########
|
||||
# the direction that the language is written (ltr = left to right, rtl = right to left)
|
||||
language.direction=ltr
|
||||
addPageNumbers.fontSize=Font Size
|
||||
addPageNumbers.fontName=Font Name
|
||||
addPageNumbers.fontSize=Schriftgröße
|
||||
addPageNumbers.fontName=Schriftart
|
||||
pdfPrompt=PDF(s) auswählen
|
||||
multiPdfPrompt=PDFs auswählen(2+)
|
||||
multiPdfDropPrompt=Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin)
|
||||
@@ -77,10 +77,11 @@ color=Farbe
|
||||
sponsor=Sponsor
|
||||
info=Informationen
|
||||
pro=Pro
|
||||
page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
page=Seite
|
||||
pages=Seiten
|
||||
loading=Laden...
|
||||
addToDoc=In Dokument hinzufügen
|
||||
reset=Zurücksetzen
|
||||
|
||||
legal.privacy=Datenschutz
|
||||
legal.terms=AGB
|
||||
@@ -141,13 +142,14 @@ navbar.language=Sprachen
|
||||
navbar.settings=Einstellungen
|
||||
navbar.allTools=Werkzeuge
|
||||
navbar.multiTool=Multitools
|
||||
navbar.search=Suche
|
||||
navbar.sections.organize=Organisieren
|
||||
navbar.sections.convertTo=In PDF konvertieren
|
||||
navbar.sections.convertFrom=Konvertieren von PDF
|
||||
navbar.sections.security=Zeichen und Sicherheit
|
||||
navbar.sections.advance=Fortschrittlich
|
||||
navbar.sections.edit=Anzeigen und Bearbeiten
|
||||
navbar.sections.popular=Popular
|
||||
navbar.sections.popular=Beliebt
|
||||
|
||||
#############
|
||||
# SETTINGS #
|
||||
@@ -245,7 +247,8 @@ database.fileNotFound=Datei nicht gefunden
|
||||
database.fileNullOrEmpty=Datei darf nicht null oder leer sein
|
||||
database.failedImportFile=Dateiimport fehlgeschlagen
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.expired=Ihre Sitzung ist abgelaufen. Bitte laden Sie die Seite neu und versuchen Sie es erneut.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -730,7 +733,7 @@ pageLayout.submit=Abschicken
|
||||
scalePages.title=Seitengröße anpassen
|
||||
scalePages.header=Seitengröße anpassen
|
||||
scalePages.pageSize=Format der Seiten des Dokuments
|
||||
scalePages.keepPageSize=Original Size
|
||||
scalePages.keepPageSize=Originalgröße beibehalten
|
||||
scalePages.scaleFactor=Zoomstufe (Ausschnitt) einer Seite
|
||||
scalePages.submit=Abschicken
|
||||
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=Signatur anzeigen
|
||||
certSign.reason=Grund
|
||||
certSign.location=Standort
|
||||
certSign.name=Name
|
||||
certSign.showLogo=Logo anzeigen
|
||||
certSign.submit=PDF signieren
|
||||
|
||||
|
||||
@@ -784,9 +788,9 @@ compare.highlightColor.2=Highlight-Farbe 2:
|
||||
compare.document.1=Dokument 1
|
||||
compare.document.2=Dokument 2
|
||||
compare.submit=Vergleichen
|
||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
||||
compare.complex.message=Eines oder beide Dokumente sind sehr groß, dadurch kann die Genauigkeit des Vergleichs kann beeinträchtigt werden.
|
||||
compare.large.file.message=Eines oder beide Dokumente sind zu groß, um verarbeitet zu werden
|
||||
compare.no.text.message=Ein oder beide ausgewählten PDFs enthalten keine Textinhalt. Wählen Sie bitte PDFs mit Text für die Vergleichsanalyse.
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Bücher und Comics zu PDF
|
||||
@@ -809,12 +813,17 @@ sign.draw=Signatur zeichnen
|
||||
sign.text=Texteingabe
|
||||
sign.clear=Leeren
|
||||
sign.add=Signieren
|
||||
sign.saved=Saved Signatures
|
||||
sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.saved=Gespeicherte Signaturen
|
||||
sign.save=Signature speichern
|
||||
sign.personalSigs=Persönliche Signaturen
|
||||
sign.sharedSigs=Geteilte Signaturen
|
||||
sign.noSavedSigs=Es wurden keine gespeicherten Signaturen gefunden
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Reparieren
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=OCR-Modus
|
||||
ocr.selectText.11=Bilder nach OCR entfernen (Entfernt ALLE Bilder, nur sinnvoll, wenn Teil des Konvertierungsschritts)
|
||||
ocr.selectText.12=Rendertyp (Erweitert)
|
||||
ocr.help=Bitte lesen Sie diese Dokumentation, um zu erfahren, wie Sie dies für andere Sprachen verwenden und/oder nicht in Docker verwenden können
|
||||
ocr.credit=Dieser Dienst verwendet OCRmyPDF und Tesseract für OCR.
|
||||
ocr.credit=Dieser Dienst verwendet qpdf und Tesseract für OCR.
|
||||
ocr.submit=PDF mit OCR verarbeiten
|
||||
|
||||
|
||||
@@ -867,7 +876,7 @@ ocr.submit=PDF mit OCR verarbeiten
|
||||
extractImages.title=Bilder extrahieren
|
||||
extractImages.header=Bilder extrahieren
|
||||
extractImages.selectText=Wählen Sie das Bildformat aus, in das extrahierte Bilder konvertiert werden sollen
|
||||
extractImages.allowDuplicates=Save duplicate images
|
||||
extractImages.allowDuplicates=Doppelte Bilder speichern
|
||||
extractImages.submit=Extrahieren
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ 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.credit=Dieser Dienst verwendet qpdf 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)
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1)
|
||||
multiTool.title=PDF-Multitool
|
||||
multiTool.header=PDF-Multitool
|
||||
multiTool.uploadPrompts=Dateiname
|
||||
multiTool.selectAll=Alle auswählen
|
||||
multiTool.deselectAll=Auswahl aufheben
|
||||
multiTool.selectPages=Seiten auswählen
|
||||
multiTool.selectedPages=Ausgewählte Seiten
|
||||
multiTool.page=Seite
|
||||
multiTool.deleteSelected=Auswahl löschen
|
||||
multiTool.downloadAll=Downloaden
|
||||
multiTool.downloadSelected=Auswahl downloaden
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=Diese Funktion ist auch auf unserer <a href="{0}">PDF-Multitool-Seite</a> verfügbar. Probieren Sie sie aus, denn sie bietet eine verbesserte Benutzeroberfläche und zusätzliche Funktionen!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=PDF anzeigen
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=Ändern
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF zu PDF/A
|
||||
pdfToPDFA.header=PDF zu PDF/A
|
||||
pdfToPDFA.credit=Dieser Dienst verwendet ghostscript für die PDF/A-Konvertierung
|
||||
pdfToPDFA.credit=Dieser Dienst verwendet qpdf für die PDF/A-Konvertierung
|
||||
pdfToPDFA.submit=Konvertieren
|
||||
pdfToPDFA.tip=Dieser Dienst kann nur einzelne Eingangsdateien verarbeiten.
|
||||
pdfToPDFA.outputFormat=Ausgabeformat
|
||||
@@ -1191,8 +1221,8 @@ licenses.license=Lizenz
|
||||
survey.nav=Umfrage
|
||||
survey.title=Stirling-PDF-Umfrage
|
||||
survey.description=Stirling-PDF hat kein Tracking, daher möchten wir von unseren Benutzern hören, wie wir Stirling-PDF verbessern können!
|
||||
survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here:
|
||||
survey.changes2=With these changes we are getting paid business support and funding
|
||||
survey.changes=Stirling-PDF hat sich seit der letzten Umfrage verändert! Mehr Informationen finden Sie bitte in unserem Blog-Beitrag hier:
|
||||
survey.changes2=Mit diesen Änderungen erhalten wir beauftragte Geschäftsunterstützung und Finanzierung
|
||||
survey.please=Bitte nehmen Sie an unserer Umfrage teil!
|
||||
survey.disabled=(Das Umfrage-Popup wird in folgenden Updates deaktiviert, ist aber am Fuß der Seite verfügbar.)
|
||||
survey.button=Umfrage durchführen
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
###########
|
||||
# the direction that the language is written (ltr = left to right, rtl = right to left)
|
||||
language.direction=ltr
|
||||
addPageNumbers.fontSize=Font Size
|
||||
addPageNumbers.fontName=Font Name
|
||||
addPageNumbers.fontSize=Μέγεθος Τύπου
|
||||
addPageNumbers.fontName=Όνομα Τύπου
|
||||
pdfPrompt=Επιλογή PDF(s)
|
||||
multiPdfPrompt=Επιλογή PDFs (2+)
|
||||
multiPdfDropPrompt=Επιλογή (ή τράβηγμα αρχείου και απόθεση) όλων των PDF που χρειάζεστε
|
||||
@@ -39,7 +39,7 @@ delete=Διαγραφή
|
||||
username=Όνομα Χρήστη
|
||||
password=Κωδικός
|
||||
welcome=Καλως Ήλθατε
|
||||
property=Property
|
||||
property=Χαρακτηριστικό
|
||||
black=Μαύρο
|
||||
white=Άσπρο
|
||||
red=Κόκκινο
|
||||
@@ -56,15 +56,15 @@ userNotFoundMessage=Ο χρήστης δεν βρέθηκε.
|
||||
incorrectPasswordMessage=Ο τρέχων κωδικός πρόσβασης είναι λανθασμένος.
|
||||
usernameExistsMessage=Το νέο όνομα χρήστη υπάρχει ήδη.
|
||||
invalidUsernameMessage=Μη έγκυρο όνομα χρήστη, όνομα χρήστη μπορεί να περιέχει μόνο γράμματα, αριθμούς και τους ακόλουθους ειδικούς χαρακτήρες @._+- ή πρέπει να είναι έγκυρη διεύθυνση email.
|
||||
invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end.
|
||||
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||
invalidPasswordMessage=Ο κωδικός πρόσβασης δεν μπορεί να είναι αδύναμος και δεν μπορεί να έχει χαμογελάτα στην αρχή ή το τέλος.
|
||||
confirmPasswordErrorMessage=Ο Διαβεβαιωμένος Νέος Κωδικός Πρόσβασης πρέπει να συνάρτησε με το Νέο Κωδίκο Πρόσβασης.
|
||||
deleteCurrentUserMessage=Δεν είναι δυνατή η διαγραφή του τρέχοντος συνδεδεμένου χρήστη.
|
||||
deleteUsernameExistsMessage=Το όνομα χρήστη δεν υπάρχει και δεν μπορεί να διαγραφεί.
|
||||
downgradeCurrentUserMessage=Δεν είναι δυνατή η υποβάθμιση του ρόλου του τρέχοντος χρήστη
|
||||
disabledCurrentUserMessage=The current user cannot be disabled
|
||||
disabledCurrentUserMessage=Ο σύγχρονος χρήστης δεν μπορεί να απενειλθείται
|
||||
downgradeCurrentUserLongMessage=Δεν είναι δυνατή η υποβάθμιση του ρόλου του τρέχοντος χρήστη. Ως εκ τούτου, ο τρέχων χρήστης δεν θα εμφανίζεται.
|
||||
userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user.
|
||||
userAlreadyExistsWebMessage=The user already exists as an web user.
|
||||
userAlreadyExistsOAuthMessage=Το υχής ήδη υπάρχει ως OAuth2 χρήστης.
|
||||
userAlreadyExistsWebMessage=Ο χρήστης εξαρτάται ήδη ως πλήρωμα χρήστη.
|
||||
error=Σφάλμα
|
||||
oops=Ωχ!
|
||||
help=Βοήθεια
|
||||
@@ -75,30 +75,31 @@ visitGithub=Επισκεφθείτε το Αποθετήριο του Github
|
||||
donate=Δωρισε
|
||||
color=Χρώμα
|
||||
sponsor=Yποστηρικτής
|
||||
info=Info
|
||||
pro=Pro
|
||||
page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
info=Πληροφορίες
|
||||
pro=Προ
|
||||
page=Σελίδα
|
||||
pages=Σελίδες
|
||||
loading=Φόρτωση...
|
||||
addToDoc=Πρόσθεση στο Εκπομπώματο
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Privacy Policy
|
||||
legal.terms=Terms and Conditions
|
||||
legal.accessibility=Accessibility
|
||||
legal.cookie=Cookie Policy
|
||||
legal.impressum=Impressum
|
||||
legal.privacy=Πολιτική Προνομίους
|
||||
legal.terms=Φράσεις Υποχρεωτικότητας
|
||||
legal.accessibility=Πρόσβαση
|
||||
legal.cookie=Πολιτική Χώρου Συνθέσεων
|
||||
legal.impressum=Κατάσταση
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
###############
|
||||
pipeline.header=Μενού Pipeline (Beta)
|
||||
pipeline.uploadButton=Upload Custom
|
||||
pipeline.uploadButton=Αναβάθμιση Καλυτερού
|
||||
pipeline.configureButton=Διαμόρφωσε
|
||||
pipeline.defaultOption=Custom
|
||||
pipeline.defaultOption=Κατασκευή Μετρόπολης
|
||||
pipeline.submitButton=Υποβολή
|
||||
pipeline.help=Βοήθεια για το Pipeline
|
||||
pipeline.scanHelp=Βοήθεια για Σάρωση Φακέλων
|
||||
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||
pipeline.deletePrompt=Είστε σίγουροι ότι θέλετε να διαγράψετε το πρότυπο;
|
||||
|
||||
######################
|
||||
# Pipeline Options #
|
||||
@@ -109,52 +110,53 @@ pipelineOptions.saveSettings=Αποθήκευση Ρυθμίσεων Λειτο
|
||||
pipelineOptions.pipelineNamePrompt=Εισαγάγετε το όνομα του pipeline εδώ
|
||||
pipelineOptions.selectOperation=Επιλέξτε Λειτουργία
|
||||
pipelineOptions.addOperationButton=Προσθήκη λειτουργίας
|
||||
pipelineOptions.pipelineHeader=Pipeline:
|
||||
pipelineOptions.pipelineHeader=Πρότυπο:
|
||||
pipelineOptions.saveButton=Λήψη
|
||||
pipelineOptions.validateButton=Επικυρώνω
|
||||
|
||||
########################
|
||||
# ENTERPRISE EDITION #
|
||||
########################
|
||||
enterpriseEdition.button=Upgrade to Pro
|
||||
enterpriseEdition.warning=This feature is only available to Pro users.
|
||||
enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features.
|
||||
enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro
|
||||
enterpriseEdition.button=Ενημερώστε σε Pro
|
||||
enterpriseEdition.warning=Αυτή η λειτουργία είναι διαθέσιμη μόνο για τους χρήστες Pro.
|
||||
enterpriseEdition.yamlAdvert=Stirling PDF Pro υποστηρίζει αρχεία συνασκήματος YAML και άλλες λειτουργίες SSO.
|
||||
enterpriseEdition.ssoAdvert=Σάξεις για περισσότερες λειτουργίες διαχείρισης χρηστών; Πроверьте Stirling PDF Pro
|
||||
|
||||
|
||||
#################
|
||||
# Analytics #
|
||||
#################
|
||||
analytics.title=Do you want make Stirling PDF better?
|
||||
analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.
|
||||
analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.
|
||||
analytics.enable=Enable analytics
|
||||
analytics.disable=Disable analytics
|
||||
analytics.settings=You can change the settings for analytics in the config/settings.yml file
|
||||
analytics.title=Επιθυμείτε να βελτιώσετε το Stirling PDF;
|
||||
analytics.paragraph1=Stirling PDF έχει επιλεγμένα ανάλυμα για να με βοηθήσει στην βελτίωση του προϊόντος. Δεν ακολουθούμε καμία ιδιοχειρισμένη πληροφορία ή συγκέντρωση υπόλοιπου πλάνου.
|
||||
analytics.paragraph2=Παρακαλώ ενεργοποιήστε τα ανάλυμα για να βοηθήσετε το Stirling-PDF να ξεφύγει και να μας βοηθήσετε στον καλύτερο δυνατό ανάλυμα χρηστών.
|
||||
analytics.enable=Ενεργοποίηση ανάλυμα
|
||||
analytics.disable=Διακόπτωση ανάλυμα
|
||||
analytics.settings=Μπορείτε να αλλάξετε τις προπαραστάσεις των ανάλυμα σε υποθέσεις/settings.yml
|
||||
|
||||
#############
|
||||
# NAVBAR #
|
||||
#############
|
||||
navbar.favorite=Favorites
|
||||
navbar.favorite=Πιρημός
|
||||
navbar.darkmode=Μαύρο Θέμα
|
||||
navbar.language=Languages
|
||||
navbar.language=Γλώσσες
|
||||
navbar.settings=Ρυθμίσεις
|
||||
navbar.allTools=Tools
|
||||
navbar.allTools=Εργαλεία
|
||||
navbar.multiTool=Multi Tools
|
||||
navbar.sections.organize=Organize
|
||||
navbar.sections.convertTo=Convert to PDF
|
||||
navbar.sections.convertFrom=Convert from PDF
|
||||
navbar.sections.security=Sign & Security
|
||||
navbar.sections.advance=Advanced
|
||||
navbar.sections.edit=View & Edit
|
||||
navbar.sections.popular=Popular
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Οργάνωση
|
||||
navbar.sections.convertTo=Μετατροπή σε PDF
|
||||
navbar.sections.convertFrom=Μετατροπή από PDF
|
||||
navbar.sections.security=Υπογραφή & Σέκυνση
|
||||
navbar.sections.advance=Διεξοδικό
|
||||
navbar.sections.edit=Σύντομος Προβολής & Διοίκηση
|
||||
navbar.sections.popular=Επιφανειακά
|
||||
|
||||
#############
|
||||
# SETTINGS #
|
||||
#############
|
||||
settings.title=Ρυθμίσεις
|
||||
settings.update=Υπάρχει διαθέσιμη ενημέρωση
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.updateAvailable={0} είναι το πρόγραμμα εκτελεσιμωμένο σήμερα. Έχετε διαθέσιμη μια νέα έκδοση (σήμερα: {1}).
|
||||
settings.appVersion=Έκδοση εφαρμογής:
|
||||
settings.downloadOption.title=Επιλέξετε την επιλογή λήψης (Για λήψεις μεμονωμένων αρχείων χωρίς zip):
|
||||
settings.downloadOption.1=Άνοιγμα στο ίδιο παράθυρο
|
||||
@@ -163,9 +165,9 @@ settings.downloadOption.3=Λήψη αρχείου
|
||||
settings.zipThreshold=Αρχεία Zip όταν ο αριθμός των ληφθέντων αρχείων είναι πολύ μεγάλος
|
||||
settings.signOut=Αποσύνδεση
|
||||
settings.accountSettings=Ρυθμίσεις Λογαριασμού
|
||||
settings.bored.help=Enables easter egg game
|
||||
settings.cacheInputs.name=Save form inputs
|
||||
settings.cacheInputs.help=Enable to store previously used inputs for future runs
|
||||
settings.bored.help=Ενεργοποίηση παιχνίδι ευφήμων
|
||||
settings.cacheInputs.name=Αποθήκευση των εισαγωγών
|
||||
settings.cacheInputs.help=Ενεργοποίηση για να αποθηκεύσετε προηγουμένως χρησιμοποιημένες εισαγωγές για το μέλλον
|
||||
|
||||
changeCreds.title=Αλλαγή Διαπιστευτηρίων
|
||||
changeCreds.header=Ενημέρωση των λεπτομερειών του Λογαριασμού σας
|
||||
@@ -193,7 +195,7 @@ account.signOut=Αποσύνδεση
|
||||
account.yourApiKey=Το κλειδί σας για τη διεπαφή προγραμματισμού εφαρμογών (API key)
|
||||
account.syncTitle=Συγχρονισμός των ρυθμίσεων του φυλλομετρητή (Web Browser) με τον λογαριασμό
|
||||
account.settingsCompare=Σύγκριση Ρυθμίσεων:
|
||||
account.property=Property
|
||||
account.property=Υπεροχή
|
||||
account.webBrowserSettings=Ρύθμιση φυλλομετρητή (Web Browser)
|
||||
account.syncToBrowser=Συγχρονισμός Λογαριασμού -> Φυλλομετρητή (Web Browser)
|
||||
account.syncToAccount=Συγχρονισμός Λογαριασμού <- Φυλλομετρητή (Web Browser)
|
||||
@@ -204,10 +206,10 @@ adminUserSettings.header=Ρυθμίσεις ελέγχου Διαχειριστ
|
||||
adminUserSettings.admin=Διαχειριστής
|
||||
adminUserSettings.user=Χρήστης
|
||||
adminUserSettings.addUser=Προσθήκη νέου Χρήστη
|
||||
adminUserSettings.deleteUser=Delete User
|
||||
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||
adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled?
|
||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||
adminUserSettings.deleteUser=Διαγραφή Χρηστών
|
||||
adminUserSettings.confirmDeleteUser=Είναι αποδεκτό να διαγράψετε τον χρήστη;
|
||||
adminUserSettings.confirmChangeUserStatus=Είναι αποδεκτό να αλλάξετε το σύμβαθρο του χρηστών;
|
||||
adminUserSettings.usernameInfo=Το όνομα χρήστη μπορεί να περιέχει μόνο γράμματα, αριθμούς και τα εξής διευρυμένα συμβολικά @._+- ή πρέπει να είναι έγκυρο e-mail.
|
||||
adminUserSettings.roles=Ρόλοι
|
||||
adminUserSettings.role=Ρόλος
|
||||
adminUserSettings.actions=Ενέργειες
|
||||
@@ -219,33 +221,34 @@ adminUserSettings.internalApiUser=Εσωτερικός API χρήστης
|
||||
adminUserSettings.forceChange=Αναγκάστε τον χρήστη να αλλάξει το όνομα χρήστη/κωδικό πρόσβασης κατά τη σύνδεση
|
||||
adminUserSettings.submit=Αποθήκευση Χρήστη
|
||||
adminUserSettings.changeUserRole=Αλλαγή ρόλου χρήστη
|
||||
adminUserSettings.authenticated=Authenticated
|
||||
adminUserSettings.editOwnProfil=Edit own profile
|
||||
adminUserSettings.enabledUser=enabled user
|
||||
adminUserSettings.disabledUser=disabled user
|
||||
adminUserSettings.activeUsers=Active Users:
|
||||
adminUserSettings.disabledUsers=Disabled Users:
|
||||
adminUserSettings.totalUsers=Total Users:
|
||||
adminUserSettings.lastRequest=Last Request
|
||||
adminUserSettings.authenticated=Εγγεγραφές
|
||||
adminUserSettings.editOwnProfil=Επεξεργασία Τοποθεσίας Δικότητας
|
||||
adminUserSettings.enabledUser=Ενεργούς Χρήστης
|
||||
adminUserSettings.disabledUser=Απενεργούς Χρήστης
|
||||
adminUserSettings.activeUsers=Ενεργοί Χρήστες:
|
||||
adminUserSettings.disabledUsers=Απενεργοί Χρήστες:
|
||||
adminUserSettings.totalUsers=Συνολικός Αριθμός Χρηστών:
|
||||
adminUserSettings.lastRequest=Τελευταία Ερώτηση
|
||||
|
||||
|
||||
database.title=Database Import/Export
|
||||
database.header=Database Import/Export
|
||||
database.fileName=File Name
|
||||
database.creationDate=Creation Date
|
||||
database.fileSize=File Size
|
||||
database.deleteBackupFile=Delete Backup File
|
||||
database.importBackupFile=Import Backup File
|
||||
database.downloadBackupFile=Download Backup File
|
||||
database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application.
|
||||
database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention.
|
||||
database.submit=Import Backup
|
||||
database.importIntoDatabaseSuccessed=Import into database successed
|
||||
database.title=Εισάγωντας/Εξαγωγή Δεδομένων Βάσης Δεδομένων
|
||||
database.header=Εισάγωντας/Εξαγωγή Δεδομένων Βάσης Δεδομένων
|
||||
database.fileName=Όνομα αρχείου
|
||||
database.creationDate=Ημερομηνία δημιουργίας
|
||||
database.fileSize=Μέγεθος αρχείου
|
||||
database.deleteBackupFile=Διαγραφή Προγράμματος Ανασυγκρότησης
|
||||
database.importBackupFile=Εισάγωντας Προγράμματος Ανασυγκρότησης
|
||||
database.downloadBackupFile=Κατέβασμα Προγράμματος Ανασυγκρότησης
|
||||
database.info_1=Όταν εισάγετε δεδομένα, είναι σημαντικό να εξασφαλίσετε τη σωστή μορφοποίηση. Αν δεν είστε σίγουροι για το ποια πράγματα κάνετε, αιτήστε υποβολή και υποστήριξη από ευελίκτω. Μια σφάλμα στη μορφοποίηση μπορεί να προκαλέσει καταστάσεις λάθους στην εφαρμογή, αν όχι ολόκληρη την αποχώρηση της εφαρμογής.
|
||||
database.info_2=Το ονόμα του αρχείου δεν έχει σημασία όταν ξεκινάτε μια επέμβαση. Αλλαγήται αργότερα για να ακολουθήσει το σχήμα backup_ωςώντας_YYYYMMDDHHmm.sql, επιτρέποντας μια συνεχές κατάληψη ονόματος.
|
||||
database.submit=Εισάγωντας Προγράμματος Ανασυγκρότησης
|
||||
database.importIntoDatabaseSuccessed=Τελείωση εισαγωγής στη βάση δεδομένων.
|
||||
database.fileNotFound=File not Found
|
||||
database.fileNullOrEmpty=File must not be null or empty
|
||||
database.fileNullOrEmpty=Το αρχείο δεν μπορεί να είναι τυχόν ή κενό.
|
||||
database.failedImportFile=Failed Import File
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.expired=Η σεζώνη σας υπάρξει παραγωγή. Πατήστε για να ανανεώσετε το πλήρωμα και δοκιμάστε ξανά.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -256,7 +259,7 @@ home.searchBar=Αναζήτηση για χαρακτηριστικά...
|
||||
|
||||
home.viewPdf.title=Εμφάνιση PDF
|
||||
home.viewPdf.desc=Εμφάνιση, προσθήκη σχεδίου, προσθήκη κειμένου ή εικόνων
|
||||
viewPdf.tags=view,read,annotate,text,image
|
||||
viewPdf.tags=ψηφιοποίηση,ανάγνωση,καταχώρηση,τεκτωνική,εικόνα
|
||||
|
||||
home.multiTool.title=PDF Πολυεργαλείο
|
||||
home.multiTool.desc=Συγχώνευση, Περιστροφή, Αναδιάταξη και Κατάργηση σελίδων
|
||||
@@ -264,11 +267,11 @@ multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,in
|
||||
|
||||
home.merge.title=Συγχώνευση
|
||||
home.merge.desc=Συγχώνευση πολλών PDF σε ένα με εύκολο τρόπο.
|
||||
merge.tags=merge,Page operations,Back end,server side
|
||||
merge.tags=συνδυασμός,λεπτομέρειες σελίδας,μετάβαση από το μέχρι το κράτος,κρήτερο χρώμα
|
||||
|
||||
home.split.title=Διαχωρισμός
|
||||
home.split.desc=Διαχωρισμός των PDF σε πολλά έγγραφα.
|
||||
split.tags=Page operations,divide,Multi Page,cut,server side
|
||||
split.tags=λεπτομέρειες σελίδας,διαχωρισμός,πολυσελίδια,κοπή,κρήτερο χρώμα
|
||||
|
||||
home.rotate.title=Περιστροφή
|
||||
home.rotate.desc=Περιστροφή των PDF σας με εύκολο τρόπο.
|
||||
@@ -277,45 +280,45 @@ rotate.tags=από την πλευρά του server
|
||||
|
||||
home.imageToPdf.title=Εικόνα σε PDF
|
||||
home.imageToPdf.desc=Μετατροπή εικόνας (PNG, JPEG, GIF) σε PDF.
|
||||
imageToPdf.tags=conversion,img,jpg,picture,photo
|
||||
imageToPdf.tags=διαδοχική ψηφιοποίηση,εικόνα,jpg,πληροφορίας,φωτογραφία
|
||||
|
||||
home.pdfToImage.title=PDF σε εικόνα
|
||||
home.pdfToImage.desc=Μετατροπή ενός PDF σε μία εικόνα. (PNG, JPEG, GIF)
|
||||
pdfToImage.tags=conversion,img,jpg,picture,photo
|
||||
pdfToImage.tags=διαδοχική ψηφιοποίηση,εικόνα,jpg,πληροφορίας,φωτογραφία
|
||||
|
||||
home.pdfOrganiser.title=Οργάνωση
|
||||
home.pdfOrganiser.desc=Αφαίρεση/Αναδιάταξη σελίδων με οποιαδήποτε σειρά
|
||||
pdfOrganiser.tags=duplex,even,odd,sort,move
|
||||
pdfOrganiser.tags=διπλώματος,ήρωαι,ίσοδες,κατάταξη,μέταβαση
|
||||
|
||||
|
||||
home.addImage.title=Προσθήκη Εικόνας
|
||||
home.addImage.desc=Προσθήκη μιας εικόνας σε μια καθορισμένη θέση στο PDF
|
||||
addImage.tags=img,jpg,picture,photo
|
||||
addImage.tags=εικόνα,γούστιο,φωτογραφία
|
||||
|
||||
home.watermark.title=Προσθήκη Υδατογραφήματος
|
||||
home.watermark.desc=Προσθήκη ενός προσαρμοσμένου υδατογράφηματος στο έγγραφό PDF.
|
||||
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
|
||||
watermark.tags=λέξη-πίνακας,τυπώμενο,ετικέτα,δικαιοχειρισμός,διόρθωση,εικόνα,γούστιο,φωτογραφία
|
||||
|
||||
home.permissions.title=Αλλαγή Δικαιωμάτων
|
||||
home.permissions.desc=Αλλαγή των Δικαιωμάτων στο έγγραφο PDF
|
||||
permissions.tags=read,write,edit,print
|
||||
permissions.tags=αποκοπή,γραμμακτής,μετάβαση
|
||||
|
||||
|
||||
home.removePages.title=Αφαίρεση
|
||||
home.removePages.desc=Αφαίρεση μή επιθυμητών σελίδων απο το έγγραφο PDF.
|
||||
removePages.tags=Remove pages,delete pages
|
||||
removePages.tags=απόθεση σελίδων,διαγραφή σελίδων
|
||||
|
||||
home.addPassword.title=Προσθήκη κωδικού
|
||||
home.addPassword.desc=Κρυπτογράφηση - κλείδωμα του PDF αρχείου με έναν κωδικό.
|
||||
addPassword.tags=secure,security
|
||||
addPassword.tags=σφραγίστω,σφραγίζομαι
|
||||
|
||||
home.removePassword.title=Αφαίρεση Κωδικού
|
||||
home.removePassword.desc=Κατάργήση της προστασίας με κωδικό πρόσβασης από το έγγραφο PDF.
|
||||
removePassword.tags=secure,Decrypt,security,unpassword,delete password
|
||||
removePassword.tags=σφραγίστω,παρακυμπνώ,σφραγική,διαγραφή σφραγίδας
|
||||
|
||||
home.compressPdfs.title=Συμπίεση
|
||||
home.compressPdfs.desc=Συμπίεση των αρχείων PDF για την μείωση του μεγέθους τους.
|
||||
compressPdfs.tags=squish,small,tiny
|
||||
compressPdfs.tags=ελαφρύνση,κοντά,τροχιές
|
||||
|
||||
|
||||
home.changeMetadata.title=Αλλαγή Μεταδεδομένων
|
||||
@@ -328,16 +331,16 @@ fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,offi
|
||||
|
||||
home.ocr.title=οπτική αναγνώριση χαρακτήρων (OCR) / Σαρώσεις Cleanup
|
||||
home.ocr.desc=Το Cleanup σαρώνει και ανιχνεύει κείμενο από εικόνες μέσα σε ένα PDF και το προσθέτει ξανά ως κείμενο
|
||||
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
|
||||
ocr.tags=γνώση,λέξεις,εικόνα,ζήτημα,ανίδηση,δοχή,πρόγραμμα γνωστικής ανάγνωσης
|
||||
|
||||
|
||||
home.extractImages.title=Εξαγωγή εικόνων
|
||||
home.extractImages.desc=Εξαγωγή όλων των εικόνων απο ένα PDF και αποθήκευση αυτών σε zip
|
||||
extractImages.tags=picture,photo,save,archive,zip,capture,grab
|
||||
extractImages.tags=εικόνα,φωτογραφία,θυλώματος,αρχείο,γραφή,παράδειγμα
|
||||
|
||||
home.pdfToPDFA.title=PDF σε PDF/A
|
||||
home.pdfToPDFA.desc=Μετατροπή PDF σε PDF/A για μακροχρόνια αποθήκευση
|
||||
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
|
||||
pdfToPDFA.tags=θυλώματος,σύνολο,κανόνες,παραστατικό,κράτηση
|
||||
|
||||
home.PDFToWord.title=PDF σε Word
|
||||
home.PDFToWord.desc=Μετατροπή του PDF σε Word αρχείο (DOC, DOCX and ODT)
|
||||
@@ -353,24 +356,24 @@ PDFToText.tags=richformat,richtextformat,rich text format
|
||||
|
||||
home.PDFToHTML.title=PDF σε HTML
|
||||
home.PDFToHTML.desc=Μετατροπή του PDF σε μορφή HTML
|
||||
PDFToHTML.tags=web content,browser friendly
|
||||
PDFToHTML.tags=πρόσβαση σε πλαίσιο,περιεχόμενα για διαδικτυακά
|
||||
|
||||
|
||||
home.PDFToXML.title=PDF σε XML
|
||||
home.PDFToXML.desc=Μετατροπή του PDF σε μορφή XML
|
||||
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
|
||||
PDFToXML.tags=ξυστώση-δεδομένων,σύνθεση στρογγυλών εξισώσεων,κοντινή κατάληψη,πρόσβαση
|
||||
|
||||
home.ScannerImageSplit.title=Ανίχνευση/Διαίρεση σαρωμένων φωτογραφιών
|
||||
home.ScannerImageSplit.desc=Διαχωρίσμός πολλών φωτογραφίών μέσα από μια φωτογραφία/PDF
|
||||
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
|
||||
ScannerImageSplit.tags=διχοτομία,δικτυακή-δοκιμασία,σκάνερις,θέση πλατύων,διαχώριση
|
||||
|
||||
home.sign.title=Υπογραφή
|
||||
home.sign.desc=Προσθήκη υπογραφής στο PDF με σχέδιο, κείμενο ή εικόνα.
|
||||
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
|
||||
sign.tags=αποθωμάσια,κατογώρηση,φωνή,χαρακτεία-υπογραφής
|
||||
|
||||
home.flatten.title=Flatten
|
||||
home.flatten.title=Συνοπτικοποίηση
|
||||
home.flatten.desc=Κατάργηση όλων των διαδραστικών στοιχείων και φορμών από ένα PDF
|
||||
flatten.tags=static,deactivate,non-interactive,streamline
|
||||
flatten.tags=εγχώριο,απενεργοποιήση,αδρανής-ενεργό,προσαρμογές
|
||||
|
||||
home.repair.title=Επιδιόρθωση
|
||||
home.repair.desc=Προσπάθεια επιδιόρθωσης ενός κατεστραμμένου PDF
|
||||
@@ -378,87 +381,87 @@ repair.tags=fix,restore,correction,recover
|
||||
|
||||
home.removeBlanks.title=Αφαίρεση κενών Σελίδων
|
||||
home.removeBlanks.desc=Ανίχευση και αφαίρεση κενών σελίδων από ένα έγγραφο
|
||||
removeBlanks.tags=cleanup,streamline,non-content,organize
|
||||
removeBlanks.tags=καθαρισμός,προσαρμογές,εξωφύλακτες-δεδομένων,διοργάνωση
|
||||
|
||||
home.removeAnnotations.title=Remove Annotations
|
||||
home.removeAnnotations.desc=Removes all comments/annotations from a PDF
|
||||
removeAnnotations.tags=comments,highlight,notes,markup,remove
|
||||
home.removeAnnotations.title=Αποθήκευση Παρατηρήσεων
|
||||
home.removeAnnotations.desc=Ελέγξτε και προστίθετε σχόλια/παρατηρήσεις από το PDF
|
||||
removeAnnotations.tags=σχόλια,κουμπί-ντεκτ,χαρτές,κάθετα-δεδομένα,αποβολή
|
||||
|
||||
home.compare.title=Σύγκριση
|
||||
home.compare.desc=Σύγκριση και εμφάνιση των διαφορών μεταξύ δύο PDF αρχείων
|
||||
compare.tags=differentiate,contrast,changes,analysis
|
||||
compare.tags=διακρίσεις,σύγκριση,αλλαγές,πληθυσμική-ανάλυση
|
||||
|
||||
home.certSign.title=Υπογραφή με Πιστοποιητικό
|
||||
home.certSign.desc=Υπογραφή ενός PDF αρχείου με ένα Πιστοποιητικό/Κλειδί (PEM/P12)
|
||||
certSign.tags=authenticate,PEM,P12,official,encrypt
|
||||
certSign.tags=υπογραφή,PEM,P12,δημοσίες,δεκτικότητα,κρυπτογράφηση
|
||||
|
||||
home.removeCertSign.title=Remove Certificate Sign
|
||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
||||
home.removeCertSign.title=Αποθήκευση Υπογραφής Τέλους
|
||||
home.removeCertSign.desc=Εμβέλειες σημάδισης από το PDF
|
||||
removeCertSign.tags=υπογραφή,PEM,P12,δημοσίες,κρυπτογράφηση-κλείσιμο
|
||||
|
||||
home.pageLayout.title=Διάταξη πολλών σελίδων
|
||||
home.pageLayout.desc=Συγχώνευση πολλαπλών σελίδων ενός εγγράφου PDF σε μία μόνο σελίδα
|
||||
pageLayout.tags=merge,composite,single-view,organize
|
||||
pageLayout.tags=σύνθεση,ενωμένη,απλή-ροεπίσκαιρα,διοργάνωση
|
||||
|
||||
home.scalePages.title=Προσαρμογή του μεγέθους/κλίμακας σελίδας
|
||||
home.scalePages.desc=Αλλαγή του μεγέθους/κλίμακας μίας σελίδας και/η του περιεχομένου της.
|
||||
scalePages.tags=resize,modify,dimension,adapt
|
||||
scalePages.tags=μεταβάλλοντας τους διάστασες,ενδιαφέροντες πόροι,παρακμή,μετατύχηση
|
||||
|
||||
home.pipeline.title=Pipeline (Για προχωρημένους)
|
||||
home.pipeline.desc=Εκτέλεση πολλαπλών ενεργειών σε αρχεία PDF ορίζοντας pipeline scripts
|
||||
pipeline.tags=automate,sequence,scripted,batch-process
|
||||
pipeline.tags=αυτόματος κλωστήρας,σειρά,γραμμογραφική,αποδτομή-πακέτων
|
||||
|
||||
home.add-page-numbers.title=Προσθήκη αριθμών σε Σελίδες
|
||||
home.add-page-numbers.desc=Προσθήκη αριθμών σελίδων σε ένα έγγραφο σε μια καθορισμένη θέση
|
||||
add-page-numbers.tags=paginate,label,organize,index
|
||||
add-page-numbers.tags=αυτόματη αρίθμηση σελίδων,κατάταξη,διοργάνωση,παραγγελία
|
||||
|
||||
home.auto-rename.title=Αυτόματη μετονομασία αρχείου PDF
|
||||
home.auto-rename.desc=Αυτόματη μετονομασία ενός αρχείου PDF με βάση την κεφαλίδα που έχει εντοπιστεί
|
||||
auto-rename.tags=auto-detect,header-based,organize,relabel
|
||||
auto-rename.tags=αυτόματη αναδεικτική κατατάξη μέσω κεφαλαιών,διοργάνωση,καθαρισμός
|
||||
|
||||
home.adjust-contrast.title=Προσαρμογή χρωμάτων/Αντίθεση
|
||||
home.adjust-contrast.desc=Προσαρμογή της αντίθεσης, του κορεσμού και της φωτεινότητας ενός PDF
|
||||
adjust-contrast.tags=color-correction,tune,modify,enhance
|
||||
adjust-contrast.tags=καταπολέμηση του συγκρούσεων,ενδιαφέροντας ελέγχο,μεταβάλλοντας για είδη,εξέλιξη
|
||||
|
||||
home.crop.title=Περικοπή PDF
|
||||
home.crop.desc=Περικοπή ενός PDF για να μειωθεί το μέγεθός του (διατηρεί το κείμενο!)
|
||||
crop.tags=trim,shrink,edit,shape
|
||||
crop.tags=καταγραφή-καύσης,περικόπτωση,επεξεργασία,forma
|
||||
|
||||
home.autoSplitPDF.title=Αυτόματος διαχωρισμός σελίδων
|
||||
home.autoSplitPDF.desc=Αυτόματος διαχωρισμός σαρωμένου PDF με φυσικό σαρωμένο διαχωριστή σελίδων QR Code
|
||||
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
|
||||
autoSplitPDF.tags=βάσει QR-code,διχοτομία,ελέγχο-διχοτομία,κλάδωση
|
||||
|
||||
home.sanitizePdf.title=Απολύμανση
|
||||
home.sanitizePdf.desc=Αφαίρεση σεναρίων και άλλων στοιχείων από αρχεία PDF
|
||||
sanitizePdf.tags=clean,secure,safe,remove-threats
|
||||
sanitizePdf.tags=καθαρισμός,διατηρητική,ασφάλεια,προσχώρηση-δυνατότητες
|
||||
|
||||
home.URLToPDF.title=URL/Ιστότοπος σε PDF
|
||||
home.URLToPDF.desc=Μετατροπή οποιαδήποτε διεύθυνσης URL http(s) σε PDF
|
||||
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
|
||||
URLToPDF.tags=καταγραφή-Διαδικτύου,θηράω-σεγκένεια,Διαδικτυακό-σε-δοκίμιο,αποθήκευση
|
||||
|
||||
home.HTMLToPDF.title=HTML σε PDF
|
||||
home.HTMLToPDF.desc=Μετατροπή οποιουδήποτε αρχείου HTML ή zip σε PDF
|
||||
HTMLToPDF.tags=markup,web-content,transformation,convert
|
||||
HTMLToPDF.tags=μάρκαρι,χρηστήρια-Διαδικτύου,παρασταση,καλύτερο
|
||||
|
||||
|
||||
home.MarkdownToPDF.title=Markdown σε PDF
|
||||
home.MarkdownToPDF.desc=Μετατροπή οποιουδήποτε αρχείου Markdown σε PDF
|
||||
MarkdownToPDF.tags=markup,web-content,transformation,convert
|
||||
MarkdownToPDF.tags=μάρκαρι,χρηστήρια-Διαδικτύου,παρασταση,καλύτερο
|
||||
|
||||
|
||||
home.getPdfInfo.title=Λήψη όλων των πληροφοριών από το PDF
|
||||
home.getPdfInfo.desc=Λήψη όλων των πιθανών πληροφοριών από τα αρχεία PDF
|
||||
getPdfInfo.tags=infomation,data,stats,statistics
|
||||
getPdfInfo.tags=πληροφορίες,δεδομένα,στατιστικά,πληθυσμός
|
||||
|
||||
|
||||
home.extractPage.title=Εξαγωγή σελίδων
|
||||
home.extractPage.desc=Εξαγωγή των επιλεγμένων σελίδων από ένα PDF
|
||||
extractPage.tags=extract
|
||||
extractPage.tags=αποδιατύπωση
|
||||
|
||||
|
||||
home.PdfToSinglePage.title=PDF σε μία μεγάλη σελίδα
|
||||
home.PdfToSinglePage.desc=Συγχώνευση όλων των σελίδων PDF σε μια μεγάλη σελίδα
|
||||
PdfToSinglePage.tags=single page
|
||||
PdfToSinglePage.tags=για-μία-σελίδα
|
||||
|
||||
|
||||
home.showJS.title=Εμφάνιση Javascript
|
||||
@@ -467,29 +470,29 @@ showJS.tags=JS
|
||||
|
||||
home.autoRedact.title=Αυτόματο Μαύρισμα Κειμένου
|
||||
home.autoRedact.desc=Αυτόματη επεξεργασία (Μαύρισμα) κείμενου σε PDF με βάση το κείμενο εισαγωγής
|
||||
autoRedact.tags=Redact,Hide,black out,black,marker,hidden
|
||||
autoRedact.tags=ξεκράζω,φυλακίζω,εικόνο-κουπές,κρατήστε ασφαλείς,δημιουργήστε
|
||||
|
||||
home.tableExtraxt.title=PDF σε CSV
|
||||
home.tableExtraxt.desc=Εξάγει πίνακες από PDF μετατρέποντάς το σε CSV
|
||||
tableExtraxt.tags=CSV,Table Extraction,extract,convert
|
||||
tableExtraxt.tags=CSV,καταθέσεις-τάβλες,αποδιατύπωση,μετατροπή
|
||||
|
||||
|
||||
home.autoSizeSplitPDF.title=Αυτόματη διαίρεση κατά μέγεθος/πλήθος
|
||||
home.autoSizeSplitPDF.desc=Διαχωρίστε ένα μόνο PDF σε πολλά έγγραφα με βάση το μέγεθος, τον αριθμό σελίδων ή τον αριθμό εγγράφων
|
||||
autoSizeSplitPDF.tags=pdf,split,document,organization
|
||||
autoSizeSplitPDF.tags=pdf,διαχωρισμός,γραμμακτής,διορθώσεις-κάντε
|
||||
|
||||
|
||||
home.overlay-pdfs.title=Επικάλυψη PDFs
|
||||
home.overlay-pdfs.desc=Επικαλύπτει αρχεία PDF πάνω σε άλλο PDF
|
||||
overlay-pdfs.tags=Overlay
|
||||
overlay-pdfs.tags=πλέξη-πDFs
|
||||
|
||||
home.split-by-sections.title=Διαχωρισμός PDF ανά ενότητες
|
||||
home.split-by-sections.desc=Διαχωρίστε κάθε σελίδα ενός PDF σε μικρότερες οριζόντιες και κάθετες ενότητες
|
||||
split-by-sections.tags=Section Split, Divide, Customize
|
||||
split-by-sections.tags=διχοτομία-διεργασίες,διεργασίες,κρατήστε
|
||||
|
||||
home.AddStampRequest.title=Προσθήκη σφραγίδας σε PDF
|
||||
home.AddStampRequest.desc=Προσθέστε κείμενο ή προσθέστε σφραγίδες εικόνας σε καθορισμένες τοποθεσίες
|
||||
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
|
||||
AddStampRequest.tags=κάντε-πίνακα,πρόσθεση-εικόνας,κέντρο-εικόνας,χαμυλόχατο,PDF,βάζω-δείγμα,κρατήστε
|
||||
|
||||
|
||||
home.PDFToBook.title=PDF σε Book
|
||||
@@ -500,33 +503,33 @@ home.BookToPDF.title=Book σε PDF
|
||||
home.BookToPDF.desc=Μετατρέπει τις μορφές Books/Comics σε PDF χρησιμοποιώντας calibre
|
||||
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
|
||||
home.removeImagePdf.title=Remove image
|
||||
home.removeImagePdf.desc=Remove image from PDF to reduce file size
|
||||
removeImagePdf.tags=Remove Image,Page operations,Back end,server side
|
||||
home.removeImagePdf.title=Αφαίρεση εικόνας
|
||||
home.removeImagePdf.desc=Αφαίρεση εικόνας από το PDF για να μειώσετε το μέγεθος του αρχείου
|
||||
removeImagePdf.tags=Αφαίρεση-Εικόνας,Πράξεις-Σελίδας,ύπαρξη-τμήματος,πλην-δυναμική
|
||||
|
||||
|
||||
home.splitPdfByChapters.title=Split PDF by Chapters
|
||||
home.splitPdfByChapters.title=Διχοτομία PDF ανά Περιγραφές
|
||||
home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure.
|
||||
splitPdfByChapters.tags=split,chapters,bookmarks,organize
|
||||
splitPdfByChapters.tags=διχοτομία,περιγραφές,κεφάλαια,συνορία
|
||||
|
||||
#replace-invert-color
|
||||
replace-color.title=Replace-Invert-Color
|
||||
replace-color.header=Replace-Invert Color PDF
|
||||
replace-color.header=Αντικατάσταση-Αντίστροφη Παθωμένη Πίντσουρ
|
||||
home.replaceColorPdf.title=Replace and Invert Color
|
||||
home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size
|
||||
replaceColorPdf.tags=Replace Color,Page operations,Back end,server side
|
||||
replace-color.selectText.1=Replace or Invert color Options
|
||||
replace-color.selectText.2=Default(Default high contrast colors)
|
||||
replace-color.selectText.3=Custom(Customized colors)
|
||||
replace-color.selectText.4=Full-Invert(Invert all colors)
|
||||
replace-color.selectText.5=High contrast color options
|
||||
replace-color.selectText.6=white text on black background
|
||||
replace-color.selectText.7=Black text on white background
|
||||
replace-color.selectText.8=Yellow text on black background
|
||||
replace-color.selectText.9=Green text on black background
|
||||
replace-color.selectText.10=Choose text Color
|
||||
replace-color.selectText.11=Choose background Color
|
||||
replace-color.submit=Replace
|
||||
home.replaceColorPdf.desc=Αντικατάσταση χρώματος για το πεδίο κειμένου και απόχρωμη έκθεση PDF για μείωση μεγέθους αρχείου
|
||||
replaceColorPdf.tags=Αντικατάσταση χρώματος, Διαδικασίες σελίδας, Μέσω πληροφόρησης, Από την εσωτερική
|
||||
replace-color.selectText.1=Επιλογές αντικατάστασης-Αντίστροφης χρώματος
|
||||
replace-color.selectText.2=Προεπιλογή (Χαράκτηρες υψηλής αντιδιαβάσιμότητας)
|
||||
replace-color.selectText.3=Εξαιρετικό (Προσωπικές επιλογές χρώματος)
|
||||
replace-color.selectText.4=Αντίστροφη Παθωμένη (Αντίστροφη αντικατάσταση όλων των πχώματος)
|
||||
replace-color.selectText.5=Επιλογές υψηλής αντιδιαβάσιμότητας
|
||||
replace-color.selectText.6=Χρίστος το πεδίο κειμένου σε μαύρη οπτική
|
||||
replace-color.selectText.7=Μαύρο το πεδίο κειμένου σε χλωρό οπτική
|
||||
replace-color.selectText.8=Ευτυχισμένο το πεδίο κειμένου σε μαύρη οπτική
|
||||
replace-color.selectText.9=Χλωροφαίνοντος το πεδίο κειμένου σε μαύρη οπτική
|
||||
replace-color.selectText.10=Επιλογή χρώματος του κειμένου
|
||||
replace-color.selectText.11=Επιλογή απόχρωμης οπτικής
|
||||
replace-color.submit=Αντικατάσταση
|
||||
|
||||
|
||||
|
||||
@@ -545,17 +548,17 @@ login.locked=Ο λογαριασμός σας έχει κλειδωθεί.
|
||||
login.signinTitle=Παρακαλώ, συνδεθείτε
|
||||
login.ssoSignIn=Σύνδεση μέσω μοναδικής σύνδεσης
|
||||
login.oauth2AutoCreateDisabled=Απενεργοποιήθηκε ο χρήστης αυτόματης δημιουργίας OAUTH2
|
||||
login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator.
|
||||
login.oauth2RequestNotFound=Authorization request not found
|
||||
login.oauth2InvalidUserInfoResponse=Invalid User Info Response
|
||||
login.oauth2invalidRequest=Invalid Request
|
||||
login.oauth2AccessDenied=Access Denied
|
||||
login.oauth2InvalidTokenResponse=Invalid Token Response
|
||||
login.oauth2InvalidIdToken=Invalid Id Token
|
||||
login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator.
|
||||
login.alreadyLoggedIn=You are already logged in to
|
||||
login.alreadyLoggedIn2=devices. Please log out of the devices and try again.
|
||||
login.toManySessions=You have too many active sessions
|
||||
login.oauth2AdminBlockedUser=Η εγγραφή και το πληκτρολόγημα ανθρώπων με όχι εγγραμμένες λογισμικές αρχίζουν να είναι ορισμένες τοποθετήσεις. Παρακαλώ στείλτε μια ισχυρά παραίτηση στον διοικητή.
|
||||
login.oauth2RequestNotFound=Απαιτήσεις πληροφόρησης χρήστη ανακαλύψτηκαν μη έχουν βρεθεί
|
||||
login.oauth2InvalidUserInfoResponse=Απάντηση μεμονωμένων πληροφοριών χρήστη αποδείξτηκε άγνωστη
|
||||
login.oauth2invalidRequest=Αρχαίως απαιτήσεις πληροφοριών χρήστη
|
||||
login.oauth2AccessDenied=Πρόσβαση ορισμένες τοποθετήσεις
|
||||
login.oauth2InvalidTokenResponse=Απάντηση άρκετο ρόταμα
|
||||
login.oauth2InvalidIdToken=Λιδός όρκου μη αρκετός
|
||||
login.userIsDisabled=Ο χρήστης είναι δευτεροβαθμιακά διακωμένος, το σύστημα άλλαξε τον καθώς βρεθεί. Παρακαλείστε τους αρχηγούς να επιβεβαιώσουν τη συμπεριφορά χρήστη.
|
||||
login.alreadyLoggedIn=Είστε ήδη σύνδεδες σε
|
||||
login.alreadyLoggedIn2=κατοχόι. Παρακαλώ δυσκέντρωση τους και προσπαθήστε ξανά.
|
||||
login.toManySessions=Έχετε πολλές εγγραφές σε βίτιο μέση
|
||||
|
||||
#auto-redact
|
||||
autoRedact.title=Αυτόματο Μαύρισμα Κειμένου
|
||||
@@ -565,7 +568,7 @@ autoRedact.textsToRedactLabel=Κείμενο για μαύρισμα (διαχω
|
||||
autoRedact.textsToRedactPlaceholder=π.χ. \nΕμπιστευτικό \nΑκρώς απόρρητο
|
||||
autoRedact.useRegexLabel=Χρήση Regex
|
||||
autoRedact.wholeWordSearchLabel=Αναζήτηση ολόκληρης της λέξης
|
||||
autoRedact.customPaddingLabel=Custom Extra Padding
|
||||
autoRedact.customPaddingLabel=Εμπνευσμένη Προσθήκη Ανάκρισης
|
||||
autoRedact.convertPDFToImageLabel=Μετατροπή PDF σε PDF-Εικόνα (Χρησιμοποιείται για την αφαίρεση κειμένου πίσω από το πλαίσιο)
|
||||
autoRedact.submitButton=Υποβολή
|
||||
|
||||
@@ -631,7 +634,7 @@ HTMLToPDF.defaultHeader=Ενεργοποίηση προεπιλεγμένης κ
|
||||
HTMLToPDF.cssMediaType=Αλλάξτε τον τύπο μέσων (media type )CSS της σελίδας.
|
||||
HTMLToPDF.none=Κανένα
|
||||
HTMLToPDF.print=Εκτύπωσε
|
||||
HTMLToPDF.screen=Screen
|
||||
HTMLToPDF.screen=Ορόσκοπος
|
||||
|
||||
|
||||
#AddStampRequest
|
||||
@@ -730,7 +733,7 @@ pageLayout.submit=Υποβολή
|
||||
scalePages.title=Προσαρμογή κλίμακας σελίδας
|
||||
scalePages.header=Προσαρμογή κλίμακας σελίδας
|
||||
scalePages.pageSize=Μέγεθος μιας σελίδας του εγγράφου.
|
||||
scalePages.keepPageSize=Original Size
|
||||
scalePages.keepPageSize=Τροποποίηση με ευθύγειες γραμμές
|
||||
scalePages.scaleFactor=Επίπεδο ζουμ (περικοπή) σελίδας.
|
||||
scalePages.submit=Υποβολή
|
||||
|
||||
@@ -750,14 +753,15 @@ certSign.showSig=Εμφάνιση Υπογραφής
|
||||
certSign.reason=Αιτία
|
||||
certSign.location=Τοποθεσία
|
||||
certSign.name=Όνομα
|
||||
certSign.showLogo=Προειδοποίηση Παρόχου
|
||||
certSign.submit=Υπογραφή PDF
|
||||
|
||||
|
||||
#removeCertSign
|
||||
removeCertSign.title=Remove Certificate Signature
|
||||
removeCertSign.header=Remove the digital certificate from the PDF
|
||||
removeCertSign.selectPDF=Select a PDF file:
|
||||
removeCertSign.submit=Remove Signature
|
||||
removeCertSign.title=Αφαίρεση Αντικειμένων Τυπογραφίας Τομβής
|
||||
removeCertSign.header=Αφαίρεση της πληροφόρησης όρκου από το PDF
|
||||
removeCertSign.selectPDF=Επιλέξτε ένα αρχείο PDF:
|
||||
removeCertSign.submit=Αφαιρέστε την ψήφιση
|
||||
|
||||
|
||||
#removeBlanks
|
||||
@@ -779,14 +783,14 @@ removeAnnotations.submit=Κατάργηση
|
||||
#compare
|
||||
compare.title=Σύγκριση
|
||||
compare.header=Σύγκριση PDFs
|
||||
compare.highlightColor.1=Highlight Color 1:
|
||||
compare.highlightColor.2=Highlight Color 2:
|
||||
compare.highlightColor.1=Μάσκα Εμφανισμού 1:
|
||||
compare.highlightColor.2=Μάσκα Εμφανισμού 2:
|
||||
compare.document.1=Έγγραφο 1
|
||||
compare.document.2=Έγγραφο 2
|
||||
compare.submit=Σύγκριση
|
||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
||||
compare.complex.message=Ένα ή τα δίπλα αποδεκτής χαρτογράφημα είναι μεγάλο, η πραγματικότητα αναζήτησης μπορεί να εξαβλύσει τη συγκρίση
|
||||
compare.large.file.message=Ένα ή τα δίπλα αποδεκτής χαρτογράφημα είναι πολύ μεγάλο για να εξυπηρετήσει
|
||||
compare.no.text.message=ένα ή τα δίπλα αποδεκτής χαρτογράφημα δεν περιέχουν κείμενο. Παρακαλώ επιλέξτε PDF με κείμενο για σύγκριση.
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Books και Comics σε PDF
|
||||
@@ -809,12 +813,17 @@ sign.draw=Σχεδίαση υπογραφής
|
||||
sign.text=Εισαγωγή κειμένου
|
||||
sign.clear=Καθάρισμα
|
||||
sign.add=Προσθήκη
|
||||
sign.saved=Saved Signatures
|
||||
sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.saved=Αποθηκευμένες Αλιάσιδες
|
||||
sign.save=Αποθήκευση Αλιάσης
|
||||
sign.personalSigs=Προσωπικές Αλιάσεις
|
||||
sign.sharedSigs=Μεταδότες Αλιάσεις
|
||||
sign.noSavedSigs=Δεν βρέθηκαν αποθηκευμένες αλιάσεις
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Επιδιόρθωση
|
||||
@@ -823,10 +832,10 @@ repair.submit=Επιδιόρθωση
|
||||
|
||||
|
||||
#flatten
|
||||
flatten.title=Flatten
|
||||
flatten.title=Φιλοξένηση
|
||||
flatten.header=Flatten PDFs
|
||||
flatten.flattenOnlyForms=Flatten only forms
|
||||
flatten.submit=Flatten
|
||||
flatten.flattenOnlyForms=Φιλοξενήστε μόνο τα φόρμαδα
|
||||
flatten.submit=Φιλοξένηση
|
||||
|
||||
|
||||
#ScannerImageSplit
|
||||
@@ -840,7 +849,7 @@ ScannerImageSplit.selectText.7=Ελάχιστη επιφάνεια περιγρ
|
||||
ScannerImageSplit.selectText.8=Ρυθμίζει το ελάχιστο όριο περιγράμματος για μια φωτογραφία
|
||||
ScannerImageSplit.selectText.9=Μέγεθος περιγράμματος:
|
||||
ScannerImageSplit.selectText.10=Ορίζει το μέγεθος του περιγράμματος που προστίθεται και αφαιρείται για να αποτρέπονται λευκά περιγράμματα στην έξοδο (προεπιλογή: 1).
|
||||
ScannerImageSplit.info=Python is not installed. It is required to run.
|
||||
ScannerImageSplit.info=Δεν είναι ιστάμενος Python. Είναι απαιτήτων για τη λειτουργία.
|
||||
|
||||
|
||||
#OCR
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=Λειτουργία OCR
|
||||
ocr.selectText.11=Κατάργηση εικόνων μετά το OCR (Καταργεί ΟΛΕΣ τις εικόνες, είναι χρήσιμο μόνο αν αποτελεί μέρος του βήματος μετατροπής)
|
||||
ocr.selectText.12=Τύπος απόδοσης (Για προχωρημένους)
|
||||
ocr.help=Διαβάστε αυτήν την τεκμηρίωση σχετικά με τον τρόπο χρήσης αυτής για άλλες γλώσσες ή/και μη χρήσης σε docker
|
||||
ocr.credit=Αυτή η υπηρεσία χρησιμοποιεί OCRmyPDF και Tesseract για OCR.
|
||||
ocr.credit=Αυτή η υπηρεσία χρησιμοποιεί qpdf και Tesseract για OCR.
|
||||
ocr.submit=Επεξεργασία PDF με OCR
|
||||
|
||||
|
||||
@@ -867,7 +876,7 @@ ocr.submit=Επεξεργασία PDF με OCR
|
||||
extractImages.title=Εξαγωγή Εικόνων
|
||||
extractImages.header=Εξαγωγή Εικόνων
|
||||
extractImages.selectText=Επιλέξτε μορφή εικόνας για να μετατρέψετε τις εξαγόμενες εικόνες
|
||||
extractImages.allowDuplicates=Save duplicate images
|
||||
extractImages.allowDuplicates=Αποθήκευση εικόνων που μπορούν να είναι ίδιες
|
||||
extractImages.submit=Εξαγωγή
|
||||
|
||||
|
||||
@@ -875,7 +884,7 @@ extractImages.submit=Εξαγωγή
|
||||
fileToPDF.title=Αρχείο σε PDF
|
||||
fileToPDF.header=Μετατροπή οποιουδήποτε αρχείου σε PDF
|
||||
fileToPDF.credit=Αυτή η υπηρεσία χρησιμοποιεί LibreOffice και Unoconv για την μετατροπή των αρχείων.
|
||||
fileToPDF.supportedFileTypesInfo=Supported File types
|
||||
fileToPDF.supportedFileTypesInfo=Υποστηριζόμενα αρχεία
|
||||
fileToPDF.supportedFileTypes=Οι υποστηριζόμενοι τύποι αρχείων θα πρέπει να περιλαμβάνουν τα παρακάτω, ωστόσο, για μια πλήρη ενημερωμένη λίστα με τις υποστηριζόμενες μορφές, ανατρέξτε στην τεκμηρίωση του LibreOffice
|
||||
fileToPDF.submit=Μετατροπή σε PDF
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Μετατροπή σε PDF
|
||||
#compress
|
||||
compress.title=Συμπίεση
|
||||
compress.header=Συμπίεση PDF
|
||||
compress.credit=Αυτή η υπηρεσία χρησιμοποιεί Ghostscript για PDF Συμπίεση/Βελτιστοποίηση.
|
||||
compress.credit=Αυτή η υπηρεσία χρησιμοποιεί qpdf για PDF Συμπίεση/Βελτιστοποίηση.
|
||||
compress.selectText.1=Χειροκίνητη Λειτουργία - Από 1 έως 4
|
||||
compress.selectText.2=Επίπεδο Βελτιστοποίησης:
|
||||
compress.selectText.3=4 (Πολύ κακό για εικόνες κειμένου)
|
||||
@@ -905,7 +914,7 @@ merge.title=Συγχώνευση
|
||||
merge.header=Συγχώνευση πολλαπλών PDFs (2+)
|
||||
merge.sortByName=Ταξινόμηση με βάση το Όνομα
|
||||
merge.sortByDate=Ταξινόμηση με βάση την Ημερομηνία
|
||||
merge.removeCertSign=Remove digital signature in the merged file?
|
||||
merge.removeCertSign=Επιλογή για τη μέριξη δικαιωμάτων σημείους σημάδους; Αφαίρεση ηλεκτρονικών πρόσβασης από το συγχέωνται αρχείο?
|
||||
merge.submit=Συγχώνευση
|
||||
|
||||
|
||||
@@ -913,24 +922,45 @@ merge.submit=Συγχώνευση
|
||||
pdfOrganiser.title=Διοργανωτής σελίδας
|
||||
pdfOrganiser.header=Διοργανωτής σελίδας PDF
|
||||
pdfOrganiser.submit=Αναδιάταξη σελίδων
|
||||
pdfOrganiser.mode=Mode
|
||||
pdfOrganiser.mode=Τύπος
|
||||
pdfOrganiser.mode.1=Προσαρμοσμένη Σειρά Σελίδας
|
||||
pdfOrganiser.mode.2=Αντίστροφη Σειρά
|
||||
pdfOrganiser.mode.3=Ταξινόμηση Διπλής Όψης (Duplex Sort)
|
||||
pdfOrganiser.mode.4=Ταξινόμηση Φυλλαδίου (Booklet Sort)
|
||||
pdfOrganiser.mode.5=Side Stitch Booklet Sort
|
||||
pdfOrganiser.mode.5=Πλάσμα Σεπτιμερή Λεφτοδυοκόσμου
|
||||
pdfOrganiser.mode.6=Διαίρεση Μονού-Ζυγού
|
||||
pdfOrganiser.mode.7=Αφαίρεση Πρώτου
|
||||
pdfOrganiser.mode.8=Αφαίρεση Τελευταίου
|
||||
pdfOrganiser.mode.9=Αφαίρεση Πρώτου και Τελευταίου
|
||||
pdfOrganiser.mode.10=Odd-Even Merge
|
||||
pdfOrganiser.mode.10=Περίπτωση Τυχαίου Μέριξης
|
||||
pdfOrganiser.placeholder=(π.χ. 1,3,2 ή 4-8,2,10-12 ή 2n-1)
|
||||
|
||||
|
||||
#multiTool
|
||||
multiTool.title=PDF Πολυεργαλείο
|
||||
multiTool.header=PDF Πολυεργαλείο
|
||||
multiTool.uploadPrompts=File Name
|
||||
multiTool.uploadPrompts=Όνομα αρχείου
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=Προβολή PDF
|
||||
@@ -992,7 +1022,7 @@ pdfToImage.color=Χρώμα
|
||||
pdfToImage.grey=Κλίμακα του γκρι
|
||||
pdfToImage.blackwhite=Ασπρόμαυρο (Μπορεί να χαθούν δεδομένα!)
|
||||
pdfToImage.submit=Μετατροπή
|
||||
pdfToImage.info=Python is not installed. Required for WebP conversion.
|
||||
pdfToImage.info=Δεν είναι ιστάμενος Python. Είναι απαιτήτων για τη μετατροπή σε WebP.
|
||||
|
||||
|
||||
#addPassword
|
||||
@@ -1029,7 +1059,7 @@ watermark.selectText.6=heightSpacer (Κενό μεταξύ κάθε υδατογ
|
||||
watermark.selectText.7=Αδιαφάνεια (Opacity) (0% - 100%):
|
||||
watermark.selectText.8=Τύπος Υδατογραφήματος:
|
||||
watermark.selectText.9=Εικόνα Υδατογραφήματος:
|
||||
watermark.selectText.10=Convert PDF to PDF-Image
|
||||
watermark.selectText.10=Μετατροπή PDF σε PDF-Image
|
||||
watermark.submit=Προσθήκη Υδατογραφήματος
|
||||
watermark.type.1=Κείμενο
|
||||
watermark.type.2=Εικόνα
|
||||
@@ -1073,7 +1103,7 @@ changeMetadata.keywords=Λέξεις-κλειδιά:
|
||||
changeMetadata.modDate=Ημερομηνία Τροποποίησης (yyyy/MM/dd HH:mm:ss):
|
||||
changeMetadata.producer=Παραγωγός:
|
||||
changeMetadata.subject=Θέμα:
|
||||
changeMetadata.trapped=Trapped:
|
||||
changeMetadata.trapped=Τυχόν Περίκλειση:
|
||||
changeMetadata.selectText.4=Άλλα μεταδεδομένα:
|
||||
changeMetadata.selectText.5=Προσθήκη εγγραφής προσαρμοσμένων μεταδεδομένων
|
||||
changeMetadata.submit=Αλλαγή
|
||||
@@ -1082,11 +1112,11 @@ changeMetadata.submit=Αλλαγή
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF σε PDF/A
|
||||
pdfToPDFA.header=PDF σε PDF/A
|
||||
pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί ghostscript για PDF/A μετατροπή
|
||||
pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί qpdf για PDF/A μετατροπή
|
||||
pdfToPDFA.submit=Μετατροπή
|
||||
pdfToPDFA.tip=Προς το παρόν δεν λειτουργεί για πολλαπλές εισόδους ταυτόχρονα
|
||||
pdfToPDFA.outputFormat=Output format
|
||||
pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step.
|
||||
pdfToPDFA.outputFormat=Εξόδος αναμορφώσεων
|
||||
pdfToPDFA.pdfWithDigitalSignature=Το PDF περιέχει ηλεκτρονική ψηφιακή υπογραφή. Αυτό θα αφαιρεθεί στο επόμενο βήμα.
|
||||
|
||||
|
||||
#PDFToWord
|
||||
@@ -1155,8 +1185,8 @@ overlay-pdfs.mode.fixedRepeat=Διορθώθηκε η Επικάλυψη Επα
|
||||
overlay-pdfs.counts.label=Μετρήσεις επικάλυψης (για σταθερή λειτουργία επανάληψης)
|
||||
overlay-pdfs.counts.placeholder=Εισαγάγετε μετρήσεις διαχωρισμένες με κόμματα (π.χ. 2,3,1)
|
||||
overlay-pdfs.position.label=Επιλέξτε Θέση Επικάλυψης
|
||||
overlay-pdfs.position.foreground=Foreground
|
||||
overlay-pdfs.position.background=Background
|
||||
overlay-pdfs.position.foreground=Προσκήνιο
|
||||
overlay-pdfs.position.background=фондо
|
||||
overlay-pdfs.submit=Υποβολή
|
||||
|
||||
|
||||
@@ -1172,31 +1202,31 @@ split-by-sections.merge=Συγχώνευση σε ένα PDF
|
||||
|
||||
|
||||
#printFile
|
||||
printFile.title=Print File
|
||||
printFile.header=Print File to Printer
|
||||
printFile.selectText.1=Select File to Print
|
||||
printFile.selectText.2=Enter Printer Name
|
||||
printFile.submit=Print
|
||||
printFile.title=Εκτύπωση Αρχείου
|
||||
printFile.header=Εκτύπωση Αρχείου σε Εκτυπωτή
|
||||
printFile.selectText.1=Επιλογή Αρχείου για Εκτύπωση
|
||||
printFile.selectText.2=Εισάγετε το όνομα του εκτυπωτή
|
||||
printFile.submit=Εκτύπωση
|
||||
|
||||
|
||||
#licenses
|
||||
licenses.nav=Άδειες
|
||||
licenses.title=3rd Party Άδειες
|
||||
licenses.header=3rd Party Άδειες
|
||||
licenses.module=Module
|
||||
licenses.module=Μόδουλο
|
||||
licenses.version=Εκδοχή
|
||||
licenses.license=Άδεια
|
||||
|
||||
#survey
|
||||
survey.nav=Survey
|
||||
survey.title=Stirling-PDF Survey
|
||||
survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF!
|
||||
survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here:
|
||||
survey.changes2=With these changes we are getting paid business support and funding
|
||||
survey.nav=Έρευνα
|
||||
survey.title=Περιεχόμενο Έρευνας Stirling-PDF
|
||||
survey.description=Η Stirling-PDF δεν επηρεάζεται από τη μετακίνηση. Ελπίζουμε πως θα συμμεριζόμαστε για να βελτιώσουμε τη Stirling-PDF!
|
||||
survey.changes=Αφού κάποιες αλλαγές στην Stirling-PDF, θα πρόκειται να εξετάσουμε με τρόπου πιο συγκεκριμένο αυτά. Αναχαίτιζε την ελέγχωσή τους!
|
||||
survey.changes2=Με αυτές τις αλλαγές, συμπεριλαμβάνονται και οι δομοφόνια χρηματοδότησης και εκπομπής
|
||||
survey.please=Please consider taking our survey!
|
||||
survey.disabled=(Survey popup will be disabled in following updates but available at foot of page)
|
||||
survey.button=Take Survey
|
||||
survey.dontShowAgain=Don't show again
|
||||
survey.disabled=(Το παράθυρο ερεύνησης θα απενεργοποιηθεί σε μελλοντικές ενημερώσεις, αλλά θα παρουσιάζεται στο τέλος της διαδικασίας)
|
||||
survey.button=Παίρνω μερίδα στην ερεύνα
|
||||
survey.dontShowAgain=Δεν απεικονίζεται ξανά
|
||||
|
||||
|
||||
#error
|
||||
@@ -1214,19 +1244,19 @@ error.discordSubmit=Discord - Υποβάλετε ένα Support post
|
||||
|
||||
|
||||
#remove-image
|
||||
removeImage.title=Remove image
|
||||
removeImage.header=Remove image
|
||||
removeImage.removeImage=Remove image
|
||||
removeImage.submit=Remove image
|
||||
removeImage.title=Αφαίρεση εικόνας
|
||||
removeImage.header=Αφαίρεση εικόνας
|
||||
removeImage.removeImage=Αφαίρεση εικόνας
|
||||
removeImage.submit=Αποθέτει την εικόνα
|
||||
|
||||
|
||||
splitByChapters.title=Split PDF by Chapters
|
||||
splitByChapters.header=Split PDF by Chapters
|
||||
splitByChapters.bookmarkLevel=Bookmark Level
|
||||
splitByChapters.includeMetadata=Include Metadata
|
||||
splitByChapters.allowDuplicates=Allow Duplicates
|
||||
splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure.
|
||||
splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.).
|
||||
splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF.
|
||||
splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs.
|
||||
splitByChapters.submit=Split PDF
|
||||
splitByChapters.title=Χωρίστε το PDF με βάση τα κεφάλαια
|
||||
splitByChapters.header=Χωρίστε το PDF με βάση τα κεφάλαια
|
||||
splitByChapters.bookmarkLevel=Επίπεδο Σήμανσης Σκέψης
|
||||
splitByChapters.includeMetadata=Πρόσθεση Metadata
|
||||
splitByChapters.allowDuplicates=Διάλυση Παρόντων Τίτλων Επιπέδου
|
||||
splitByChapters.desc.1=Αυτή η εργαλείο χωρίζει το PDF αρχείο σε πολλά PDF βάση της καθορισμένης δομής του κεφαλαιώδους.
|
||||
splitByChapters.desc.2=Επίπεδο Σήμανσης Σκέψης: Επιλέξτε το επίπεδο σήμανσης σκέψης που να χρησιμοποιηθεί για τη διάλυση (0 για το κύριο επίπεδο, 1 για το δεύτερο επίπεδο κλπ.).
|
||||
splitByChapters.desc.3=Πρόσθεση Metadata: Αν επεξεργαστείται, οι αρχικές metadata του PDF θα προστεθούν σε κάθε διαλυμένο PDF.
|
||||
splitByChapters.desc.4=Διάλυση Παρόντων Τίτλων Επιπέδου: Αν επεξεργαστείται, επιτρέπει τη δημιουργία αποκοπών PDF με βάση πλήρως καθορισμένους σήμαντες έδρας.
|
||||
splitByChapters.submit=Διαλύστε το PDF
|
||||
|
||||
@@ -81,6 +81,7 @@ page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Privacy Policy
|
||||
legal.terms=Terms and Conditions
|
||||
@@ -141,6 +142,7 @@ navbar.language=Languages
|
||||
navbar.settings=Settings
|
||||
navbar.allTools=Tools
|
||||
navbar.multiTool=Multi Tool
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Organize
|
||||
navbar.sections.convertTo=Convert to PDF
|
||||
navbar.sections.convertFrom=Convert from PDF
|
||||
@@ -246,6 +248,7 @@ database.fileNullOrEmpty=File must not be null or empty
|
||||
database.failedImportFile=Failed to import file
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=Show Signature
|
||||
certSign.reason=Reason
|
||||
certSign.location=Location
|
||||
certSign.name=Name
|
||||
certSign.showLogo=Show Logo
|
||||
certSign.submit=Sign PDF
|
||||
|
||||
|
||||
@@ -814,7 +818,12 @@ sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Repair
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=OCR Mode
|
||||
ocr.selectText.11=Remove images after OCR (Removes ALL images, only useful if part of conversion step)
|
||||
ocr.selectText.12=Render Type (Advanced)
|
||||
ocr.help=Please read this documentation on how to use this for other languages and/or use not in docker
|
||||
ocr.credit=This service uses OCRmyPDF and Tesseract for OCR.
|
||||
ocr.credit=This service uses qpdf and Tesseract for OCR.
|
||||
ocr.submit=Process PDF with OCR
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Convert to PDF
|
||||
#compress
|
||||
compress.title=Compress
|
||||
compress.header=Compress PDF
|
||||
compress.credit=This service uses Ghostscript for PDF Compress/Optimisation.
|
||||
compress.credit=This service uses qpdf for PDF Compress/Optimisation.
|
||||
compress.selectText.1=Manual Mode - From 1 to 4
|
||||
compress.selectText.2=Optimization level:
|
||||
compress.selectText.3=4 (Terrible for text images)
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||
multiTool.title=PDF Multi Tool
|
||||
multiTool.header=PDF Multi Tool
|
||||
multiTool.uploadPrompts=File Name
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=View PDF
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=Change
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF To PDF/A
|
||||
pdfToPDFA.header=PDF To PDF/A
|
||||
pdfToPDFA.credit=This service uses ghostscript for PDF/A conversion
|
||||
pdfToPDFA.credit=This service uses qpdf for PDF/A conversion
|
||||
pdfToPDFA.submit=Convert
|
||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
||||
pdfToPDFA.outputFormat=Output format
|
||||
@@ -1230,3 +1260,11 @@ splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for
|
||||
splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF.
|
||||
splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs.
|
||||
splitByChapters.submit=Split PDF
|
||||
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
releases.title=Release Notes
|
||||
releases.header=Release Notes
|
||||
releases.current.version=Current Release
|
||||
releases.note=Release notes are only available in English
|
||||
|
||||
@@ -81,6 +81,7 @@ page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Privacy Policy
|
||||
legal.terms=Terms and Conditions
|
||||
@@ -141,6 +142,7 @@ navbar.language=Languages
|
||||
navbar.settings=Settings
|
||||
navbar.allTools=Tools
|
||||
navbar.multiTool=Multi Tool
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Organize
|
||||
navbar.sections.convertTo=Convert to PDF
|
||||
navbar.sections.convertFrom=Convert from PDF
|
||||
@@ -246,6 +248,7 @@ database.fileNullOrEmpty=File must not be null or empty
|
||||
database.failedImportFile=Failed Import File
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=Show Signature
|
||||
certSign.reason=Reason
|
||||
certSign.location=Location
|
||||
certSign.name=Name
|
||||
certSign.showLogo=Show Logo
|
||||
certSign.submit=Sign PDF
|
||||
|
||||
|
||||
@@ -814,7 +818,12 @@ sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Repair
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=OCR Mode
|
||||
ocr.selectText.11=Remove images after OCR (Removes ALL images, only useful if part of conversion step)
|
||||
ocr.selectText.12=Render Type (Advanced)
|
||||
ocr.help=Please read this documentation on how to use this for other languages and/or use not in docker
|
||||
ocr.credit=This service uses OCRmyPDF and Tesseract for OCR.
|
||||
ocr.credit=This service uses qpdf and Tesseract for OCR.
|
||||
ocr.submit=Process PDF with OCR
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Convert to PDF
|
||||
#compress
|
||||
compress.title=Compress
|
||||
compress.header=Compress PDF
|
||||
compress.credit=This service uses Ghostscript for PDF Compress/Optimisation.
|
||||
compress.credit=This service uses qpdf for PDF Compress/Optimisation.
|
||||
compress.selectText.1=Manual Mode - From 1 to 4
|
||||
compress.selectText.2=Optimization level:
|
||||
compress.selectText.3=4 (Terrible for text images)
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||
multiTool.title=PDF Multi Tool
|
||||
multiTool.header=PDF Multi Tool
|
||||
multiTool.uploadPrompts=File Name
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=View PDF
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=Change
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF To PDF/A
|
||||
pdfToPDFA.header=PDF To PDF/A
|
||||
pdfToPDFA.credit=This service uses ghostscript for PDF/A conversion
|
||||
pdfToPDFA.credit=This service uses qpdf for PDF/A conversion
|
||||
pdfToPDFA.submit=Convert
|
||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
||||
pdfToPDFA.outputFormat=Output format
|
||||
|
||||
@@ -75,12 +75,13 @@ visitGithub=Visitar Repositorio de Github
|
||||
donate=Donar
|
||||
color=Color
|
||||
sponsor=Patrocinador
|
||||
info=Info
|
||||
info=Información
|
||||
pro=Pro
|
||||
page=Página
|
||||
pages=Páginas
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
loading=Cargando...
|
||||
addToDoc=Agregar al Documento
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Política de Privacidad
|
||||
legal.terms=Términos y Condiciones
|
||||
@@ -141,13 +142,14 @@ navbar.language=Idiomas
|
||||
navbar.settings=Configuración
|
||||
navbar.allTools=Herramientas
|
||||
navbar.multiTool=Multi herramientas
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Organizar
|
||||
navbar.sections.convertTo=Convertir a PDF
|
||||
navbar.sections.convertFrom=Convertir desde PDF
|
||||
navbar.sections.security=Señalización y seguridad
|
||||
navbar.sections.advance=Avanzado
|
||||
navbar.sections.edit=Ver y Editar
|
||||
navbar.sections.popular=Popular
|
||||
navbar.sections.popular=Populares
|
||||
|
||||
#############
|
||||
# SETTINGS #
|
||||
@@ -246,6 +248,7 @@ database.fileNullOrEmpty=El archivo no debe ser nulo o vacío.
|
||||
database.failedImportFile=Archivo de importación fallido
|
||||
|
||||
session.expired=Tu sesión ha caducado. Actualice la página e inténtelo de nuevo.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -545,7 +548,7 @@ login.locked=Su cuenta se ha bloqueado.
|
||||
login.signinTitle=Por favor, inicie sesión
|
||||
login.ssoSignIn=Iniciar sesión a través del inicio de sesión único
|
||||
login.oauth2AutoCreateDisabled=Usuario de creación automática de OAUTH2 DESACTIVADO
|
||||
login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator.
|
||||
login.oauth2AdminBlockedUser=El registro o inicio de sesión de usuarios no registrados está actualmente bloqueado. Por favor, contáctese con el administrador.
|
||||
login.oauth2RequestNotFound=Solicitud de autorización no encontrada
|
||||
login.oauth2InvalidUserInfoResponse=Respuesta de información de usuario no válida
|
||||
login.oauth2invalidRequest=Solicitud no válida
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=Mostrar firma
|
||||
certSign.reason=Razón
|
||||
certSign.location=Ubicación
|
||||
certSign.name=Nombre
|
||||
certSign.showLogo=Mostrar Logotipo
|
||||
certSign.submit=Firmar PDF
|
||||
|
||||
|
||||
@@ -784,9 +788,9 @@ compare.highlightColor.2=Color resaltado 2:
|
||||
compare.document.1=Documento 1
|
||||
compare.document.2=Documento 2
|
||||
compare.submit=Comparar
|
||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
||||
compare.complex.message=Uno o ambos de los documentos proporcionados son archivos grandes; la precisión de la comparación puede disminuir.
|
||||
compare.large.file.message=Uno o ambos de los documentos proporcionados son demasiado grandes para procesarse.
|
||||
compare.no.text.message=Uno o ambos de los PDF seleccionados no contienen contenido de texto. Por favor, elija PDFs con texto para la comparación.
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Libros y Cómics a PDF
|
||||
@@ -809,12 +813,17 @@ sign.draw=Dibujar firma
|
||||
sign.text=Entrada de texto
|
||||
sign.clear=Borrar
|
||||
sign.add=Agregar
|
||||
sign.saved=Saved Signatures
|
||||
sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.saved=firmas guardadas
|
||||
sign.save=Guardar Firma
|
||||
sign.personalSigs=Firmas Personales
|
||||
sign.sharedSigs=Firmas compartidas
|
||||
sign.noSavedSigs=No se encontraron firmas guardadas
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Reparar
|
||||
@@ -859,7 +868,7 @@ 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.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.credit=Este servicio utiliza OCRmyPDF y Tesseract para OCR
|
||||
ocr.credit=Este servicio utiliza qpdf y Tesseract para OCR
|
||||
ocr.submit=Procesar PDF con OCR
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Convertir a PDF
|
||||
#compress
|
||||
compress.title=Comprimir
|
||||
compress.header=Comprimir PDF
|
||||
compress.credit=Este servicio utiliza Ghostscript para compresión/optimización de PDF
|
||||
compress.credit=Este servicio utiliza qpdf para compresión/optimización de PDF
|
||||
compress.selectText.1=Modo manual - De 1 a 4
|
||||
compress.selectText.2=Nivel de optimización:
|
||||
compress.selectText.3=4 (Terrible para imágenes de texto)
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(por ej., 1,3,2 o 4-8,2,10-12 o 2n-1)
|
||||
multiTool.title=Multi-herramienta PDF
|
||||
multiTool.header=Multi-herramienta PDF
|
||||
multiTool.uploadPrompts=Nombre del archivo
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=Ver PDF
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=Cambiar
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF a PDF/A
|
||||
pdfToPDFA.header=PDF a PDF/A
|
||||
pdfToPDFA.credit=Este servicio usa ghostscript para la conversión a PDF/A
|
||||
pdfToPDFA.credit=Este servicio usa qpdf para la conversión a PDF/A
|
||||
pdfToPDFA.submit=Convertir
|
||||
pdfToPDFA.tip=Actualmente no funciona para múltiples entrada a la vez
|
||||
pdfToPDFA.outputFormat=Formato de salida
|
||||
@@ -1133,7 +1163,7 @@ PDFToCSV.prompt=Elija una página para extraer la tabla
|
||||
PDFToCSV.submit=Extraer
|
||||
|
||||
#split-by-size-or-count
|
||||
split-by-size-or-count.title=Split PDF by Size or Count
|
||||
split-by-size-or-count.title=Dividir PDF por tamaño o cantidad
|
||||
split-by-size-or-count.header=Dividir PDF por tamaño o número
|
||||
split-by-size-or-count.type.label=Seleccionar tipo de división
|
||||
split-by-size-or-count.type.size=Por tamaño
|
||||
@@ -1191,8 +1221,8 @@ licenses.license=Licencia
|
||||
survey.nav=Encuesta
|
||||
survey.title=Encuesta Stirling-PDF
|
||||
survey.description=Stirling-PDF no tiene seguimiento, por lo que queremos escuchar a nuestros usuarios para mejorar Stirling-PDF.
|
||||
survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here:
|
||||
survey.changes2=With these changes we are getting paid business support and funding
|
||||
survey.changes=Stirling-PDF ha cambiado desde la última encuesta! Para obtener más información, revise nuestro artículo de blog aquí:
|
||||
survey.changes2=Con estos cambios estamos obteniendo apoyo y financiamiento empresarial
|
||||
survey.please=¡Considere realizar nuestra encuesta!
|
||||
survey.disabled=(La ventana emergente de la encuesta se desactivará en las siguientes actualizaciones, pero estará disponible al pie de la página.)
|
||||
survey.button=Realizar encuesta
|
||||
|
||||
@@ -81,6 +81,7 @@ page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Privacy Policy
|
||||
legal.terms=Terms and Conditions
|
||||
@@ -141,6 +142,7 @@ navbar.language=Languages
|
||||
navbar.settings=Ezarpenak
|
||||
navbar.allTools=Tools
|
||||
navbar.multiTool=Multi Tools
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Organize
|
||||
navbar.sections.convertTo=Convert to PDF
|
||||
navbar.sections.convertFrom=Convert from PDF
|
||||
@@ -246,6 +248,7 @@ database.fileNullOrEmpty=File must not be null or empty
|
||||
database.failedImportFile=Failed Import File
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=Erakutsi sinadura
|
||||
certSign.reason=Arrazoia
|
||||
certSign.location=Kokalekua
|
||||
certSign.name=Izena
|
||||
certSign.showLogo=Show Logo
|
||||
certSign.submit=Sinatu PDFa
|
||||
|
||||
|
||||
@@ -814,7 +818,12 @@ sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Konpondu
|
||||
@@ -859,7 +868,7 @@ 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.credit=Zerbitzu honek qpdf eta OCR-rako Tesseract erabiltzen ditu
|
||||
ocr.submit=PDF prozesatu OCR-rekin
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=PDF bihurtu
|
||||
#compress
|
||||
compress.title=Konprimatu
|
||||
compress.header=PDFa konprimatu
|
||||
compress.credit=Zerbitzu honek Ghostscript erabiltzen du PDFak komprimatzeko/optimizatzeko
|
||||
compress.credit=Zerbitzu honek qpdf erabiltzen du PDFak komprimatzeko/optimizatzeko
|
||||
compress.selectText.1=Eskuz 1etik 4ra
|
||||
compress.selectText.2=Optimizazio maila:
|
||||
compress.selectText.3=4 (Izugarria testu-irudietarako)
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||
multiTool.title=PDF erabilera anitzeko tresna
|
||||
multiTool.header=PDF erabilera anitzeko tresna
|
||||
multiTool.uploadPrompts=File Name
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=View PDF
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=Aldatu
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDFa PDF/A bihurtu
|
||||
pdfToPDFA.header=PDFa PDF/A bihurtu
|
||||
pdfToPDFA.credit=Zerbitzu honek ghostscript erabiltzen du PDFak PDF/A bihurtzeko
|
||||
pdfToPDFA.credit=Zerbitzu honek qpdf erabiltzen du PDFak PDF/A bihurtzeko
|
||||
pdfToPDFA.submit=Bihurtu
|
||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
||||
pdfToPDFA.outputFormat=Output format
|
||||
|
||||
@@ -56,12 +56,12 @@ userNotFoundMessage=Utilisateur non trouvé.
|
||||
incorrectPasswordMessage=Le mot de passe actuel est incorrect.
|
||||
usernameExistsMessage=Le nouveau nom d'utilisateur existe déjà.
|
||||
invalidUsernameMessage=Nom d'utilisateur invalide, le nom d'utilisateur ne peut contenir que des lettres, des chiffres et les caractères spéciaux suivants @._+- ou doit être une adresse e-mail valide.
|
||||
invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end.
|
||||
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||
invalidPasswordMessage=Le mot de passe ne peut pas être vide et ne doit pas contenir d'espaces au début ou à la fin.
|
||||
confirmPasswordErrorMessage=Le nouveau mot de passe et sa confirmation doivent être identiques.
|
||||
deleteCurrentUserMessage=Impossible de supprimer l'utilisateur actuellement connecté.
|
||||
deleteUsernameExistsMessage=Le nom d'utilisateur n'existe pas et ne peut pas être supprimé.
|
||||
downgradeCurrentUserMessage=Impossible de rétrograder le rôle de l'utilisateur actuel.
|
||||
disabledCurrentUserMessage=The current user cannot be disabled
|
||||
disabledCurrentUserMessage=L'utilisateur actuel ne peut pas être désactivé
|
||||
downgradeCurrentUserLongMessage=Impossible de rétrograder le rôle de l'utilisateur actuel. Par conséquent, l'utilisateur actuel ne sera pas affiché.
|
||||
userAlreadyExistsOAuthMessage=L'utilisateur existe déjà en tant qu'utilisateur OAuth2.
|
||||
userAlreadyExistsWebMessage=L'utilisateur existe déjà en tant qu'utilisateur Web.
|
||||
@@ -74,13 +74,14 @@ seeDockerHub=Consulter le Docker Hub
|
||||
visitGithub=Visiter le dépôt Github
|
||||
donate=Faire un don
|
||||
color=Couleur
|
||||
sponsor=Sponsor
|
||||
info=Info
|
||||
sponsor=Sponsoriser
|
||||
info=Informations
|
||||
pro=Pro
|
||||
page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
loading=Chargement...
|
||||
addToDoc=Ajouter au Document
|
||||
reset=Réinitialiser
|
||||
|
||||
legal.privacy=Politique de Confidentialité
|
||||
legal.terms=Conditions Générales
|
||||
@@ -98,7 +99,7 @@ pipeline.defaultOption=Personnaliser
|
||||
pipeline.submitButton=Soumettre
|
||||
pipeline.help=Aide Pipeline
|
||||
pipeline.scanHelp=Aide analyse de dossier
|
||||
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||
pipeline.deletePrompt=Êtes-vous sûr de vouloir supprimer le pipeline ?
|
||||
|
||||
######################
|
||||
# Pipeline Options #
|
||||
@@ -109,7 +110,7 @@ pipelineOptions.saveSettings=Sauvegarder la configuration
|
||||
pipelineOptions.pipelineNamePrompt=Entrez ici le nom du pipeline
|
||||
pipelineOptions.selectOperation=Sélectionner une opération
|
||||
pipelineOptions.addOperationButton=Ajouter une opération
|
||||
pipelineOptions.pipelineHeader=Pipeline:
|
||||
pipelineOptions.pipelineHeader=Pipeline :
|
||||
pipelineOptions.saveButton=Télécharger
|
||||
pipelineOptions.validateButton=Valider
|
||||
|
||||
@@ -141,6 +142,7 @@ navbar.language=Langues
|
||||
navbar.settings=Paramètres
|
||||
navbar.allTools=Outils
|
||||
navbar.multiTool=Outils Multiples
|
||||
navbar.search=Rechercher
|
||||
navbar.sections.organize=Organisation
|
||||
navbar.sections.convertTo=Convertir en PDF
|
||||
navbar.sections.convertFrom=Convertir depuis PDF
|
||||
@@ -229,23 +231,24 @@ adminUserSettings.totalUsers=Utilisateurs au total :
|
||||
adminUserSettings.lastRequest=Dernière requête
|
||||
|
||||
|
||||
database.title=Database Import/Export
|
||||
database.header=Database Import/Export
|
||||
database.fileName=File Name
|
||||
database.creationDate=Creation Date
|
||||
database.fileSize=File Size
|
||||
database.deleteBackupFile=Delete Backup File
|
||||
database.importBackupFile=Import Backup File
|
||||
database.downloadBackupFile=Download Backup File
|
||||
database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application.
|
||||
database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention.
|
||||
database.submit=Import Backup
|
||||
database.importIntoDatabaseSuccessed=Import into database successed
|
||||
database.title=Import/Export de la Base de Données
|
||||
database.header=Import/Export de la Base de Données
|
||||
database.fileName=Nom du Fichier
|
||||
database.creationDate=Date de Création
|
||||
database.fileSize=Taille du Fichier
|
||||
database.deleteBackupFile=Supprimer le fichier de sauvegarde
|
||||
database.importBackupFile=Importer le fichier de sauvegarde
|
||||
database.downloadBackupFile=Télécharger le fichier de sauvegarde
|
||||
database.info_1=Lors de l'importation des données, il est crucial de garantir la structure correcte. Si vous n'êtes pas sûr de ce que vous faites, sollicitez un avis et un soutien d'un professionnel. Une erreur dans la structure peut entraîner des dysfonctionnements de l'application, allant jusqu'à l'incapacité totale d'exécuter l'application.
|
||||
database.info_2=Le nom du fichier ne fait pas de différence lors de l'upload. Il sera renommé ultérieurement selon le format backup_user_yyyyMMddHHmm.sql, assurant ainsi une convention de nommage cohérente.
|
||||
database.submit=Importer la sauvegarde
|
||||
database.importIntoDatabaseSuccessed=Importation dans la base de données réussie
|
||||
database.fileNotFound=File not Found
|
||||
database.fileNullOrEmpty=File must not be null or empty
|
||||
database.fileNullOrEmpty=Fichier ne peut pas être null ou vide
|
||||
database.failedImportFile=Failed Import File
|
||||
|
||||
session.expired=Votre session a expiré. Veuillez recharger la page et réessayer.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -341,7 +344,7 @@ pdfToPDFA.tags=convertion,archive,long-term,standard,conversion,storage,préserv
|
||||
|
||||
home.PDFToWord.title=PDF en Word
|
||||
home.PDFToWord.desc=Convertissez un PDF en Word (DOC, DOCX et ODT).
|
||||
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
|
||||
PDFToWord.tags=doc, docx, odt, word, transformation, format, conversion, office, microsoft, docfile
|
||||
|
||||
home.PDFToPresentation.title=PDF en formats de présentation
|
||||
home.PDFToPresentation.desc=Convertissez un PDF en format de présentation (PPT, PPTX et ODP).
|
||||
@@ -349,7 +352,7 @@ PDFToPresentation.tags=présentation,slides,show,office,microsoft
|
||||
|
||||
home.PDFToText.title=PDF en RTF (texte)
|
||||
home.PDFToText.desc=Convertissez un PDF au format RTF (texte).
|
||||
PDFToText.tags=richformat,richtextformat,rich text format
|
||||
PDFToText.tags=format riche, format de texte riche, format de texte enrichi
|
||||
|
||||
home.PDFToHTML.title=PDF en HTML
|
||||
home.PDFToHTML.desc=Convertissez un PDF au format HTML.
|
||||
@@ -471,12 +474,12 @@ autoRedact.tags=caviarder,redact,auto
|
||||
|
||||
home.tableExtraxt.title=PDF en CSV
|
||||
home.tableExtraxt.desc=Extrait les tableaux d'un PDF et les transforme en CSV.
|
||||
tableExtraxt.tags=CSV,Table Extraction,extract,convert
|
||||
tableExtraxt.tags=CSV, Extraction de table, extraction, conversion
|
||||
|
||||
|
||||
home.autoSizeSplitPDF.title=Séparer automatiquement par taille/nombre
|
||||
home.autoSizeSplitPDF.desc=Séparer un PDF unique en plusieurs documents en fonction de la taille, du nombre de pages ou du nombre de documents.
|
||||
autoSizeSplitPDF.tags=pdf,split,document,organization
|
||||
autoSizeSplitPDF.tags=pdf, découpage, document, organisation
|
||||
|
||||
|
||||
home.overlay-pdfs.title=Incrustation de PDF
|
||||
@@ -545,7 +548,7 @@ login.locked=Votre compte a été verrouillé.
|
||||
login.signinTitle=Veuillez vous connecter
|
||||
login.ssoSignIn=Se connecter via l'authentification unique
|
||||
login.oauth2AutoCreateDisabled=OAUTH2 Création automatique d'utilisateur désactivée
|
||||
login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator.
|
||||
login.oauth2AdminBlockedUser=La création ou l'authentification d'utilisateurs non enregistrés est actuellement bloquée. Veuillez contacter l'administrateur.
|
||||
login.oauth2RequestNotFound=Demande d'autorisation introuvable
|
||||
login.oauth2InvalidUserInfoResponse=Réponse contenant les informations de l'utilisateur est invalide
|
||||
login.oauth2invalidRequest=Requête invalide
|
||||
@@ -587,7 +590,7 @@ pdfToSinglePage.submit=Convertir en une seule page
|
||||
pageExtracter.title=Extraire des pages
|
||||
pageExtracter.header=Extraire des pages
|
||||
pageExtracter.submit=Extraire
|
||||
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
|
||||
pageExtracter.placeholder=(par exemple : 1,2,8 ou 4,7,12-16 ou 2n-1)
|
||||
|
||||
|
||||
#getPdfInfo
|
||||
@@ -730,7 +733,7 @@ pageLayout.submit=Fusionner
|
||||
scalePages.title=Ajuster la taille ou l'échelle
|
||||
scalePages.header=Ajuster la taille ou l'échelle
|
||||
scalePages.pageSize=Taille d'une page du document
|
||||
scalePages.keepPageSize=Original Size
|
||||
scalePages.keepPageSize=Taille d'origine
|
||||
scalePages.scaleFactor=Niveau de zoom (recadrage) d'une page
|
||||
scalePages.submit=Ajuster
|
||||
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=Afficher la signature
|
||||
certSign.reason=Raison
|
||||
certSign.location=Emplacement
|
||||
certSign.name=Nom
|
||||
certSign.showLogo=Afficher le logo
|
||||
certSign.submit=Signer
|
||||
|
||||
|
||||
@@ -779,14 +783,14 @@ removeAnnotations.submit=Supprimer
|
||||
#compare
|
||||
compare.title=Comparer
|
||||
compare.header=Comparer
|
||||
compare.highlightColor.1=Highlight Color 1:
|
||||
compare.highlightColor.2=Highlight Color 2:
|
||||
compare.highlightColor.1=Couleur de mise en évidence 1 :
|
||||
compare.highlightColor.2=Couleur de mise en évidence 2 :
|
||||
compare.document.1=Document 1
|
||||
compare.document.2=Document 2
|
||||
compare.submit=Comparer
|
||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
||||
compare.complex.message=Un ou les deux documents fournis sont des fichiers volumineux, l'exactitude de la comparaison peut être réduite
|
||||
compare.large.file.message=Un ou les deux documents fournis sont trop volumineux pour être traités
|
||||
compare.no.text.message=L'un ou les deux documents PDF sélectionnés ne contiennent aucun contenu textuel. Veuillez choisir des documents PDF avec du texte pour la comparaison.
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Livres et BD vers PDF
|
||||
@@ -809,12 +813,17 @@ sign.draw=Dessiner une signature
|
||||
sign.text=Saisir de texte
|
||||
sign.clear=Effacer
|
||||
sign.add=Ajouter
|
||||
sign.saved=Saved Signatures
|
||||
sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.saved=Sceaux enregistrées
|
||||
sign.save=Enregistrer le sceau
|
||||
sign.personalSigs=Sceaux personnels
|
||||
sign.sharedSigs=Sceaux partagés
|
||||
sign.noSavedSigs=Aucun sceau enregistré trouvé
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Réparer
|
||||
@@ -840,7 +849,7 @@ ScannerImageSplit.selectText.7=Surface de contour minimale
|
||||
ScannerImageSplit.selectText.8=Définit la surface de contour minimale pour une photo (par défaut : 500).
|
||||
ScannerImageSplit.selectText.9=Taille de la bordure
|
||||
ScannerImageSplit.selectText.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.info=Python is not installed. It is required to run.
|
||||
ScannerImageSplit.info=Python n'est pas installé. Il est nécessaire pour le fonctionnement.
|
||||
|
||||
|
||||
#OCR
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=Mode OCR
|
||||
ocr.selectText.11=Supprimer les images après l'OCR (Supprime TOUTES les images, utile uniquement si elles font partie de l'étape de conversion)
|
||||
ocr.selectText.12=Type de rendu (avancé)
|
||||
ocr.help=Veuillez lire cette documentation pour savoir comment utiliser l'OCR pour d'autres langues ou une utilisation hors Docker :
|
||||
ocr.credit=Ce service utilise OCRmyPDF et Tesseract pour l'OCR.
|
||||
ocr.credit=Ce service utilise qpdf et Tesseract pour l'OCR.
|
||||
ocr.submit=Traiter
|
||||
|
||||
|
||||
@@ -867,7 +876,7 @@ ocr.submit=Traiter
|
||||
extractImages.title=Extraire les images
|
||||
extractImages.header=Extraire les images
|
||||
extractImages.selectText=Format d'image dans lequel convertir les images extraites
|
||||
extractImages.allowDuplicates=Save duplicate images
|
||||
extractImages.allowDuplicates=Enregistrer les images dupliquées
|
||||
extractImages.submit=Extraire
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Convertir
|
||||
#compress
|
||||
compress.title=Compresser un PDF
|
||||
compress.header=Compresser un PDF (lorsque c'est possible!)
|
||||
compress.credit=Ce service utilise Ghostscript pour la compression et l'optimisation des PDF.
|
||||
compress.credit=Ce service utilise qpdf pour la compression et l'optimisation des PDF.
|
||||
compress.selectText.1=Mode manuel – de 1 à 4
|
||||
compress.selectText.2=Niveau d'optimisation
|
||||
compress.selectText.3=4 (terrible pour les images textuelles)
|
||||
@@ -905,7 +914,7 @@ merge.title=Fusionner
|
||||
merge.header=Fusionner plusieurs PDF
|
||||
merge.sortByName=Trier par nom
|
||||
merge.sortByDate=Trier par date
|
||||
merge.removeCertSign=Remove digital signature in the merged file?
|
||||
merge.removeCertSign=Supprimer la signature numérique dans le fichier fusionné ?
|
||||
merge.submit=Fusionner
|
||||
|
||||
|
||||
@@ -923,14 +932,35 @@ pdfOrganiser.mode.6=Partage impair-pair
|
||||
pdfOrganiser.mode.7=Supprimer le premier
|
||||
pdfOrganiser.mode.8=Supprimer le dernier
|
||||
pdfOrganiser.mode.9=Supprimer le premier et le dernier
|
||||
pdfOrganiser.mode.10=Odd-Even Merge
|
||||
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||
pdfOrganiser.mode.10=Méger Impair-Pair
|
||||
pdfOrganiser.placeholder=(par exemple 1,3,2 ou 4-8,2,10-12 ou 2n-1)
|
||||
|
||||
|
||||
#multiTool
|
||||
multiTool.title=Outil multifonction PDF
|
||||
multiTool.header=Outil multifonction PDF
|
||||
multiTool.uploadPrompts=Nom du fichier
|
||||
multiTool.selectAll=Tout sélectionner
|
||||
multiTool.deselectAll=Tout déselectionner
|
||||
multiTool.selectPages=Sélection des pages
|
||||
multiTool.selectedPages=Pages sélectionnées
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Supprimer la sélection
|
||||
multiTool.downloadAll=Exporter
|
||||
multiTool.downloadSelected=Exporter la sélection
|
||||
|
||||
multiTool.insertPageBreak=Insérer un saut de page
|
||||
multiTool.addFile=Ajouter un fichier
|
||||
multiTool.rotateLeft=Rotation vers la gauche
|
||||
multiTool.rotateRight=Rotation vers la droite
|
||||
multiTool.split=Diviser
|
||||
multiTool.moveLeft=Déplacer vers la gauche
|
||||
multiTool.moveRight=Déplacer vers la droite
|
||||
multiTool.delete=Supprimer
|
||||
multiTool.dragDropMessage=Page(s) sélectionnées
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=Cette fonctionnalité est aussi disponible dans la <a href="{0}">page de l'outil multifonction</a>. Allez-y pour une interface page par page améliorée et des fonctionnalités additionnelles !
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=Visualiser un PDF
|
||||
@@ -941,7 +971,7 @@ pageRemover.title=Supprimer des pages
|
||||
pageRemover.header=Supprimer des pages
|
||||
pageRemover.pagesToDelete=Pages à supprimer (entrez une liste de numéros de pages séparés par des virgules) :
|
||||
pageRemover.submit=Supprimer les pages
|
||||
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
|
||||
pageRemover.placeholder=(par exemple 1,2,6 ou 1-10,15-30)
|
||||
|
||||
|
||||
#rotate
|
||||
@@ -992,7 +1022,7 @@ pdfToImage.color=Couleur
|
||||
pdfToImage.grey=Niveaux de gris
|
||||
pdfToImage.blackwhite=Noir et blanc (peut engendrer une perte de données !)
|
||||
pdfToImage.submit=Convertir
|
||||
pdfToImage.info=Python is not installed. Required for WebP conversion.
|
||||
pdfToImage.info=Python n’est pas installé. Nécessaire pour la conversion WebP.
|
||||
|
||||
|
||||
#addPassword
|
||||
@@ -1029,9 +1059,9 @@ watermark.selectText.6=heightSpacer (espace entre chaque filigrane verticalement
|
||||
watermark.selectText.7=Opacité (de 0% à 100%)
|
||||
watermark.selectText.8=Type de filigrane
|
||||
watermark.selectText.9=Image du filigrane
|
||||
watermark.selectText.10=Convert PDF to PDF-Image
|
||||
watermark.selectText.10=Convertir le PDF en PDF-Image
|
||||
watermark.submit=Ajouter un filigrane
|
||||
watermark.type.1=Text
|
||||
watermark.type.1=Texte
|
||||
watermark.type.2=Image
|
||||
|
||||
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=Modifier
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF en PDF/A
|
||||
pdfToPDFA.header=PDF en PDF/A
|
||||
pdfToPDFA.credit=Ce service utilise ghostscript pour la conversion en PDF/A.
|
||||
pdfToPDFA.credit=Ce service utilise qpdf pour la conversion en PDF/A.
|
||||
pdfToPDFA.submit=Convertir
|
||||
pdfToPDFA.tip=Ne fonctionne actuellement pas pour plusieurs entrées à la fois
|
||||
pdfToPDFA.outputFormat=Format de sortie
|
||||
|
||||
@@ -81,6 +81,7 @@ page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Privacy Policy
|
||||
legal.terms=Terms and Conditions
|
||||
@@ -141,6 +142,7 @@ navbar.language=Teangacha
|
||||
navbar.settings=Socruithe
|
||||
navbar.allTools=Uirlisí
|
||||
navbar.multiTool=Uirlisí Il
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Eagraigh
|
||||
navbar.sections.convertTo=Tiontaigh go PDF
|
||||
navbar.sections.convertFrom=Tiontaigh ó PDF
|
||||
@@ -246,6 +248,7 @@ database.fileNullOrEmpty=Níor cheart go mbeadh an comhad ar neamhní nó folamh
|
||||
database.failedImportFile=Theip ar iompórtáil an chomhaid
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=Taispeáin Síniú
|
||||
certSign.reason=Cúis
|
||||
certSign.location=Suíomh
|
||||
certSign.name=Ainm
|
||||
certSign.showLogo=Show Logo
|
||||
certSign.submit=Sínigh PDF
|
||||
|
||||
|
||||
@@ -814,7 +818,12 @@ sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Deisiúchán
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=Mód OCR
|
||||
ocr.selectText.11=Bain íomhánna tar éis OCR (Bain GACH íomhá, ní úsáideach ach amháin má tá siad mar chuid den chéim tiontaithe)
|
||||
ocr.selectText.12=Cineál Rindreála (Ardleibhéal)
|
||||
ocr.help=Léigh le do thoil an doiciméadú seo ar conas é seo a úsáid do theangacha eile agus/nó úsáid nach bhfuil i ndugairí
|
||||
ocr.credit=Úsáideann an tseirbhís seo OCRmyPDF agus Tesseract le haghaidh OCR.
|
||||
ocr.credit=Úsáideann an tseirbhís seo qpdf agus Tesseract le haghaidh OCR.
|
||||
ocr.submit=Próiseáil PDF le OCR
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Tiontaigh go PDF
|
||||
#compress
|
||||
compress.title=Comhbhrúigh
|
||||
compress.header=Comhbhrúigh PDF
|
||||
compress.credit=Úsáideann an tseirbhís seo Ghostscript le haghaidh Comhbhrú/Optimization PDF.
|
||||
compress.credit=Úsáideann an tseirbhís seo qpdf le haghaidh Comhbhrú/Optimization PDF.
|
||||
compress.selectText.1=Mód Láimhe - Ó 1 go 4
|
||||
compress.selectText.2=Leibhéal optamaithe:
|
||||
compress.selectText.3=4 (Uafásach le haghaidh íomhánna téacs)
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(m.sh. 1,3,2 nó 4-8,2,10-12 nó 2n-1)
|
||||
multiTool.title=Il-uirlis PDF
|
||||
multiTool.header=Il-uirlis PDF
|
||||
multiTool.uploadPrompts=Ainm comhaid
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=Féach PDF
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=Athrú
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF Go PDF/A
|
||||
pdfToPDFA.header=PDF Go PDF/A
|
||||
pdfToPDFA.credit=Úsáideann an tseirbhís seo ghostscript chun PDF/A a thiontú
|
||||
pdfToPDFA.credit=Úsáideann an tseirbhís seo qpdf chun PDF/A a thiontú
|
||||
pdfToPDFA.submit=Tiontaigh
|
||||
pdfToPDFA.tip=Faoi láthair ní oibríonn sé le haghaidh ionchuir iolracha ag an am céanna
|
||||
pdfToPDFA.outputFormat=Formáid aschuir
|
||||
|
||||
@@ -12,17 +12,17 @@ imgPrompt=छवियों का चयन करें
|
||||
genericSubmit=प्रस्तुत करें
|
||||
processTimeWarning=चेतावनी: यह प्रक्रिया फ़ाइल के आकार पर निर्भर करती है और यह से एक मिनट तक लग सकती है
|
||||
pageOrderPrompt=कस्टम पेज क्रम (पेज नंबरों या 2n+1 जैसे कार्यों की एक कॉमा से अलग-अलग सूची दर्ज करें):
|
||||
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
|
||||
pageSelectionPrompt=कस्तम पेज चयन (पेज संख्याओं 1,5,6 या फंक्शन 2n+1 को अलग-अलग बैरीज़ में लिखिए) :
|
||||
goToPage=जाएँ
|
||||
true=सही
|
||||
false=गलत
|
||||
unknown=अज्ञात
|
||||
save=सहेजें
|
||||
saveToBrowser=Save to Browser
|
||||
saveToBrowser=ब्राउझर में सहमत करें
|
||||
close=बंद करें
|
||||
filesSelected=फ़ाइलें चयनित हैं
|
||||
noFavourites=कोई पसंदीदा जोड़ा नहीं गया है
|
||||
downloadComplete=Download Complete
|
||||
downloadComplete=डाउनलोड पूरा हुआ
|
||||
bored=बोर हो रहे हैं?
|
||||
alphabet=वर्णमाला
|
||||
downloadPdf=पीडीएफ़ डाउनलोड करें
|
||||
@@ -46,91 +46,92 @@ red=लाल
|
||||
green=हरा
|
||||
blue=नीला
|
||||
custom=कस्टम...
|
||||
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
|
||||
poweredBy=Powered by
|
||||
yes=Yes
|
||||
no=No
|
||||
WorkInProgess=कार्य चल रहा है, ये लगभग कार्य कर सकते हैं या फ़ौल बिजी में हो सकते हैं, किसी समस्या का पता लगाने के लिए कृपया रिपोर्ट करें!
|
||||
poweredBy=बलिदान की स्वामित्व
|
||||
yes=हा
|
||||
no=नहीं
|
||||
changedCredsMessage=क्रेडेंशियल्स बदल दी गईं!
|
||||
notAuthenticatedMessage=उपयोगकर्ता प्रमाणित नहीं है।
|
||||
userNotFoundMessage=उपयोगकर्ता नहीं मिला।
|
||||
incorrectPasswordMessage=वर्तमान पासवर्ड गलत है।
|
||||
usernameExistsMessage=नया उपयोगकर्ता नाम पहले से मौजूद है।
|
||||
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||
invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end.
|
||||
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
invalidUsernameMessage=अवैध उपयोगकर्ता नाम, उपयोगकर्ता नाम केवल अक्षर, संख्या और इन प्रतिकरणों @._+- में ही शामिल हो सकते हैं या एक बिल्ड-आउट वैध ईमेल एड्रेस के रूप में होना चाहिए।
|
||||
invalidPasswordMessage=पासवर्ड खाली नहीं हो सकता है और इसमें शुरुआत या अंत में अज्ञात अंदाज के विच्छेदन नहीं हो सकते।
|
||||
confirmPasswordErrorMessage=नया पासवर्ड और पुष्टि नया पासवर्ड मेल खाते हैं।
|
||||
deleteCurrentUserMessage=प्रसिद्धिगत उपयोगकर्ता को नहीं हटा सकते हैं।
|
||||
deleteUsernameExistsMessage=उपयोगकर्ता नाम मौजूद नहीं है और नहीं हटा सकता है।
|
||||
downgradeCurrentUserMessage=मौजूदा यूज़र की भूमिका को डाउनग्रेड नहीं किया जा सकता
|
||||
disabledCurrentUserMessage=The current user cannot be disabled
|
||||
disabledCurrentUserMessage=वर्तमान उपयोगकर्ता निषेध किया गया है।
|
||||
downgradeCurrentUserLongMessage=मौजूदा यूज़र की भूमिका को डाउनग्रेड नहीं किया जा सकता। इसलिए, वर्तमान उपयोगकर्ता को नहीं दिखाया जाएगा।
|
||||
userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user.
|
||||
userAlreadyExistsWebMessage=The user already exists as an web user.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
info=Info
|
||||
pro=Pro
|
||||
userAlreadyExistsOAuthMessage=उपयोगकर्ता ऑटहॉराइजेशन 2 से वास्तविक में मौजूद है।
|
||||
userAlreadyExistsWebMessage=उपयोगकर्ता वेब से राजीव में मौजूद है।
|
||||
error=मुश्किल
|
||||
oops=ओह!
|
||||
help=सहायता
|
||||
goHomepage=主页前往
|
||||
joinDiscord=हमारे Discord सर्वर में शामिल होना
|
||||
seeDockerHub=Docker Hub पर देखें
|
||||
visitGithub=गिटहब को दृश्यकरण करें
|
||||
donate=दान करें
|
||||
color=रंग
|
||||
sponsor=पatreon से पोर्टन
|
||||
info=सूचना
|
||||
pro=कॉलेजीय
|
||||
page=पृष्ठ
|
||||
pages=पृष्ठों
|
||||
loading=Loading...
|
||||
loading=डालिंग...
|
||||
addToDoc=Add to Document
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Privacy Policy
|
||||
legal.terms=Terms and Conditions
|
||||
legal.accessibility=Accessibility
|
||||
legal.cookie=Cookie Policy
|
||||
legal.impressum=Impressum
|
||||
legal.privacy=गुप्तता सूचना
|
||||
legal.terms=शर्तें और प्रवाह
|
||||
legal.accessibility=कारणीबिलिटी
|
||||
legal.cookie=कुकीज़ नीति
|
||||
legal.impressum=प्रेरणा
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
###############
|
||||
pipeline.header=Pipeline Menu (Beta)
|
||||
pipeline.uploadButton=Upload Custom
|
||||
pipeline.configureButton=Configure
|
||||
pipeline.defaultOption=Custom
|
||||
pipeline.submitButton=Submit
|
||||
pipeline.help=Pipeline Help
|
||||
pipeline.scanHelp=Folder Scanning Help
|
||||
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||
pipeline.header=पाइपलाइन सूची (बेटा)
|
||||
pipeline.uploadButton=व्यक्तिगत अपलोड
|
||||
pipeline.configureButton=संरचना करें
|
||||
pipeline.defaultOption=कसरत की शुल्क
|
||||
pipeline.submitButton=प्रविष्टि
|
||||
pipeline.help=पाइपलाइन मदद
|
||||
pipeline.scanHelp=फोल्डर स्फॅं जस्त्र मदद
|
||||
pipeline.deletePrompt=कि आपकी है पाइपलाइन का हटाना करना चाहते हैं?
|
||||
|
||||
######################
|
||||
# Pipeline Options #
|
||||
######################
|
||||
pipelineOptions.header=Pipeline Configuration
|
||||
pipelineOptions.pipelineNameLabel=Pipeline Name
|
||||
pipelineOptions.saveSettings=Save Operation Settings
|
||||
pipelineOptions.pipelineNamePrompt=Enter pipeline name here
|
||||
pipelineOptions.selectOperation=Select Operation
|
||||
pipelineOptions.addOperationButton=Add operation
|
||||
pipelineOptions.pipelineHeader=Pipeline:
|
||||
pipelineOptions.saveButton=Download
|
||||
pipelineOptions.validateButton=Validate
|
||||
pipelineOptions.header=पाइपलाइन संरचना
|
||||
pipelineOptions.pipelineNameLabel=पाइपलाइन का नाम
|
||||
pipelineOptions.saveSettings=कार्यक्रम सेटिंग्स संरक्षण
|
||||
pipelineOptions.pipelineNamePrompt=यहाँ पाइपलाइन का नाम दर्ज करें
|
||||
pipelineOptions.selectOperation=कार्य चुनें
|
||||
pipelineOptions.addOperationButton=कार्य जोड़ें
|
||||
pipelineOptions.pipelineHeader=पाइपलाइन:
|
||||
pipelineOptions.saveButton=डाउनलोड
|
||||
pipelineOptions.validateButton=सुविधा परीक्षण
|
||||
|
||||
########################
|
||||
# ENTERPRISE EDITION #
|
||||
########################
|
||||
enterpriseEdition.button=Upgrade to Pro
|
||||
enterpriseEdition.warning=This feature is only available to Pro users.
|
||||
enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features.
|
||||
enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro
|
||||
enterpriseEdition.button=प्रो के लिए अदायगी में तहत तुलना करें
|
||||
enterpriseEdition.warning=यह संभावना केवल प्रो उपयोगकर्ताओं के लिए उपलब्ध है।
|
||||
enterpriseEdition.yamlAdvert=स्टीरिंग पीडीऍफ़ प्रो यॅमल संरचना फाइलें और अन्य SSO सुविधाओं का समर्थन करता है।
|
||||
enterpriseEdition.ssoAdvert=सामान्य प्रबंधन विशेषताएं खोजने के लिए स्टीरिंग पीडीऍफ़ प्रो का परीक्षण करें
|
||||
|
||||
|
||||
#################
|
||||
# Analytics #
|
||||
#################
|
||||
analytics.title=Do you want make Stirling PDF better?
|
||||
analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.
|
||||
analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.
|
||||
analytics.enable=Enable analytics
|
||||
analytics.disable=Disable analytics
|
||||
analytics.settings=You can change the settings for analytics in the config/settings.yml file
|
||||
analytics.title=स्टीरिंग पीडीऍफ़ को बेहतर करने में मदद करना चाहते हैं?
|
||||
analytics.paragraph1=स्टीरिंग पीडीऍफ़ मध्यम सुनिश्चित है जो हमें उपलब्ध कराता है और उत्पाद को बेहतर करने में मदद करता है। हम किसी प्रकार का व्यक्तिगत जानकारी या फ़ाइल सामग्रियों का ट्रॅक नहीं करते हैं।
|
||||
analytics.paragraph2=मांगित गर्न मा, कैनलीस-पडफको सुधार बढाउने मदत गर्न माफि गर्ने प्रयोगकर्ताको समजलाई समज्दा परिवर्तनले मदत गर्न सकिँदू।
|
||||
analytics.enable=कैनलीस खुलाउँछु
|
||||
analytics.disable=कैनलीस बुझाउँछु
|
||||
analytics.settings=परिष्कार संपर्कमा कैनलीस सेटिङहरू परिवर्तन गर्न सकिँदू
|
||||
|
||||
#############
|
||||
# NAVBAR #
|
||||
@@ -141,13 +142,14 @@ navbar.language=भाषा
|
||||
navbar.settings=सेटिंग्स
|
||||
navbar.allTools=साधन
|
||||
navbar.multiTool=विभिन्न साधन
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=संगठित करें
|
||||
navbar.sections.convertTo=पीडीएफ में कनवर्ट करें
|
||||
navbar.sections.convertFrom=पीडीएफ से कनवर्ट करें
|
||||
navbar.sections.security=संकेत और सुरक्षा
|
||||
navbar.sections.advance=उन्नत
|
||||
navbar.sections.edit=देखें और संपादित करें
|
||||
navbar.sections.popular=Popular
|
||||
navbar.sections.popular=यादृच्छिको
|
||||
|
||||
#############
|
||||
# SETTINGS #
|
||||
@@ -163,13 +165,13 @@ settings.downloadOption.3=फ़ाइल डाउनलोड करें
|
||||
settings.zipThreshold=जब डाउनलोड की गई फ़ाइलों की संख्या सीमा से अधिक हो
|
||||
settings.signOut=साइन आउट
|
||||
settings.accountSettings=खाता सेटिंग्स
|
||||
settings.bored.help=Enables easter egg game
|
||||
settings.cacheInputs.name=Save form inputs
|
||||
settings.cacheInputs.help=Enable to store previously used inputs for future runs
|
||||
settings.bored.help=बालाची खुशाखुशी गेम सक्रिय गर्ने आवकता
|
||||
settings.cacheInputs.name=पहिलो इनपुटहरू बंदरगाहमा राख्न
|
||||
settings.cacheInputs.help=क्रियाकलापको पारित कर्मचारी भेट्दा पूर्ववार उपयोग मा लगाएको इनपुटहरू बंदरगाहमा संग्रहित गर्ने आवकता
|
||||
|
||||
changeCreds.title=क्रेडेंशियल बदलें
|
||||
changeCreds.header=अपना खाता विवरण अपडेट करें
|
||||
changeCreds.changePassword=You are using default login credentials. Please enter a new password
|
||||
changeCreds.changePassword=सुरक्षित पासワर्ड वापर्ने बदल्नु हो
|
||||
changeCreds.newUsername=नया उपयोगकर्ता नाम
|
||||
changeCreds.oldPassword=वर्तमान पासवर्ड
|
||||
changeCreds.newPassword=नया पासवर्ड
|
||||
@@ -204,25 +206,25 @@ adminUserSettings.header=व्यवस्थापक उपयोगकर्
|
||||
adminUserSettings.admin=व्यवस्थापक
|
||||
adminUserSettings.user=उपयोगकर्ता
|
||||
adminUserSettings.addUser=नया उपयोगकर्ता जोड़ें
|
||||
adminUserSettings.deleteUser=Delete User
|
||||
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||
adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled?
|
||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||
adminUserSettings.deleteUser=उपयोगकर्ता छुट्टी देनु
|
||||
adminUserSettings.confirmDeleteUser=उपयोगकर्ताको छुट्टी दिइने सँचार हुनुपछै अनुमति दिन्दै लागि पुष्टि गर्नुहोस्
|
||||
adminUserSettings.confirmChangeUserStatus=उपयोगकर्ताको स्थिरपद्धति परिवर्तनले पुष्टि गर्नुहोस्
|
||||
adminUserSettings.usernameInfo=उपयोगकर्ता नाममा केही संख्या, क्रतिका र अगले पूर्णाङ्क @._+- मा जस्ता विशेष चिह्नहरू छुन्न सकिँदू उपयोगकर्ता नामले एक संधारणीय पत्रक्याले बनाइएच।
|
||||
adminUserSettings.roles=रोल्स
|
||||
adminUserSettings.role=रोल
|
||||
adminUserSettings.actions=क्रियाएँ
|
||||
adminUserSettings.apiUser=सीमित API उपयोगकर्ता
|
||||
adminUserSettings.extraApiUser=Additional Limited API User
|
||||
adminUserSettings.extraApiUser=अतिरिक्त सीमित API उपयोगकर्ता
|
||||
adminUserSettings.webOnlyUser=केवल वेब उपयोगकर्ता
|
||||
adminUserSettings.demoUser=Demo User (No custom settings)
|
||||
adminUserSettings.internalApiUser=Internal API User
|
||||
adminUserSettings.demoUser=विनंति उपयोगकर्ता (स्वामित्व अनुकूली)
|
||||
adminUserSettings.internalApiUser=अन्तराल API उपयोगकर्ता
|
||||
adminUserSettings.forceChange=उपयोगकर्ता को लॉगिन पर उपयोगकर्ता नाम/पासवर्ड बदलने के लिए मजबूर करें
|
||||
adminUserSettings.submit=उपयोगकर्ता को सहेजें
|
||||
adminUserSettings.changeUserRole=यूज़र की भूमिका बदलें
|
||||
adminUserSettings.authenticated=Authenticated
|
||||
adminUserSettings.editOwnProfil=Edit own profile
|
||||
adminUserSettings.enabledUser=enabled user
|
||||
adminUserSettings.disabledUser=disabled user
|
||||
adminUserSettings.authenticated=मान्यताप्राप्त
|
||||
adminUserSettings.editOwnProfil=आफु प्रोफाइल संपादन गर्नुहोस्
|
||||
adminUserSettings.enabledUser=कार्यक्षम उपयोगकर्ता
|
||||
adminUserSettings.disabledUser=अकार्यक्षम उपयोगकर्ता
|
||||
adminUserSettings.activeUsers=Active Users:
|
||||
adminUserSettings.disabledUsers=Disabled Users:
|
||||
adminUserSettings.totalUsers=Total Users:
|
||||
@@ -246,6 +248,7 @@ database.fileNullOrEmpty=File must not be null or empty
|
||||
database.failedImportFile=Failed Import File
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -487,46 +490,46 @@ home.split-by-sections.title=खंडों से पीडीएफ़ वि
|
||||
home.split-by-sections.desc=पीडीएफ़ के प्रत्येक पृष्ठ को छोटे से छोटे क्षैतिज और ऊर्ध्वाधर खंडों में विभाजित करें
|
||||
split-by-sections.tags=खंड विभाजन, विभाजित करें, अनुकूलित
|
||||
|
||||
home.AddStampRequest.title=Add Stamp to PDF
|
||||
home.AddStampRequest.desc=Add text or add image stamps at set locations
|
||||
home.AddStampRequest.title=PDF में स्पष्ट रंग जोड़ें
|
||||
home.AddStampRequest.desc=साहित्य पुनर्व्यवस्थित करें या निर्धारित स्थानों पर चित्र लक्षण जोड़ें
|
||||
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
|
||||
|
||||
|
||||
home.PDFToBook.title=PDF to Book
|
||||
home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre
|
||||
home.PDFToBook.title=PDF से बुक
|
||||
home.PDFToBook.desc=Calibre का उपयोग करके PDF को बुक/कमिक्स फॉर्मेट में परिवर्तित करें
|
||||
PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
|
||||
home.BookToPDF.title=Book to PDF
|
||||
home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre
|
||||
home.BookToPDF.title=बुक से PDF
|
||||
home.BookToPDF.desc=Calibre का उपयोग करके Books/Comics फॉर्मेट को PDF में परिवर्तित करें
|
||||
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
|
||||
home.removeImagePdf.title=Remove image
|
||||
home.removeImagePdf.desc=Remove image from PDF to reduce file size
|
||||
removeImagePdf.tags=Remove Image,Page operations,Back end,server side
|
||||
home.removeImagePdf.title=चित्र हटाएं
|
||||
home.removeImagePdf.desc=PDF से चित्र हटा कर फाइल आकार को कम करें
|
||||
removeImagePdf.tags=चित्र हटाएं,पृष्ठ ऑपरेशन्स,बाकी सिड,सर्वर साइड
|
||||
|
||||
|
||||
home.splitPdfByChapters.title=Split PDF by Chapters
|
||||
home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure.
|
||||
splitPdfByChapters.tags=split,chapters,bookmarks,organize
|
||||
home.splitPdfByChapters.title=अध्यायों पर अलग-करें
|
||||
home.splitPdfByChapters.desc=पुस्तक के अध्याय की संरचना पर आधारित एक PDF को बहिन-भागों में विभाजित करें
|
||||
splitPdfByChapters.tags=विभाजन,अध्याय,पसंदीदा,रजैत
|
||||
|
||||
#replace-invert-color
|
||||
replace-color.title=Replace-Invert-Color
|
||||
replace-color.header=Replace-Invert Color PDF
|
||||
replace-color.header=चित्र रंग परिवर्तन/उलटकर परिवर्तन PDF
|
||||
home.replaceColorPdf.title=Replace and Invert Color
|
||||
home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size
|
||||
replaceColorPdf.tags=Replace Color,Page operations,Back end,server side
|
||||
replace-color.selectText.1=Replace or Invert color Options
|
||||
replace-color.selectText.2=Default(Default high contrast colors)
|
||||
replace-color.selectText.3=Custom(Customized colors)
|
||||
replace-color.selectText.4=Full-Invert(Invert all colors)
|
||||
replace-color.selectText.5=High contrast color options
|
||||
replace-color.selectText.6=white text on black background
|
||||
replace-color.selectText.7=Black text on white background
|
||||
replace-color.selectText.8=Yellow text on black background
|
||||
replace-color.selectText.9=Green text on black background
|
||||
replace-color.selectText.10=Choose text Color
|
||||
replace-color.selectText.11=Choose background Color
|
||||
replace-color.submit=Replace
|
||||
home.replaceColorPdf.desc=PDF में टेक्स्ट और पैरासेमा के लिए रंग परिवर्तन करें और पूरी फोटो उलटकर परिवर्तन करें जो कि फाइल आकार को कम करें
|
||||
replaceColorPdf.tags=रंग परिवर्तन,पृष्ठ ऑपरेशन्स,बाकी सिड,सर्वर साइड
|
||||
replace-color.selectText.1=रंग परिवर्तन/उलटकर परिवर्तन विकल्प
|
||||
replace-color.selectText.2=वैश्विक(वैश्विक उच्च अंतराल रंग)
|
||||
replace-color.selectText.3=स्वतन्त्र(आम रंग)
|
||||
replace-color.selectText.4=सार्वभौमिक-क्रमांतरण(सभी रंगों को आलवा करें)
|
||||
replace-color.selectText.5=कुछ तृvigya रंग विकल्प
|
||||
replace-color.selectText.6=गायन उपरि पीक मैदान पर काला अवलोकन
|
||||
replace-color.selectText.7=काले उपरि काला रेखा
|
||||
replace-color.selectText.8=काले उपरि काला मैदान पर सफ़ेद अवलोकन
|
||||
replace-color.selectText.9=काले उपरि काला मैदान पर हियंग अवलोकन
|
||||
replace-color.selectText.10=याद की जाने वाली रेखा चुनें
|
||||
replace-color.selectText.11=पौधा उपरि पीक मैदान चुनें
|
||||
replace-color.submit=बदलें
|
||||
|
||||
|
||||
|
||||
@@ -545,17 +548,17 @@ login.locked=आपका खाता लॉक कर दिया गया
|
||||
login.signinTitle=कृपया साइन इन करें
|
||||
login.ssoSignIn=सिंगल साइन - ऑन के ज़रिए लॉग इन करें
|
||||
login.oauth2AutoCreateDisabled=OAUTH2 ऑटो - क्रिएट यूज़र अक्षम किया गया
|
||||
login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator.
|
||||
login.oauth2RequestNotFound=Authorization request not found
|
||||
login.oauth2InvalidUserInfoResponse=Invalid User Info Response
|
||||
login.oauth2invalidRequest=Invalid Request
|
||||
login.oauth2AccessDenied=Access Denied
|
||||
login.oauth2InvalidTokenResponse=Invalid Token Response
|
||||
login.oauth2InvalidIdToken=Invalid Id Token
|
||||
login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator.
|
||||
login.alreadyLoggedIn=You are already logged in to
|
||||
login.alreadyLoggedIn2=devices. Please log out of the devices and try again.
|
||||
login.toManySessions=You have too many active sessions
|
||||
login.oauth2AdminBlockedUser=व्यक्तिगत नहीं की रजिस्टर या लॉग-इन वर्षा माह प्रतिबंधित है। कृपया संबवादक से संपर्क करें.
|
||||
login.oauth2RequestNotFound=स्वीकारोचा याचना मिल नहीं रही
|
||||
login.oauth2InvalidUserInfoResponse=अमान्तरित प्रकाशीय जानकारी संदेश कैसे है
|
||||
login.oauth2invalidRequest=गलत याचना
|
||||
login.oauth2AccessDenied=इनपुट उम्मीदवार डिसकार
|
||||
login.oauth2InvalidTokenResponse=अमान्तरित सिक्वेंस जवाब कैसे है
|
||||
login.oauth2InvalidIdToken=गलत इड टोकन
|
||||
login.userIsDisabled=उपयोगकर्ता डिसबाल, यह वर्षा सभी उपयोगकर्ता जूझे वर्षाकरण बारा मिल गई है। कृपया संबवादक से संपर्क करें.
|
||||
login.alreadyLoggedIn=आप पहले से ही
|
||||
login.alreadyLoggedIn2=सुनिश्चित करने वाले डिवाइस्स पर लॉग-इन हैं। कृपया इन डिवाइस से लॉगआउट करें और पुनः प्रयास करें
|
||||
login.toManySessions=आपके अधिक संख्या में विदीश हो रहे हैं
|
||||
|
||||
#auto-redact
|
||||
autoRedact.title=स्वत: गोपनीयकरण
|
||||
@@ -587,7 +590,7 @@ pdfToSinglePage.submit=एकल पृष्ठ में परिवर्त
|
||||
pageExtracter.title=पृष्ठों को निकालें
|
||||
pageExtracter.header=पृष्ठों को निकालें
|
||||
pageExtracter.submit=निकालें
|
||||
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
|
||||
pageExtracter.placeholder=(उदाहरण के लिए 1,2,8 या 4,7,12-16 या 2n-1)
|
||||
|
||||
|
||||
#getPdfInfo
|
||||
@@ -619,37 +622,37 @@ HTMLToPDF.header=HTML से पीडीएफ़
|
||||
HTMLToPDF.help=HTML फ़ाइलों और html/css/images आदि को आत्मसात करने वाले ZIPs को स्वीकार करता है
|
||||
HTMLToPDF.submit=रूपांतरित करें
|
||||
HTMLToPDF.credit=WeasyPrint का प्रयोग होता है
|
||||
HTMLToPDF.zoom=Zoom level for displaying the website.
|
||||
HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default)
|
||||
HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default)
|
||||
HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.printBackground=Render the background of websites.
|
||||
HTMLToPDF.defaultHeader=Enable Default Header (Name and page number)
|
||||
HTMLToPDF.cssMediaType=Change the CSS media type of the page.
|
||||
HTMLToPDF.none=None
|
||||
HTMLToPDF.print=Print
|
||||
HTMLToPDF.screen=Screen
|
||||
HTMLToPDF.zoom=संप्रेषण वेबसाइट के लिए डॉलर स्तर।
|
||||
HTMLToPDF.pageWidth=पृष्ठ की चौड़ाई मिलीमिटर में। (व्यंकत अधिकतर मान)
|
||||
HTMLToPDF.pageHeight=पृष्ठ की ऊँचाई मिलीमिटर में। (व्यंकत अधिकतर मान)
|
||||
HTMLToPDF.marginTop=पृष्ठ का शीर्ष बन्दरगाह मिलीमिटर में। (व्यंकत अधिकतर मान)
|
||||
HTMLToPDF.marginBottom=पृष्ठ का तल बन्दरगाह मिलीमिटर में। (व्यंकत अधिकतर मान)
|
||||
HTMLToPDF.marginLeft=पृष्ठ का बाएँ बन्दरगाह मिलीमिटर में। (व्यंकत अधिकतर मान)
|
||||
HTMLToPDF.marginRight=पृष्ठ का डाई बन्दरगाह मिलीमिटर में। (व्यंकत अधिकतर मान)
|
||||
HTMLToPDF.printBackground=वेबसाइट के पैनल को छद्म रूप से दिखाएं।
|
||||
HTMLToPDF.defaultHeader=उचित उपनाम (नाम और पृष्ठ संख्या) इनकार करें।
|
||||
HTMLToPDF.cssMediaType=पृष्ठ के लिए CSS मीडिया टाइप परिवर्तित करें।
|
||||
HTMLToPDF.none=कोई नहीं
|
||||
HTMLToPDF.print=दबाओ और बन्दोच्स हार्डवेयर पर आउटपुट करें।
|
||||
HTMLToPDF.screen=दिखाएँ जैसा कि अपने ट्रिपल पर।
|
||||
|
||||
|
||||
#AddStampRequest
|
||||
AddStampRequest.header=Stamp PDF
|
||||
AddStampRequest.title=Stamp PDF
|
||||
AddStampRequest.stampType=Stamp Type
|
||||
AddStampRequest.stampText=Stamp Text
|
||||
AddStampRequest.stampImage=Stamp Image
|
||||
AddStampRequest.alphabet=Alphabet
|
||||
AddStampRequest.fontSize=Font/Image Size
|
||||
AddStampRequest.rotation=Rotation
|
||||
AddStampRequest.opacity=Opacity
|
||||
AddStampRequest.position=Position
|
||||
AddStampRequest.overrideX=Override X Coordinate
|
||||
AddStampRequest.overrideY=Override Y Coordinate
|
||||
AddStampRequest.customMargin=Custom Margin
|
||||
AddStampRequest.customColor=Custom Text Color
|
||||
AddStampRequest.submit=Submit
|
||||
AddStampRequest.header=बिन्दुक बन्दोच्स हेडर
|
||||
AddStampRequest.title=बिन्दुक बन्दोच्स
|
||||
AddStampRequest.stampType=बिन्दुक प्रकार
|
||||
AddStampRequest.stampText=बिन्दुक टेक्स्ट
|
||||
AddStampRequest.stampImage=बिन्दुक आइमेज
|
||||
AddStampRequest.alphabet=अक्षर
|
||||
AddStampRequest.fontSize=फोन्ट/चित्र का आकार
|
||||
AddStampRequest.rotation=वृद्धि
|
||||
AddStampRequest.opacity=परिस्थिति
|
||||
AddStampRequest.position=स्थिति
|
||||
AddStampRequest.overrideX=X निर्देशांक परिबद्ध करें
|
||||
AddStampRequest.overrideY=Y निर्देशांक परिबद्ध करें
|
||||
AddStampRequest.customMargin=संवैधित मैरज
|
||||
AddStampRequest.customColor=संवैधित टेक्स्ट रंग
|
||||
AddStampRequest.submit=प्रदान करें
|
||||
|
||||
|
||||
#sanitizePDF
|
||||
@@ -730,7 +733,7 @@ pageLayout.submit=प्रस्तुत क
|
||||
scalePages.title=पृष्ठ-स्केल समायोजित करें
|
||||
scalePages.header=पृष्ठ-स्केल समायोजित करें
|
||||
scalePages.pageSize=दस्तावेज़ के पृष्ठ का आकार।
|
||||
scalePages.keepPageSize=Original Size
|
||||
scalePages.keepPageSize=मूल आकार
|
||||
scalePages.scaleFactor=पृष्ठ का ज़ूम स्तर (क्रॉप)।
|
||||
scalePages.submit=प्रस्तुत करें
|
||||
|
||||
@@ -739,25 +742,26 @@ scalePages.submit=प्रस्तुत करें
|
||||
certSign.title=प्रमाणपत्र साइनिंग
|
||||
certSign.header=अपने प्रमाणपत्र के साथ एक पीडीएफ़ पर हस्ताक्षर करें (काम जारी है)
|
||||
certSign.selectPDF=साइन करने के लिए एक पीडीएफ़ फ़ाइल का चयन करें:
|
||||
certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below.
|
||||
certSign.jksNote=नोट: यदि आपके संदेश प्रकार नीचे सूचीबद्ध नहीं है, तो कृपया keytool कमांड लाइन टूल का उपयोग कर आपका संदेश फ़ाइल (.jks) में परिवर्तित करें. फिर, नीचे .jks फ़ाइल विकल्प चुनें.
|
||||
certSign.selectKey=अपनी निजी कुंजी फ़ाइल का चयन करें (PKCS#8 प्रारूप, .pem या .der हो सकता है):
|
||||
certSign.selectCert=अपनी प्रमाणपत्र फ़ाइल का चयन करें (X.509 प्रारूप, .pem या .der हो सकता है):
|
||||
certSign.selectP12=अपनी PKCS#12 कीस्टोर फ़ाइल का चयन करें (.p12 या .pfx) (वैकल्पिक, यदि प्रदान की गई हो, तो इसमें आपकी निजी कुंजी और प्रमाणपत्र होना चाहिए):
|
||||
certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore):
|
||||
certSign.selectJKS=आपका Java Keystore (.jks या .keystore) फ़ाइल को चुनें:
|
||||
certSign.certType=प्रमाणपत्र प्रकार
|
||||
certSign.password=अपनी कीस्टोर या निजी कुंजी पासवर्ड दर्ज करें (यदि कोई हो):
|
||||
certSign.showSig=हस्ताक्षर दिखाएं
|
||||
certSign.reason=कारण
|
||||
certSign.location=स्थान
|
||||
certSign.name=नाम
|
||||
certSign.showLogo=लॉगो दिखाएं
|
||||
certSign.submit=पीडीएफ़ पर हस्ताक्षर करें
|
||||
|
||||
|
||||
#removeCertSign
|
||||
removeCertSign.title=Remove Certificate Signature
|
||||
removeCertSign.header=Remove the digital certificate from the PDF
|
||||
removeCertSign.selectPDF=Select a PDF file:
|
||||
removeCertSign.submit=Remove Signature
|
||||
removeCertSign.title=वितरण साइनचर्टर हटाएं
|
||||
removeCertSign.header=PDF में डिजिटल चार्टर को हटाएं
|
||||
removeCertSign.selectPDF=एक PDF फ़ाइल को चुनें:
|
||||
removeCertSign.submit=साइनचर्टर हटाएं
|
||||
|
||||
|
||||
#removeBlanks
|
||||
@@ -779,27 +783,27 @@ removeAnnotations.submit=हटाएं
|
||||
#compare
|
||||
compare.title=तुलना करें
|
||||
compare.header=पीडीएफ़ तुलना करें
|
||||
compare.highlightColor.1=Highlight Color 1:
|
||||
compare.highlightColor.2=Highlight Color 2:
|
||||
compare.highlightColor.1=प्रकाशित रंग 1:
|
||||
compare.highlightColor.2=प्रकाशित रंग 2:
|
||||
compare.document.1=दस्तावेज़ 1
|
||||
compare.document.2=दस्तावेज़ 2
|
||||
compare.submit=तुलना करें
|
||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
||||
compare.complex.message=एक या दोनों प्रदान की गई संस्कृति महंगे हैं, अपरिमेयता की तुलना की शुरुआत हो सकती है
|
||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
||||
compare.no.text.message=चयनित PDF में कोई भी प्रतीक नहीं है. कृपया प्रतीक वाले PDFs का चयन करें.
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Books and Comics to PDF
|
||||
BookToPDF.header=Book to PDF
|
||||
BookToPDF.credit=Uses Calibre
|
||||
BookToPDF.submit=Convert
|
||||
BookToPDF.title=बुक्स और कमिक्स को PDF में
|
||||
BookToPDF.header=बुक्स से पीडीएफ
|
||||
BookToPDF.credit=Calibre का उपयोग करता है
|
||||
BookToPDF.submit=संवाद करें
|
||||
|
||||
#PDFToBook
|
||||
PDFToBook.title=PDF to Book
|
||||
PDFToBook.header=PDF to Book
|
||||
PDFToBook.selectText.1=Format
|
||||
PDFToBook.credit=Uses Calibre
|
||||
PDFToBook.submit=Convert
|
||||
PDFToBook.title=PDF से बुक्स
|
||||
PDFToBook.header=PDF से बुक्स
|
||||
PDFToBook.selectText.1=फॉर्मट
|
||||
PDFToBook.credit=Calibre का उपयोग करता है
|
||||
PDFToBook.submit=संवाद करें
|
||||
|
||||
#sign
|
||||
sign.title=हस्ताक्षर
|
||||
@@ -809,12 +813,17 @@ sign.draw=हस्ताक्षर बनाएँ
|
||||
sign.text=पाठ इनपुट
|
||||
sign.clear=साफ़ करें
|
||||
sign.add=जोड़ें
|
||||
sign.saved=Saved Signatures
|
||||
sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.saved=जोड़े हुए प्रदर्शन
|
||||
sign.save=प्रदर्शन बचाएं
|
||||
sign.personalSigs=मौजूदा प्रदर्शन
|
||||
sign.sharedSigs=साझेदार प्रदर्शन
|
||||
sign.noSavedSigs=कोई भी संवर्तित प्रदर्शन नहीं मौजूद है
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=मरम्मत
|
||||
@@ -840,7 +849,7 @@ ScannerImageSplit.selectText.7=न्यूनतम कंटोर क्ष
|
||||
ScannerImageSplit.selectText.8=फोटो के लिए न्यूनतम कंटोर क्षेत्र थ्रेशोल्ड को सेट करता है।
|
||||
ScannerImageSplit.selectText.9=बॉर्डर का आकार:
|
||||
ScannerImageSplit.selectText.10=निकालने और जोड़ने के लिए जोड़ा जाने वाला बॉर्डर का आकार सेट करता है ताकि आउटपुट में सफेद बॉर्डर न आए (डिफ़ॉल्ट: 1)।
|
||||
ScannerImageSplit.info=Python is not installed. It is required to run.
|
||||
ScannerImageSplit.info=Python नहीं इंस्टॉल है. यह संचालित करने के लिए आवश्यक है.
|
||||
|
||||
|
||||
#OCR
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=OCR मोड
|
||||
ocr.selectText.11=OCR के बाद छवियां हटाएँ (सभी छवियां हटाएँ, केवल परिवर्तन चरण का हिस्सा होता है)
|
||||
ocr.selectText.12=रेंडर टाइप (उन्नत)
|
||||
ocr.help=कृपया इस डॉक्यूमेंटेशन को पढ़ें कि इसे अन्य भाषाओं के लिए कैसे उपयोग किया जाता है और/या डॉकर में नहीं हैं
|
||||
ocr.credit=इस सेवा में OCRmyPDF और टेसरेक्ट का उपयोग होता है।
|
||||
ocr.credit=इस सेवा में qpdf और टेसरेक्ट का उपयोग होता है।
|
||||
ocr.submit=OCR के साथ PDF प्रोसेस करें
|
||||
|
||||
|
||||
@@ -867,7 +876,7 @@ ocr.submit=OCR के साथ PDF प्रोसेस करें
|
||||
extractImages.title=छवियां निकालें
|
||||
extractImages.header=छवियां निकालें
|
||||
extractImages.selectText=निकाली गई छवियों को कन्वर्ट करने के लिए छवि प्रारूप चुनें
|
||||
extractImages.allowDuplicates=Save duplicate images
|
||||
extractImages.allowDuplicates=यह दबाव अनुमति दें
|
||||
extractImages.submit=निकालें
|
||||
|
||||
|
||||
@@ -875,7 +884,7 @@ extractImages.submit=निकालें
|
||||
fileToPDF.title=फ़ाइल से पीडीएफ़
|
||||
fileToPDF.header=किसी भी फ़ाइल को पीडीएफ़ में बदलें
|
||||
fileToPDF.credit=यह सेवा फ़ाइल परिवर्तन के लिए LibreOffice और Unoconv का उपयोग करती है।
|
||||
fileToPDF.supportedFileTypesInfo=Supported File types
|
||||
fileToPDF.supportedFileTypesInfo=समर्थित फ़ाइल प्रजातियाँ
|
||||
fileToPDF.supportedFileTypes=समर्थित फ़ाइल प्रकार नीचे दिए गए होने चाहिए हालांकि समर्थित प्रारूपों की पूरी अद्यतन सूची के लिए कृपया LibreOffice दस्तावेज़ीकरण से संदर्भित करें
|
||||
fileToPDF.submit=पीडीएफ़ में बदलें
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=पीडीएफ़ में बदलें
|
||||
#compress
|
||||
compress.title=संकुचित करें
|
||||
compress.header=PDF को संकुचित करें
|
||||
compress.credit=यह सेवा PDF संकुचन/अनुकूलन के लिए Ghostscript का उपयोग करती है।
|
||||
compress.credit=यह सेवा PDF संकुचन/अनुकूलन के लिए qpdf का उपयोग करती है।
|
||||
compress.selectText.1=मैनुअल मोड - 1 से 4 तक
|
||||
compress.selectText.2=अनुकूलन स्तर:
|
||||
compress.selectText.3=4 (पाठ छवियों के लिए अत्यधिक)
|
||||
@@ -905,7 +914,7 @@ merge.title=मर्ज
|
||||
merge.header=एक से अधिक PDF एक साथ मर्ज करें (2+)
|
||||
merge.sortByName=नाम से क्रमबद्ध करें
|
||||
merge.sortByDate=तारीख से क्रमबद्ध करें
|
||||
merge.removeCertSign=Remove digital signature in the merged file?
|
||||
merge.removeCertSign=संयोजित फाइल में डिजिटल साइग्नचर को हटा दें?
|
||||
merge.submit=मर्ज करें
|
||||
|
||||
|
||||
@@ -913,24 +922,45 @@ merge.submit=मर्ज करें
|
||||
pdfOrganiser.title=पेज व्यवस्थापक
|
||||
pdfOrganiser.header=PDF पेज व्यवस्थापक
|
||||
pdfOrganiser.submit=पृष्ठों को पुनः व्यवस्थित करें
|
||||
pdfOrganiser.mode=Mode
|
||||
pdfOrganiser.mode.1=Custom Page Order
|
||||
pdfOrganiser.mode.2=Reverse Order
|
||||
pdfOrganiser.mode.3=Duplex Sort
|
||||
pdfOrganiser.mode.4=Booklet Sort
|
||||
pdfOrganiser.mode.5=Side Stitch Booklet Sort
|
||||
pdfOrganiser.mode.6=Odd-Even Split
|
||||
pdfOrganiser.mode.7=Remove First
|
||||
pdfOrganiser.mode.8=Remove Last
|
||||
pdfOrganiser.mode.9=Remove First and Last
|
||||
pdfOrganiser.mode.10=Odd-Even Merge
|
||||
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||
pdfOrganiser.mode=रूप
|
||||
pdfOrganiser.mode.1=कस्टम पेज क्रम
|
||||
pdfOrganiser.mode.2=वापसी क्रम
|
||||
pdfOrganiser.mode.3=दुबल इंस्टर क्रम
|
||||
pdfOrganiser.mode.4=बुकलत सॉर्ट
|
||||
pdfOrganiser.mode.5=पारित-पीछे स्टिस्ट बुकलत सॉर्ट
|
||||
pdfOrganiser.mode.6=अशैली-बहूनी कटा-चिह्नित करना
|
||||
pdfOrganiser.mode.7=पहली पेज हटाना
|
||||
pdfOrganiser.mode.8=आखिरी पेज हटाना
|
||||
pdfOrganiser.mode.9=पहली और आखिरी पेज हटाना
|
||||
pdfOrganiser.mode.10=अशैली-बहूनी मिश्रण
|
||||
pdfOrganiser.placeholder=(जैसे 1,3,2 या 4-8,2,10-12 या 2n-1)
|
||||
|
||||
|
||||
#multiTool
|
||||
multiTool.title=पीडीएफ मल्टी टूल
|
||||
multiTool.header=पीडीएफ मल्टी टूल
|
||||
multiTool.uploadPrompts=File Name
|
||||
multiTool.uploadPrompts=फाइल का नाम
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=पीडीएफ देखें
|
||||
@@ -941,7 +971,7 @@ pageRemover.title=पेज हटाने वाला
|
||||
pageRemover.header=पीडीएफ पेज हटाने वाला
|
||||
pageRemover.pagesToDelete=हटाने के पेज (पृष्ठ संख्याओं की व्यवस्था के लिए एक कॉमा से अलग संख्याओं की सूची दर्ज करें):
|
||||
pageRemover.submit=पेज हटाएं
|
||||
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
|
||||
pageRemover.placeholder=(जैसे 1,2,6 या 1-10,15-30)
|
||||
|
||||
|
||||
#rotate
|
||||
@@ -992,7 +1022,7 @@ pdfToImage.color=रंगीन
|
||||
pdfToImage.grey=ग्रे स्केल
|
||||
pdfToImage.blackwhite=काला और सफेद (डेटा खो सकता है!)
|
||||
pdfToImage.submit=परिवर्तित करें
|
||||
pdfToImage.info=Python is not installed. Required for WebP conversion.
|
||||
pdfToImage.info=पायथन नहीं अनिस्तारित है। वेबP परिवर्तन के लिए आवश्यक है।
|
||||
|
||||
|
||||
#addPassword
|
||||
@@ -1029,10 +1059,10 @@ watermark.selectText.6=ऊंचाई स्पेसर (प्रत्ये
|
||||
watermark.selectText.7=अपारदर्शिता (0% - 100%):
|
||||
watermark.selectText.8=वॉटरमार्क प्रकार:
|
||||
watermark.selectText.9=वॉटरमार्क छवि:
|
||||
watermark.selectText.10=Convert PDF to PDF-Image
|
||||
watermark.selectText.10=PDF डीपीआईमज़ देखभाल करें
|
||||
watermark.submit=वॉटरमार्क जोड़ें
|
||||
watermark.type.1=Text
|
||||
watermark.type.2=Image
|
||||
watermark.type.1=संदेश
|
||||
watermark.type.2=इमेज
|
||||
|
||||
|
||||
#Change permissions
|
||||
@@ -1082,11 +1112,11 @@ changeMetadata.submit=बदलें
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF से PDF/A में
|
||||
pdfToPDFA.header=PDF से PDF/A में
|
||||
pdfToPDFA.credit=इस सेवा में PDF/A परिवर्तन के लिए ghostscript का उपयोग किया जाता है।
|
||||
pdfToPDFA.credit=इस सेवा में PDF/A परिवर्तन के लिए qpdf का उपयोग किया जाता है।
|
||||
pdfToPDFA.submit=परिवर्तित करें
|
||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
||||
pdfToPDFA.outputFormat=Output format
|
||||
pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step.
|
||||
pdfToPDFA.tip=यह सैकड़ों प्रविष्टियाँ एक ही समय में काम करते हैं
|
||||
pdfToPDFA.outputFormat=आउटपुट फॉर्मेट
|
||||
pdfToPDFA.pdfWithDigitalSignature=यह पीडीएफ मेला हस्ताक्षर से संबद्ध है। अगले कदम में यह हटाया जाएगा。
|
||||
|
||||
|
||||
#PDFToWord
|
||||
@@ -1168,14 +1198,14 @@ split-by-sections.vertical.label=लंबवत विभाजन
|
||||
split-by-sections.horizontal.placeholder=क्षैतिज विभाजन की संख्या दर्ज करें
|
||||
split-by-sections.vertical.placeholder=लंबवत विभाजन की संख्या दर्ज करें
|
||||
split-by-sections.submit=PDF को विभाजित करें
|
||||
split-by-sections.merge=Merge Into One PDF
|
||||
split-by-sections.merge=एक पीडीऐ में मिलाएं
|
||||
|
||||
|
||||
#printFile
|
||||
printFile.title=Print File
|
||||
printFile.header=Print File to Printer
|
||||
printFile.title=फाइल प्रिंत करें
|
||||
printFile.header=प्रिंट फाइल को प्रिंटर पर प्रिंट करें
|
||||
printFile.selectText.1=Select File to Print
|
||||
printFile.selectText.2=Enter Printer Name
|
||||
printFile.selectText.2=प्रिंटर का नाम दर्ज करें
|
||||
printFile.submit=Print
|
||||
|
||||
|
||||
@@ -1183,50 +1213,50 @@ printFile.submit=Print
|
||||
licenses.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
licenses.header=3rd Party Licenses
|
||||
licenses.module=Module
|
||||
licenses.version=Version
|
||||
licenses.module=मॗड्यूल
|
||||
licenses.version=वेरसन
|
||||
licenses.license=License
|
||||
|
||||
#survey
|
||||
survey.nav=Survey
|
||||
survey.title=Stirling-PDF Survey
|
||||
survey.nav=परीक्षण
|
||||
survey.title=स्टार्लिंग-पीडीएफ परीक्षण
|
||||
survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF!
|
||||
survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here:
|
||||
survey.changes2=With these changes we are getting paid business support and funding
|
||||
survey.changes=अंतिम परीक्षण के बाद स्टार्लिंग-पीडीएफ में कई बदलाव हो गए! अधिक जानने के लिए यहाँ हमारे ब्लॉग पोस्ट का प्रयास करें:
|
||||
survey.changes2=इन बदलावों से हम अपने व्यवसाय सहायता और जैकड़ की मिलान पाने की कुछ आशा रख रहे हैं
|
||||
survey.please=Please consider taking our survey!
|
||||
survey.disabled=(Survey popup will be disabled in following updates but available at foot of page)
|
||||
survey.button=Take Survey
|
||||
survey.dontShowAgain=Don't show again
|
||||
survey.disabled=(अपडेटों के बाद स्क्वायर पपपल अक्सर निष्क्रिय होगा, लेकिन पृष्ठ की तल उस पर उपलब्ध होगा)
|
||||
survey.button=परीक्षण करें
|
||||
survey.dontShowAgain=मुद्रण फ्लास्क से नहीं मिलाएं
|
||||
|
||||
|
||||
#error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord:
|
||||
error.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
error.sorry=अनुभव में विफलता के लिए खेद होता है!
|
||||
error.needHelp=मदद की जरूरत है / सहायता पानी पाया?
|
||||
error.contactTip=अगर आप भी समस्याओं के साथ बच रहे हैं, तो हमें मदद प्राप्त करने के लिए निष्क्रियता न करके अपनी सहायता की मुद्दों को भेज सकते हैं. आप GitHub पेज पर टिकट भेज सकते हैं या Discord ग्रुप में हमसे संपर्क कर सकते हैं:
|
||||
error.404.head=404 - पृष्ठ नहीं पाया | तो, कोड में कुछ गलती हुई!
|
||||
error.404.1=मेहनदरी से, आप खोज रहे पृष्ठ नहीं पाया जा सकता.
|
||||
error.404.2=कुछ गलती हुई.
|
||||
error.github=GitHub पर टिकट भेजें
|
||||
error.showStack=स्टैक ट्रेस को दिखाएं
|
||||
error.copyStack=स्टैक ट्रेस कopiए
|
||||
error.githubSubmit=GitHub - टिकट पहुँचाओ
|
||||
error.discordSubmit=Discord - समर्थन पोस्ट पोस्ट करें
|
||||
|
||||
|
||||
#remove-image
|
||||
removeImage.title=Remove image
|
||||
removeImage.header=Remove image
|
||||
removeImage.removeImage=Remove image
|
||||
removeImage.submit=Remove image
|
||||
removeImage.title=इंजाइम हटाएं
|
||||
removeImage.header=इंजाइम हटाएं
|
||||
removeImage.removeImage=इंजाइम हटाएं
|
||||
removeImage.submit=इंजाइम हटाएं
|
||||
|
||||
|
||||
splitByChapters.title=Split PDF by Chapters
|
||||
splitByChapters.header=Split PDF by Chapters
|
||||
splitByChapters.bookmarkLevel=Bookmark Level
|
||||
splitByChapters.includeMetadata=Include Metadata
|
||||
splitByChapters.allowDuplicates=Allow Duplicates
|
||||
splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure.
|
||||
splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.).
|
||||
splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF.
|
||||
splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs.
|
||||
splitByChapters.submit=Split PDF
|
||||
splitByChapters.title=पीडीएफ को अध्यायों द्वारा भागों में बाटें
|
||||
splitByChapters.header=पीडीएफ को अध्यायों द्वारा भागों में बाटें
|
||||
splitByChapters.bookmarkLevel=लेमैक्स स्तर
|
||||
splitByChapters.includeMetadata=मीटाडेटा को शामिल करें
|
||||
splitByChapters.allowDuplicates=डबल्स अनुमति दें
|
||||
splitByChapters.desc.1=यह यंकल सिपटे एक पीडीएफ फाइल को अपनी अध्याय संरचना के आधार पर बहुतांश नेट्स में विभाजित करता है.
|
||||
splitByChapters.desc.2=लेमैक्स स्तर: विभाजन के लिए उपयोग की गई लेमैक्स स्तर चुनें (0 टॉप-लेवल, 1 दूसरा-लेवल, इतर जैसे).
|
||||
splitByChapters.desc.3=मॉडेटरेट का शामिल करें: यदि सत्यापित किया जाता है, प्रारंभिक PDF की मॉडेटरेट को प्रत्येक विभाग PDF में शामिल किया जाएगा।
|
||||
splitByChapters.desc.4=यादृच्छिक पुनरावृत्ति अनुमोदित: यदि सत्यापित किया जाता है, एक ही पेज पर दोहरे मूल्यांकन पब्लिक पीड़एफ बनाने की संभावना देता है।
|
||||
splitByChapters.submit=PDF विभाजित
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
###########
|
||||
# the direction that the language is written (ltr = left to right, rtl = right to left)
|
||||
language.direction=ltr
|
||||
addPageNumbers.fontSize=Font Size
|
||||
addPageNumbers.fontName=Font Name
|
||||
addPageNumbers.fontSize=Veličina pisma
|
||||
addPageNumbers.fontName=Ime pisma
|
||||
pdfPrompt=Odaberi PDF(ove)
|
||||
multiPdfPrompt=Odaberi PDF-ove (2+)
|
||||
multiPdfDropPrompt=Odaberi (ili povuci i ispusti) sve potrebne PDF-ove
|
||||
@@ -27,7 +27,7 @@ bored=Dosađujete se čekajući?
|
||||
alphabet=Abeceda
|
||||
downloadPdf=Preuzmi PDF
|
||||
text=Tekst
|
||||
font=Font
|
||||
font=Pismo
|
||||
selectFillter=-- Odaberi --
|
||||
pageNum=Broj stranice
|
||||
sizes.small=Malo
|
||||
@@ -56,12 +56,12 @@ userNotFoundMessage=Korisnik nije pronađen.
|
||||
incorrectPasswordMessage=Kriva zaporka.
|
||||
usernameExistsMessage=Korisničko ime već postoji
|
||||
invalidUsernameMessage=Nevažeće korisničko ime, korisničko ime može sadržavati samo slova, brojke i sljedeće posebne znakove @._+- ili mora biti važeća adresa e-pošte.
|
||||
invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end.
|
||||
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||
invalidPasswordMessage=Lozinka ne smije biti prazna i ne smije počinjati ni završavati sa razmakom.
|
||||
confirmPasswordErrorMessage=Nova lozinka i potvrda nove lozinke moraju biti identične.
|
||||
deleteCurrentUserMessage=Nije moguće izbrisati trenutno prijavljenog korisnika.
|
||||
deleteUsernameExistsMessage=Korisničko ime ne postoji i ne može se izbrisati.
|
||||
downgradeCurrentUserMessage=Nije moguće vratiti unazad ulogu trenutnog korisnika
|
||||
disabledCurrentUserMessage=The current user cannot be disabled
|
||||
disabledCurrentUserMessage=Trenutni korisnik ne može biti onemogućen
|
||||
downgradeCurrentUserLongMessage=Nije moguće vratiti unazad ulogu trenutnog korisnika. Dakle, trenutni korisnik neće biti prikazan.
|
||||
userAlreadyExistsOAuthMessage=Korisnik već postoji kao OAuth2 korisnik.
|
||||
userAlreadyExistsWebMessage=Korisnik već postoji kao web korisnik.
|
||||
@@ -75,18 +75,19 @@ visitGithub=Posjeti Github Repository
|
||||
donate=Doniraj
|
||||
color=Boja
|
||||
sponsor=Sponzor
|
||||
info=Info
|
||||
info=Informacije
|
||||
pro=Pro
|
||||
page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
page=Stranica
|
||||
pages=Stranice
|
||||
loading=Učitavanje...
|
||||
addToDoc=Dodaj u dokument
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Privacy Policy
|
||||
legal.terms=Terms and Conditions
|
||||
legal.accessibility=Accessibility
|
||||
legal.cookie=Cookie Policy
|
||||
legal.impressum=Impressum
|
||||
legal.privacy=Politika privatnosti
|
||||
legal.terms=Uspe sodržine
|
||||
legal.accessibility=Dostupnost
|
||||
legal.cookie=Politika kolačića
|
||||
legal.impressum=Vedro ishoda
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
@@ -98,7 +99,7 @@ pipeline.defaultOption=Prilagođeno
|
||||
pipeline.submitButton=Pošalji
|
||||
pipeline.help=Pipeline Pomoć
|
||||
pipeline.scanHelp=Pomoć za skeniranje mapa
|
||||
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||
pipeline.deletePrompt=Jeste li sigurni da želite obrisati pipeline?
|
||||
|
||||
######################
|
||||
# Pipeline Options #
|
||||
@@ -116,21 +117,21 @@ pipelineOptions.validateButton=Potvrdi
|
||||
########################
|
||||
# ENTERPRISE EDITION #
|
||||
########################
|
||||
enterpriseEdition.button=Upgrade to Pro
|
||||
enterpriseEdition.warning=This feature is only available to Pro users.
|
||||
enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features.
|
||||
enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro
|
||||
enterpriseEdition.button=Ažurirajte na Pro
|
||||
enterpriseEdition.warning=Ova funkcija je dostupna samo pro korisnicima.
|
||||
enterpriseEdition.yamlAdvert=Stirling PDF Pro podrzava konfiguiracione datoteke u formati YAML i druga osobine SSO.
|
||||
enterpriseEdition.ssoAdvert=Tražite još funkcija za upravljanje korisnicima? Razmotrite Stirling PDF Pro
|
||||
|
||||
|
||||
#################
|
||||
# Analytics #
|
||||
#################
|
||||
analytics.title=Do you want make Stirling PDF better?
|
||||
analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.
|
||||
analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.
|
||||
analytics.enable=Enable analytics
|
||||
analytics.disable=Disable analytics
|
||||
analytics.settings=You can change the settings for analytics in the config/settings.yml file
|
||||
analytics.title=Želite li da stvarate Stirling PDF bolji?
|
||||
analytics.paragraph1=Stirling PDF ima uključene analitike koje nam pomažu da proizvod poboljšamo. Niste pratili nikakva osobna informacija ni sadržaj datoteka.
|
||||
analytics.paragraph2=Razmotrite omogućivanje analitičkih podataka kako biste stvorili Stirling-PDF veće i da bismo bolje razumeli naših korisnika.
|
||||
analytics.enable=Omogući analitike
|
||||
analytics.disable=Onemogući analitike
|
||||
analytics.settings=Možete promijeniti postavke za analitike u datoteci config/settings.yml
|
||||
|
||||
#############
|
||||
# NAVBAR #
|
||||
@@ -141,13 +142,14 @@ navbar.language=Jezici
|
||||
navbar.settings=Postavke
|
||||
navbar.allTools=Alati
|
||||
navbar.multiTool=Multi Tools (Alati)
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Organizirati
|
||||
navbar.sections.convertTo=Pretvori u PDF
|
||||
navbar.sections.convertFrom=Pretvori iz PDF
|
||||
navbar.sections.security=Potpis & sigurnost
|
||||
navbar.sections.advance=Napredno
|
||||
navbar.sections.edit=Pregled & Uređivanje
|
||||
navbar.sections.popular=Popular
|
||||
navbar.sections.popular=Popularno
|
||||
|
||||
#############
|
||||
# SETTINGS #
|
||||
@@ -204,9 +206,9 @@ adminUserSettings.header=Postavka kontrole korisnika za administratora
|
||||
adminUserSettings.admin=Administrator
|
||||
adminUserSettings.user=Korisnik
|
||||
adminUserSettings.addUser=Dodaj novog korisnika
|
||||
adminUserSettings.deleteUser=Delete User
|
||||
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||
adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled?
|
||||
adminUserSettings.deleteUser=Obriši korisnika
|
||||
adminUserSettings.confirmDeleteUser=Treba li obračunati ovaj korisnika?
|
||||
adminUserSettings.confirmChangeUserStatus=Treba li isključiti/uključiti ovog korisnika?
|
||||
adminUserSettings.usernameInfo=Korisničko ime može sadržavati samo slova, brojke i sljedeće posebne znakove @._+- ili mora biti važeća adresa e-pošte.
|
||||
adminUserSettings.roles=Uloge
|
||||
adminUserSettings.role=Uloga
|
||||
@@ -220,32 +222,33 @@ adminUserSettings.forceChange=Prisiliti korisnika da promijeni lozinku prilikom
|
||||
adminUserSettings.submit=Spremi korisnika
|
||||
adminUserSettings.changeUserRole=Promijenite korisničku ulogu
|
||||
adminUserSettings.authenticated=Autentificirano
|
||||
adminUserSettings.editOwnProfil=Edit own profile
|
||||
adminUserSettings.enabledUser=enabled user
|
||||
adminUserSettings.disabledUser=disabled user
|
||||
adminUserSettings.activeUsers=Active Users:
|
||||
adminUserSettings.disabledUsers=Disabled Users:
|
||||
adminUserSettings.totalUsers=Total Users:
|
||||
adminUserSettings.lastRequest=Last Request
|
||||
adminUserSettings.editOwnProfil=Uredi vlastit profil
|
||||
adminUserSettings.enabledUser=Omotljiv korisnik
|
||||
adminUserSettings.disabledUser=Onemogućen korisnik
|
||||
adminUserSettings.activeUsers=Aktivni korisnici:
|
||||
adminUserSettings.disabledUsers=Isključeni korisnici:
|
||||
adminUserSettings.totalUsers=Ukupan broj korisnika:
|
||||
adminUserSettings.lastRequest=Zadnji zahtjev
|
||||
|
||||
|
||||
database.title=Database Import/Export
|
||||
database.header=Database Import/Export
|
||||
database.fileName=File Name
|
||||
database.creationDate=Creation Date
|
||||
database.fileSize=File Size
|
||||
database.deleteBackupFile=Delete Backup File
|
||||
database.importBackupFile=Import Backup File
|
||||
database.downloadBackupFile=Download Backup File
|
||||
database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application.
|
||||
database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention.
|
||||
database.submit=Import Backup
|
||||
database.importIntoDatabaseSuccessed=Import into database successed
|
||||
database.fileName=Ime datoteke
|
||||
database.creationDate=Datum stvaranja
|
||||
database.fileSize=Veličina datoteke
|
||||
database.deleteBackupFile=Obriši zadao sažeto datoteke
|
||||
database.importBackupFile=Uvezi sažeto datoteku
|
||||
database.downloadBackupFile=Preuzmi sažeto datoteku
|
||||
database.info_1=Kada uvažavate podatke, je ključno sigurno imati ispravan struktur. Ako niste sigurni šta uradite, tražite savjet i podršku od professionala. Greška u strukturi može uzrokovati greške u aplikaciji, do i uključujući potpunu nevjerojatnost funkcionalnosti aplikacije.
|
||||
database.info_2=Ime datoteke nije relevantno prijevezi. Buduće bit će ponovno oznaceno za određeni format backup_user_yyyyMMddHHmm.sql, čime se osigurava konzistentna nazivnica.
|
||||
database.submit=Uvezi sažeto
|
||||
database.importIntoDatabaseSuccessed=Uvez u bazu podataka uspio
|
||||
database.fileNotFound=File not Found
|
||||
database.fileNullOrEmpty=File must not be null or empty
|
||||
database.fileNullOrEmpty=Datoteka ne smije biti null ili prazna
|
||||
database.failedImportFile=Failed Import File
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.expired=Vaš sesija je istekla. Molim vas da osvježite stranicu i pokušate ponovno.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -285,7 +288,7 @@ pdfToImage.tags=konverzija,img,jpg,slika,foto
|
||||
|
||||
home.pdfOrganiser.title=Organiziranje
|
||||
home.pdfOrganiser.desc=Uklonite/preuredite stranice bilo kojim redoslijedom
|
||||
pdfOrganiser.tags=duplex,even,odd,sort,move
|
||||
pdfOrganiser.tags=dvostrana,parne,neparni,prikupljanje,prebacivanje
|
||||
|
||||
|
||||
home.addImage.title=Dodaj sliku
|
||||
@@ -349,7 +352,7 @@ PDFToPresentation.tags=slajdovi,prikaz,office,microsoft
|
||||
|
||||
home.PDFToText.title=PDF u RTF (Tekst)
|
||||
home.PDFToText.desc=Pretvorite PDF u tekst ili RTF format
|
||||
PDFToText.tags=richformat,richtextformat,rich text format
|
||||
PDFToText.tags=bojaformata,tjedentextformat,sadržanotekstformat
|
||||
|
||||
home.PDFToHTML.title=PDF u HTML
|
||||
home.PDFToHTML.desc=Pretvorite PDF u HTML format
|
||||
@@ -392,9 +395,9 @@ home.certSign.title=Potpišite s certifikatom
|
||||
home.certSign.desc=Potpisuje PDF s certifikatom/ključem (PEM/P12)
|
||||
certSign.tags=autentifikacija,PEM,P12,zvanično,šifriranje
|
||||
|
||||
home.removeCertSign.title=Remove Certificate Sign
|
||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
||||
home.removeCertSign.title=Ukloni potpis sertifikata
|
||||
home.removeCertSign.desc=Uklonite potpis sertifikata iz PDF-a
|
||||
removeCertSign.tags=autentičiranje,PEM,P12,djelomičan dešifriranje
|
||||
|
||||
home.pageLayout.title=Izgled s više stranica
|
||||
home.pageLayout.desc=Spojite više stranica PDF dokumenta u jednu stranicu
|
||||
@@ -500,33 +503,33 @@ home.BookToPDF.title=Book u PDF
|
||||
home.BookToPDF.desc=Pretvara format knjige/stripa u PDF format pomoću calibre
|
||||
BookToPDF.tags=Knjiga,Strip,Calibre,Pretvori,manga,amazon,kindle
|
||||
|
||||
home.removeImagePdf.title=Remove image
|
||||
home.removeImagePdf.desc=Remove image from PDF to reduce file size
|
||||
removeImagePdf.tags=Remove Image,Page operations,Back end,server side
|
||||
home.removeImagePdf.title=Ukloni sliku
|
||||
home.removeImagePdf.desc=Ukloni sliku iz PDF-a kako bi se smanjio veličina datoteke
|
||||
removeImagePdf.tags=Ukloni sliku, Rad sa stranicama, Back end, server strana
|
||||
|
||||
|
||||
home.splitPdfByChapters.title=Split PDF by Chapters
|
||||
home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure.
|
||||
splitPdfByChapters.tags=split,chapters,bookmarks,organize
|
||||
home.splitPdfByChapters.title=Podijeli PDF prema glavama
|
||||
home.splitPdfByChapters.desc=Podijeli PDF na više datoteka prema njegovom strukturnom obliku glava.
|
||||
splitPdfByChapters.tags=podjela, glave, markere, organizacija
|
||||
|
||||
#replace-invert-color
|
||||
replace-color.title=Replace-Invert-Color
|
||||
replace-color.header=Replace-Invert Color PDF
|
||||
replace-color.header=Zameni-inverziranje boja u PDF-u
|
||||
home.replaceColorPdf.title=Replace and Invert Color
|
||||
home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size
|
||||
replaceColorPdf.tags=Replace Color,Page operations,Back end,server side
|
||||
replace-color.selectText.1=Replace or Invert color Options
|
||||
replace-color.selectText.2=Default(Default high contrast colors)
|
||||
replace-color.selectText.3=Custom(Customized colors)
|
||||
replace-color.selectText.4=Full-Invert(Invert all colors)
|
||||
replace-color.selectText.5=High contrast color options
|
||||
replace-color.selectText.6=white text on black background
|
||||
replace-color.selectText.7=Black text on white background
|
||||
replace-color.selectText.8=Yellow text on black background
|
||||
replace-color.selectText.9=Green text on black background
|
||||
replace-color.selectText.10=Choose text Color
|
||||
replace-color.selectText.11=Choose background Color
|
||||
replace-color.submit=Replace
|
||||
home.replaceColorPdf.desc=Zamenite boju teksta i pozadine u PDF-u te inverzirajte cijeli PDF kako bi se smanjila veličina datoteke.
|
||||
replaceColorPdf.tags=Zameni boju, Rad sa stranicama, Back end, server strana
|
||||
replace-color.selectText.1=Optije za zamenu ili inverziranje boja
|
||||
replace-color.selectText.2=Standardno (standarske visoko kontrastne boje)
|
||||
replace-color.selectText.3=Napčno (prilagođene boje)
|
||||
replace-color.selectText.4=Cijelo-inverzirajte (inverzirajte sve boje)
|
||||
replace-color.selectText.5=Optije visoko kontrastne boje
|
||||
replace-color.selectText.6=Crna tekst na bijelu pozadini
|
||||
replace-color.selectText.7=Bijeli tekst na crvenoj pozadini
|
||||
replace-color.selectText.8=Žutni tekst na crnoj pozadini
|
||||
replace-color.selectText.9=Zeleni tekst na crnoj pozadini
|
||||
replace-color.selectText.10=Izaberite boju teksta
|
||||
replace-color.selectText.11=Izaberite pozadinu boju
|
||||
replace-color.submit=Zamijeni
|
||||
|
||||
|
||||
|
||||
@@ -545,17 +548,17 @@ login.locked=Vaš račun je zaključan.
|
||||
login.signinTitle=Molimo vas da se prijavite
|
||||
login.ssoSignIn=Prijavite se putem jedinstvene prijave
|
||||
login.oauth2AutoCreateDisabled=OAUTH2 automatsko kreiranje korisnika je onemogućeno
|
||||
login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator.
|
||||
login.oauth2AdminBlockedUser=Registracija ili prijava nekadreguiranih korisnika trenutno su blokirane. Molimo Vas da kontaktirate administratora.
|
||||
login.oauth2RequestNotFound=Zahtjev za autorizaciju nije pronađen
|
||||
login.oauth2InvalidUserInfoResponse=Nevažeće informacije o korisniku
|
||||
login.oauth2invalidRequest=Neispravan zahtjev
|
||||
login.oauth2AccessDenied=Pristup odbijen
|
||||
login.oauth2InvalidTokenResponse=Nevažeći odgovor tokena
|
||||
login.oauth2InvalidIdToken=Nevažeći ID token
|
||||
login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator.
|
||||
login.alreadyLoggedIn=You are already logged in to
|
||||
login.alreadyLoggedIn2=devices. Please log out of the devices and try again.
|
||||
login.toManySessions=You have too many active sessions
|
||||
login.userIsDisabled=Korisnik je deaktiviran, prijava sa ovim korisničkim imenom je trenutno zakazana. Molimo Vas da kontaktirate administratorske osobe.
|
||||
login.alreadyLoggedIn=Već ste se prijavili na
|
||||
login.alreadyLoggedIn2=ure. Odjavite se s ure i pokušajte ponovo.
|
||||
login.toManySessions=Imate preko mrežne sesije aktivnih
|
||||
|
||||
#auto-redact
|
||||
autoRedact.title=Automatsko uređivanje
|
||||
@@ -730,7 +733,7 @@ pageLayout.submit=Potvrdi
|
||||
scalePages.title=Podesite veličinu stranice
|
||||
scalePages.header=Podesite veličinu stranice
|
||||
scalePages.pageSize=Veličina stranice dokumenta.
|
||||
scalePages.keepPageSize=Original Size
|
||||
scalePages.keepPageSize=Originalna veličina
|
||||
scalePages.scaleFactor=Razina zumiranja (obrezivanje) stranice.
|
||||
scalePages.submit=Potvrdi
|
||||
|
||||
@@ -750,14 +753,15 @@ certSign.showSig=Prikaži potpis
|
||||
certSign.reason=Razlog
|
||||
certSign.location=Mjesto
|
||||
certSign.name=Ime
|
||||
certSign.showLogo=Prikaži logo
|
||||
certSign.submit=Potpiši PDF
|
||||
|
||||
|
||||
#removeCertSign
|
||||
removeCertSign.title=Remove Certificate Signature
|
||||
removeCertSign.header=Remove the digital certificate from the PDF
|
||||
removeCertSign.selectPDF=Select a PDF file:
|
||||
removeCertSign.submit=Remove Signature
|
||||
removeCertSign.title=Ukloni digitalno potpisano dokazilo
|
||||
removeCertSign.header=Uklonite digitalni potpis iz PDF-a
|
||||
removeCertSign.selectPDF=Odaberite datoteku PDF:
|
||||
removeCertSign.submit=Ukloni potpisi
|
||||
|
||||
|
||||
#removeBlanks
|
||||
@@ -779,14 +783,14 @@ removeAnnotations.submit=Ukloni
|
||||
#compare
|
||||
compare.title=Uporedite
|
||||
compare.header=Usporedite PDF-ove
|
||||
compare.highlightColor.1=Highlight Color 1:
|
||||
compare.highlightColor.2=Highlight Color 2:
|
||||
compare.highlightColor.1=Boja osvetljenja 1:
|
||||
compare.highlightColor.2=Boja osvetljenja 2:
|
||||
compare.document.1=Dokument 1
|
||||
compare.document.2=Dokument 2
|
||||
compare.submit=Uporedi
|
||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
||||
compare.complex.message=Jedan ili oba unesena dokumenta su veliki datoteke, to može smanjiti preciznost usporedbi
|
||||
compare.large.file.message=Jedan ili oba unesena dokumenta su prevelike za obradu
|
||||
compare.no.text.message=Jedan ili oba odabrana PDF-a nema tekst. Odaberite PDF-ove s tekstom za usporedbu.
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Knjige i stripovi u PDF
|
||||
@@ -809,12 +813,17 @@ sign.draw=Nacrtaj potpis
|
||||
sign.text=Tekstualni unos
|
||||
sign.clear=Obriši
|
||||
sign.add=Dodaj
|
||||
sign.saved=Saved Signatures
|
||||
sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.saved=Sacuvane potpisne oznake
|
||||
sign.save=Sačuvaj potpisnu oznaku
|
||||
sign.personalSigs=Osobni potpisi
|
||||
sign.sharedSigs=Dijeljeni potpisi
|
||||
sign.noSavedSigs=Nema sacuvanih potpisa pronađenih
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Popravi
|
||||
@@ -840,7 +849,7 @@ ScannerImageSplit.selectText.7=Minimalna konturna površina:
|
||||
ScannerImageSplit.selectText.8=Postavlja minimalni prag površine konture za fotografiju
|
||||
ScannerImageSplit.selectText.9=Veličina obruba:
|
||||
ScannerImageSplit.selectText.10=Postavlja veličinu obruba koji se dodaje i uklanja kako bi se spriječili bijeli obrubi u ispisu (zadano: 1).
|
||||
ScannerImageSplit.info=Python is not installed. It is required to run.
|
||||
ScannerImageSplit.info=Python nije instaliran. Treba je za izvršenje.
|
||||
|
||||
|
||||
#OCR
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=OCR način
|
||||
ocr.selectText.11=Ukloni slike nakon OCR-a (Uklanja SVE slike, korisno samo ako je dio koraka konverzije)
|
||||
ocr.selectText.12=Vrsta iscrtavanja (napredno)
|
||||
ocr.help=Pročitajte ovu dokumentaciju o tome kako ovo koristiti za druge jezike i/ili koristiti ne u dockeru
|
||||
ocr.credit=Ova usluga koristi OCRmyPDF i Tesseract za OCR.
|
||||
ocr.credit=Ova usluga koristi qpdf i Tesseract za OCR.
|
||||
ocr.submit=Obradi PDF sa OCR-om
|
||||
|
||||
|
||||
@@ -867,7 +876,7 @@ ocr.submit=Obradi PDF sa OCR-om
|
||||
extractImages.title=Ekstrakt slika
|
||||
extractImages.header=Ekstrakt slika
|
||||
extractImages.selectText=Odaberite format slike za pretvaranje izdvojenih slika
|
||||
extractImages.allowDuplicates=Save duplicate images
|
||||
extractImages.allowDuplicates=Sačuvaj duplikate slike
|
||||
extractImages.submit=Izdvajanje
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Pretvori u PDF
|
||||
#compress
|
||||
compress.title=Komprimirajte
|
||||
compress.header=Komprimirajte PDF
|
||||
compress.credit=Ova usluga koristi Ghostscript za komprimiranje / optimizaciju PDF-a.
|
||||
compress.credit=Ova usluga koristi qpdf za komprimiranje / optimizaciju PDF-a.
|
||||
compress.selectText.1=Ručni režim - Od 1 do 4
|
||||
compress.selectText.2=Nivo optimizacije:
|
||||
compress.selectText.3=4 (Užasno za tekstualne slike)
|
||||
@@ -905,7 +914,7 @@ merge.title=Spajanje
|
||||
merge.header=Spajanje više PDF-ova (2+)
|
||||
merge.sortByName=Poredaj po imenu
|
||||
merge.sortByDate=Poredaj po datumu
|
||||
merge.removeCertSign=Remove digital signature in the merged file?
|
||||
merge.removeCertSign=Ukloniti digitalni potpis u kombiniranom datoteku?
|
||||
merge.submit=Spajanje
|
||||
|
||||
|
||||
@@ -923,7 +932,7 @@ pdfOrganiser.mode.6=Par-Nepar Podjela
|
||||
pdfOrganiser.mode.7=Ukloni Prvu
|
||||
pdfOrganiser.mode.8=Ukloni Zadnju
|
||||
pdfOrganiser.mode.9=Ukloni Prvu i Zadnju
|
||||
pdfOrganiser.mode.10=Odd-Even Merge
|
||||
pdfOrganiser.mode.10=Neparno-parna kombinacija
|
||||
pdfOrganiser.placeholder=(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1)
|
||||
|
||||
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1)
|
||||
multiTool.title=PDF Višenamjenski alat
|
||||
multiTool.header=PDF Višenamjenski alat
|
||||
multiTool.uploadPrompts=Naziv datoteke
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=Pogledaj
|
||||
@@ -992,7 +1022,7 @@ pdfToImage.color=Boja
|
||||
pdfToImage.grey=Sivi tonovi
|
||||
pdfToImage.blackwhite=Crno-bijelo (mogu se izgubiti podaci!)
|
||||
pdfToImage.submit=Pretvori
|
||||
pdfToImage.info=Python is not installed. Required for WebP conversion.
|
||||
pdfToImage.info=Python nije instaliran. Treba je za konverziju na WebP.
|
||||
|
||||
|
||||
#addPassword
|
||||
@@ -1029,7 +1059,7 @@ watermark.selectText.6=Visina razmaka (Razmak između svakog vodenog žiga okomi
|
||||
watermark.selectText.7=Neprozirnost (0% - 100%):
|
||||
watermark.selectText.8=Vrsta vodenog žiga:
|
||||
watermark.selectText.9=Slika vodenog žiga:
|
||||
watermark.selectText.10=Convert PDF to PDF-Image
|
||||
watermark.selectText.10=Konvertiraj PDF u PDF-Sliku
|
||||
watermark.submit=Dodaj vodeni žig
|
||||
watermark.type.1=Tekst
|
||||
watermark.type.2=Slika
|
||||
@@ -1082,11 +1112,11 @@ changeMetadata.submit=Promijeniti
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF u PDF/A
|
||||
pdfToPDFA.header=PDF u PDF/A
|
||||
pdfToPDFA.credit=Ova usluga koristi ghostscript za PDF/A pretvorbu
|
||||
pdfToPDFA.credit=Ova usluga koristi qpdf za PDF/A pretvorbu
|
||||
pdfToPDFA.submit=Pretvoriti
|
||||
pdfToPDFA.tip=Trenutno ne radi za više unosa odjednom
|
||||
pdfToPDFA.outputFormat=Izlazni format
|
||||
pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step.
|
||||
pdfToPDFA.pdfWithDigitalSignature=PDF sadrži digitalni potpis. U sledećem koraku će biti uklonjen.
|
||||
|
||||
|
||||
#PDFToWord
|
||||
@@ -1188,15 +1218,15 @@ licenses.version=Verzija
|
||||
licenses.license=Licenca
|
||||
|
||||
#survey
|
||||
survey.nav=Survey
|
||||
survey.title=Stirling-PDF Survey
|
||||
survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF!
|
||||
survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here:
|
||||
survey.changes2=With these changes we are getting paid business support and funding
|
||||
survey.nav=Upitnica
|
||||
survey.title=Stirling-PDF Upitnica
|
||||
survey.description=Stirling-PDF nema praćenje pa želimo svesnost korisnika da bi poboljšali Stirling-PDF!
|
||||
survey.changes=Stirling-PDF je promenjen od poslednje upitnice! Za više informacija, proverite naš blog ovdje:
|
||||
survey.changes2=S ovim promenama dobivamo platnu podršku i financiranje poslovnim aktivnostima
|
||||
survey.please=Please consider taking our survey!
|
||||
survey.disabled=(Survey popup will be disabled in following updates but available at foot of page)
|
||||
survey.button=Take Survey
|
||||
survey.dontShowAgain=Don't show again
|
||||
survey.disabled=(Upitnica popup će biti onemogućena u sljedećim ažuracanjima aliće se nalaziti na dnu stranice)
|
||||
survey.button=Izvrsi upitnicu
|
||||
survey.dontShowAgain=Ne prikazujući ponovo
|
||||
|
||||
|
||||
#error
|
||||
@@ -1214,19 +1244,19 @@ error.discordSubmit=Discord - Pošalji objavu podrške
|
||||
|
||||
|
||||
#remove-image
|
||||
removeImage.title=Remove image
|
||||
removeImage.header=Remove image
|
||||
removeImage.removeImage=Remove image
|
||||
removeImage.submit=Remove image
|
||||
removeImage.title=Ukloni sliku
|
||||
removeImage.header=Ukloni sliku
|
||||
removeImage.removeImage=Ukloni sliku
|
||||
removeImage.submit=Izbriši sliku
|
||||
|
||||
|
||||
splitByChapters.title=Split PDF by Chapters
|
||||
splitByChapters.header=Split PDF by Chapters
|
||||
splitByChapters.bookmarkLevel=Bookmark Level
|
||||
splitByChapters.includeMetadata=Include Metadata
|
||||
splitByChapters.allowDuplicates=Allow Duplicates
|
||||
splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure.
|
||||
splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.).
|
||||
splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF.
|
||||
splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs.
|
||||
splitByChapters.submit=Split PDF
|
||||
splitByChapters.title=Podijeli PDF naoglazdene glave
|
||||
splitByChapters.header=Podijeli PDF naoglazdene glave
|
||||
splitByChapters.bookmarkLevel=Nivo oznaka
|
||||
splitByChapters.includeMetadata=Uključi metapodatke
|
||||
splitByChapters.allowDuplicates=Dopuštaj duplikate
|
||||
splitByChapters.desc.1=Ova alatka podijeli PDF datoteku u više PDFa na teme njene strukture glava.
|
||||
splitByChapters.desc.2=Nivo oznaka: Odaberite nivo oznaka koji će se koristiti za podjelu (0 za prvi nivo, 1 za drugi nivo itd.).
|
||||
splitByChapters.desc.3=Uključi metapodatke: Ako je pokušano, metapodaci iz originalne PDF datoteke će biti uključeni u svaku podijeljenu PDF datoteku.
|
||||
splitByChapters.desc.4=Dopuštaj duplikate: Ako je ova opcija zaštićena, dozvoljava se da se na istoj strani mogu stvoriti posebne PDF datoteke s više oznaka.
|
||||
splitByChapters.submit=Podijeli PDF
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
###########
|
||||
# the direction that the language is written (ltr = left to right, rtl = right to left)
|
||||
language.direction=ltr
|
||||
addPageNumbers.fontSize=Font Size
|
||||
addPageNumbers.fontName=Font Name
|
||||
addPageNumbers.fontSize=Betűméret
|
||||
addPageNumbers.fontName=Betűtípus
|
||||
pdfPrompt=Válasszon PDF-fájlokat
|
||||
multiPdfPrompt=Válasszon PDF-fájlokat (2+)
|
||||
multiPdfDropPrompt=Válassza ki (vagy húzza ide) az összes szükséges PDF-fájlt
|
||||
@@ -12,17 +12,17 @@ imgPrompt=Válasszon képeket
|
||||
genericSubmit=Beküldés
|
||||
processTimeWarning=Figyelmeztetés: Ez a folyamat akár egy percig is eltarthat a fájlmérettől függően
|
||||
pageOrderPrompt=Egyedi oldalsorrend (Adjon meg vesszővel elválasztott oldalszámokat vagy függvényeket, például 2n+1):
|
||||
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
|
||||
pageSelectionPrompt=Egyedi oldal kiválasztás (Virtuális, hússzögletes lista formátumban írja meg a választott oldalak számát, például 1,5,6 vagy függvények formában: 2n+1):
|
||||
goToPage=Ugrás
|
||||
true=Igaz
|
||||
false=Hamis
|
||||
unknown=Ismeretlen
|
||||
save=Mentés
|
||||
saveToBrowser=Save to Browser
|
||||
saveToBrowser=Mentés bölcskébe
|
||||
close=Bezárás
|
||||
filesSelected=kiválasztott fájlok
|
||||
noFavourites=Nincs hozzáadva kedvenc
|
||||
downloadComplete=Download Complete
|
||||
downloadComplete=Letöltés befejezve
|
||||
bored=Unatkozol?
|
||||
alphabet=Ábécé
|
||||
downloadPdf=PDF letöltése
|
||||
@@ -46,115 +46,117 @@ red=Piros
|
||||
green=Zöld
|
||||
blue=Kék
|
||||
custom=Egyedi...
|
||||
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
|
||||
poweredBy=Powered by
|
||||
yes=Yes
|
||||
no=No
|
||||
WorkInProgess=Munka folyamatban, lehetséges hibával működhet, kérjük jelentse meg bármilyen problémát!
|
||||
poweredBy=Hozzávalója:
|
||||
yes=Igen
|
||||
no=Nem
|
||||
changedCredsMessage=A hitelek megváltoztak!
|
||||
notAuthenticatedMessage=Felhasználó nincs hitelesítve.
|
||||
userNotFoundMessage=A felhasználó nem található.
|
||||
incorrectPasswordMessage=A jelenlegi jelszó helytelen.
|
||||
usernameExistsMessage=Az új felhasználónév már létezik.
|
||||
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||
invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end.
|
||||
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
invalidUsernameMessage=Érvénytelen felhasználónév, a felhasználónév csak betűk, számokat és az alábbi kisebb karaktereket tartalmazhat @._+- vagy egy érvényes e-mail címnek kell lennie.
|
||||
invalidPasswordMessage=A jelszó nem lehet üres és nem lehet teljesen tartalmazni háttérspácseket.
|
||||
confirmPasswordErrorMessage=Új jelszó és Megerősítési új jelszó egyeztetése.
|
||||
deleteCurrentUserMessage=Jelenleg bejelentkezett felhasználót nem lehet törölni.
|
||||
deleteUsernameExistsMessage=A felhasználónév nem létezik és nem lehet törlésre került.
|
||||
downgradeCurrentUserMessage=A jelenlegi felhasználó szerepkörét nem lehet visszaminősíteni
|
||||
disabledCurrentUserMessage=The current user cannot be disabled
|
||||
disabledCurrentUserMessage=Jelenleg bejelentkezett felhasználó nem lehet letiltva.
|
||||
downgradeCurrentUserLongMessage=Az aktuális felhasználó szerepkörét nem lehet visszaminősíteni. Ezért az aktuális felhasználó nem jelenik meg.
|
||||
userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user.
|
||||
userAlreadyExistsWebMessage=The user already exists as an web user.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
info=Info
|
||||
pro=Pro
|
||||
page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
userAlreadyExistsOAuthMessage=Az ezer hitelesítő szolgáltatás felhasználó ismertetve van.
|
||||
userAlreadyExistsWebMessage=A web felhasználó ismertetve van.
|
||||
error=Hiba
|
||||
oops=Egy gond történt!
|
||||
help=Segítség
|
||||
goHomepage=Kezdőoldal megnyitása
|
||||
joinDiscord=Jönj hozzá a Discord-szervert
|
||||
seeDockerHub=Docker Hub-on látni
|
||||
visitGithub=GitHub Repository megtekintése
|
||||
donate=Szerzés működéséhez segítségnyújtás
|
||||
color=Szín
|
||||
sponsor=Támogatók bejegyzése
|
||||
info=Információ
|
||||
pro=Professionális
|
||||
page=Oldal
|
||||
pages=Oldalak
|
||||
loading=Betöltés...
|
||||
addToDoc=Hozzáadás dokumentumba
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Privacy Policy
|
||||
legal.terms=Terms and Conditions
|
||||
legal.accessibility=Accessibility
|
||||
legal.cookie=Cookie Policy
|
||||
legal.impressum=Impressum
|
||||
legal.privacy=Adatvédelmi nyilatkozat
|
||||
legal.terms=Feltételek és feltételek
|
||||
legal.accessibility=Elérhetőség
|
||||
legal.cookie=Cukiernyomtatványi zászló
|
||||
legal.impressum=Rendszerinformáció
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
###############
|
||||
pipeline.header=Pipeline Menu (Beta)
|
||||
pipeline.uploadButton=Upload Custom
|
||||
pipeline.configureButton=Configure
|
||||
pipeline.defaultOption=Custom
|
||||
pipeline.submitButton=Submit
|
||||
pipeline.help=Pipeline Help
|
||||
pipeline.scanHelp=Folder Scanning Help
|
||||
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||
pipeline.header=Pipelinenavigációs menü (betavizsgálat)
|
||||
pipeline.uploadButton=Feltöltés
|
||||
pipeline.configureButton=Konfigurálás
|
||||
pipeline.defaultOption=Egyéni
|
||||
pipeline.submitButton=Küldés
|
||||
pipeline.help=Útmutató a pipelínhez
|
||||
pipeline.scanHelp=Mappák lekérése útmutatása
|
||||
pipeline.deletePrompt=Biztosan törölni szeretné az opciókat?
|
||||
|
||||
######################
|
||||
# Pipeline Options #
|
||||
######################
|
||||
pipelineOptions.header=Pipeline Configuration
|
||||
pipelineOptions.pipelineNameLabel=Pipeline Name
|
||||
pipelineOptions.saveSettings=Save Operation Settings
|
||||
pipelineOptions.pipelineNamePrompt=Enter pipeline name here
|
||||
pipelineOptions.selectOperation=Select Operation
|
||||
pipelineOptions.addOperationButton=Add operation
|
||||
pipelineOptions.pipelineHeader=Pipeline:
|
||||
pipelineOptions.saveButton=Download
|
||||
pipelineOptions.validateButton=Validate
|
||||
pipelineOptions.header=Pipelín beállításai
|
||||
pipelineOptions.pipelineNameLabel=Pipelín neve
|
||||
pipelineOptions.saveSettings=Beállítások mentése
|
||||
pipelineOptions.pipelineNamePrompt=Írd be a pipelín nevét ide
|
||||
pipelineOptions.selectOperation=Művelet kiválasztása
|
||||
pipelineOptions.addOperationButton=Művelet hozzáadása
|
||||
pipelineOptions.pipelineHeader=Pipelín:
|
||||
pipelineOptions.saveButton=Mentés
|
||||
pipelineOptions.validateButton=Érvényesítés
|
||||
|
||||
########################
|
||||
# ENTERPRISE EDITION #
|
||||
########################
|
||||
enterpriseEdition.button=Upgrade to Pro
|
||||
enterpriseEdition.warning=This feature is only available to Pro users.
|
||||
enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features.
|
||||
enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro
|
||||
enterpriseEdition.button=Növelje a személyrendszert PRO-re
|
||||
enterpriseEdition.warning=Ez a funkció csak a PRO felhasználók számára érhető el.
|
||||
enterpriseEdition.yamlAdvert=Stirling PDF PRO támogatja a YAML konfigurációs fájlokat és más SSO jellemzőket.
|
||||
enterpriseEdition.ssoAdvert=Több felhasználókezelési funkcióra vár? Ismételje meg a figyalmazást az Stirling PDF PRO szolgáltatásaihoz.
|
||||
|
||||
|
||||
#################
|
||||
# Analytics #
|
||||
#################
|
||||
analytics.title=Do you want make Stirling PDF better?
|
||||
analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.
|
||||
analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.
|
||||
analytics.enable=Enable analytics
|
||||
analytics.disable=Disable analytics
|
||||
analytics.settings=You can change the settings for analytics in the config/settings.yml file
|
||||
analytics.title=Szeretnéd tetszésre módosítani a Stirling PDF-t?
|
||||
analytics.paragraph1=A Stirling PDF szöveges adatokat jellemző integrációt teszi lehetővé, hogy javítsuk a terméket. Nem folytatjuk semmit sem a személyes információk vagy fájl tartalmakat.
|
||||
analytics.paragraph2=Köszönjük tekintse meg az integrációt, ami segít a Stirling-PDF növekedésében és segítne megértenünk a felhasználóinkat jobban.
|
||||
analytics.enable=Engedélyezze az analitikát
|
||||
analytics.disable=Letiltja az analitikát
|
||||
analytics.settings=A beállítások módosítása az analitikáért a config/settings.yml fájlban
|
||||
|
||||
#############
|
||||
# NAVBAR #
|
||||
#############
|
||||
navbar.favorite=Favorites
|
||||
navbar.favorite=Kedvencek
|
||||
navbar.darkmode=Sötét mód
|
||||
navbar.language=Languages
|
||||
navbar.language=Nyelvek
|
||||
navbar.settings=Beállítások
|
||||
navbar.allTools=Tools
|
||||
navbar.allTools=Eszközök
|
||||
navbar.multiTool=Multi Tools
|
||||
navbar.sections.organize=Organize
|
||||
navbar.sections.convertTo=Convert to PDF
|
||||
navbar.sections.convertFrom=Convert from PDF
|
||||
navbar.sections.security=Sign & Security
|
||||
navbar.sections.advance=Advanced
|
||||
navbar.sections.edit=View & Edit
|
||||
navbar.sections.popular=Popular
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Összeállítás
|
||||
navbar.sections.convertTo=Átalakítás PDF-be
|
||||
navbar.sections.convertFrom=PDF-ből átalakítás
|
||||
navbar.sections.security=Hitelesítés & Biztonság
|
||||
navbar.sections.advance=Fogadott funkciók
|
||||
navbar.sections.edit=Nézés és szerkesztés
|
||||
navbar.sections.popular=Populáris
|
||||
|
||||
#############
|
||||
# SETTINGS #
|
||||
#############
|
||||
settings.title=Beállítások
|
||||
settings.update=Frisítés elérhető
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.updateAvailable={0} az aktuális telepített verzió. Az újabb verzió ({1}) elérhető.
|
||||
settings.appVersion=App Verzió:
|
||||
settings.downloadOption.title=Válassza ki a letöltési lehetőséget (Egyetlen fájl esetén a nem tömörített letöltésekhez):
|
||||
settings.downloadOption.1=Nyissa meg ugyanabban az ablakban
|
||||
@@ -163,13 +165,13 @@ settings.downloadOption.3=Töltse le a fájlt
|
||||
settings.zipThreshold=Fájlok tömörítése, ha a letöltött fájlok száma meghaladja
|
||||
settings.signOut=Kijelentkezés
|
||||
settings.accountSettings=Fiókbeállítások
|
||||
settings.bored.help=Enables easter egg game
|
||||
settings.cacheInputs.name=Save form inputs
|
||||
settings.cacheInputs.help=Enable to store previously used inputs for future runs
|
||||
settings.bored.help=Easter Egg játék engedélyezése
|
||||
settings.cacheInputs.name=Formulálapok mentése
|
||||
settings.cacheInputs.help=Engedélyezve a korábban használt adatok tárolása a következő futásokhoz
|
||||
|
||||
changeCreds.title=Hitelesítés megváltoztatása
|
||||
changeCreds.header=Frissítse fiókadatait
|
||||
changeCreds.changePassword=You are using default login credentials. Please enter a new password
|
||||
changeCreds.changePassword=Használja a szükséges bejelentkezési adatokat. Kérjen meg egy új jelszót.
|
||||
changeCreds.newUsername=Új felhasználónév
|
||||
changeCreds.oldPassword=Jelenlegi jelszó
|
||||
changeCreds.newPassword=Új jelszó
|
||||
@@ -204,48 +206,49 @@ adminUserSettings.header=Adminisztrátori Felhasználói Vezérlési Beállítá
|
||||
adminUserSettings.admin=Adminisztrátor
|
||||
adminUserSettings.user=Felhasználó
|
||||
adminUserSettings.addUser=Új felhasználó hozzáadása
|
||||
adminUserSettings.deleteUser=Delete User
|
||||
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||
adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled?
|
||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||
adminUserSettings.deleteUser=Törlés felhasználó
|
||||
adminUserSettings.confirmDeleteUser=A felhasználót töröljük?
|
||||
adminUserSettings.confirmChangeUserStatus=Az állapot módosítása megfelelően?
|
||||
adminUserSettings.usernameInfo=A felhasználónév csak betűk, számok és az alábbi speciális karakterek @._+- vagy egy érvényes e-mail-cím lehet.
|
||||
adminUserSettings.roles=Szerepek
|
||||
adminUserSettings.role=Szerep
|
||||
adminUserSettings.actions=Műveletek
|
||||
adminUserSettings.apiUser=Korlátozott API-felhasználó
|
||||
adminUserSettings.extraApiUser=Additional Limited API User
|
||||
adminUserSettings.extraApiUser=További korlátozott API felhasználó
|
||||
adminUserSettings.webOnlyUser=Csak webes felhasználó
|
||||
adminUserSettings.demoUser=Demo User (No custom settings)
|
||||
adminUserSettings.internalApiUser=Internal API User
|
||||
adminUserSettings.demoUser=Demofelhasználó (nincs egyedi beállítás)
|
||||
adminUserSettings.internalApiUser=Belső API felhasználó
|
||||
adminUserSettings.forceChange=Kényszerítse a felhasználót a felhasználónév/jelszó megváltoztatására bejelentkezéskor
|
||||
adminUserSettings.submit=Felhasználó mentése
|
||||
adminUserSettings.changeUserRole=Felhasználó szerepkörének módosítása
|
||||
adminUserSettings.authenticated=Authenticated
|
||||
adminUserSettings.editOwnProfil=Edit own profile
|
||||
adminUserSettings.enabledUser=enabled user
|
||||
adminUserSettings.disabledUser=disabled user
|
||||
adminUserSettings.activeUsers=Active Users:
|
||||
adminUserSettings.disabledUsers=Disabled Users:
|
||||
adminUserSettings.totalUsers=Total Users:
|
||||
adminUserSettings.lastRequest=Last Request
|
||||
adminUserSettings.authenticated=Bejelentkezett
|
||||
adminUserSettings.editOwnProfil=Saját profil szerkesztése
|
||||
adminUserSettings.enabledUser=Engedélyezett felhasználó
|
||||
adminUserSettings.disabledUser=Letiltott felhasználó
|
||||
adminUserSettings.activeUsers=Aktív Felhasználók:
|
||||
adminUserSettings.disabledUsers=Letiltott Felhasználók:
|
||||
adminUserSettings.totalUsers=Összes Felhasználó:
|
||||
adminUserSettings.lastRequest=Utolsó kérelem
|
||||
|
||||
|
||||
database.title=Database Import/Export
|
||||
database.header=Database Import/Export
|
||||
database.fileName=File Name
|
||||
database.creationDate=Creation Date
|
||||
database.fileSize=File Size
|
||||
database.deleteBackupFile=Delete Backup File
|
||||
database.importBackupFile=Import Backup File
|
||||
database.downloadBackupFile=Download Backup File
|
||||
database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application.
|
||||
database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention.
|
||||
database.submit=Import Backup
|
||||
database.importIntoDatabaseSuccessed=Import into database successed
|
||||
database.title=Adatbázis import/export
|
||||
database.header=Adatbázis import/export
|
||||
database.fileName=Fájlnév
|
||||
database.creationDate=Létrehozás dátuma
|
||||
database.fileSize=Fájlszámítás
|
||||
database.deleteBackupFile=Visszaulasztó fájl törlése
|
||||
database.importBackupFile=Bemérsz visszaulastó fájl
|
||||
database.downloadBackupFile=Bemérő fájlet letöltés
|
||||
database.info_1=A bemeneti adatok bemérésekor fontos, hogy az helyes struktúrát biztosítsa. Ha nem tudja mit csinál, kérjen támogatást egy szakembertől. Az erőforrás hibája okozhat alkalmazás-ismerséleti gondokat, és viszontig, hogy az alkalmazás teljesen nem fut.
|
||||
database.info_2=A fájl neve nem jelent részt a feltöltés során. Később újra néven lesz átalakítva egy konzisztens nevésrendszert követve, a formátum: visszaulasztó_user_yyyyMMddHHmm.sql.
|
||||
database.submit=Bemérsz visszaulastó fájl
|
||||
database.importIntoDatabaseSuccessed=Adatbázisba importálva sikeresen
|
||||
database.fileNotFound=File not Found
|
||||
database.fileNullOrEmpty=File must not be null or empty
|
||||
database.fileNullOrEmpty=Fájlnull vagy üres nélkül nem lehet folytatni
|
||||
database.failedImportFile=Failed Import File
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.expired=A munkamenet letelezett. Frissítse a lapot és próbálkozzon újra.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -380,9 +383,9 @@ home.removeBlanks.title=Üres lapok eltávolítása
|
||||
home.removeBlanks.desc=Felismeri és eltávolítja az üres lapokat a dokumentumból
|
||||
removeBlanks.tags=takarítás,egyszerűsítés,nem-tartalom,szervez
|
||||
|
||||
home.removeAnnotations.title=Remove Annotations
|
||||
home.removeAnnotations.desc=Removes all comments/annotations from a PDF
|
||||
removeAnnotations.tags=comments,highlight,notes,markup,remove
|
||||
home.removeAnnotations.title=Kijelölések eltávolítása
|
||||
home.removeAnnotations.desc=Egy PDF-től minden megjegyzés/mérlegelt elemét törli ki
|
||||
removeAnnotations.tags=megjegyzések, kiemelés, jegyzetek, módosítások, törlés
|
||||
|
||||
home.compare.title=Összehasonlítás
|
||||
home.compare.desc=Összehasonlítja és megmutatja a különbségeket két PDF dokumentum között
|
||||
@@ -392,9 +395,9 @@ home.certSign.title=Aláírás Tanúsítvánnyal
|
||||
home.certSign.desc=PDF aláírása tanúsítvánnyal/kulccsal (PEM/P12)
|
||||
certSign.tags=hitelesítés,PEM,P12,hivatalos,segitít,álca
|
||||
|
||||
home.removeCertSign.title=Remove Certificate Sign
|
||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
||||
home.removeCertSign.title=Tanúsítványi aláírás eltávolítása
|
||||
home.removeCertSign.desc=A PDF-től a tanúsítványi aláíratot törli ki
|
||||
removeCertSign.tags=hitelesítés, PEM, P12, szakmai, dekriptálás
|
||||
|
||||
home.pageLayout.title=Több oldal elrendezése
|
||||
home.pageLayout.desc=Több oldal egyesítése egy PDF dokumentumban egyetlen oldallá
|
||||
@@ -420,7 +423,7 @@ home.adjust-contrast.title=Színek/Kontraszt beállítása
|
||||
home.adjust-contrast.desc=PDF kontrasztjának, telítettségének és világosságának beállítása
|
||||
adjust-contrast.tags=szín-korrekció,beállítás,módosítás,fokoz
|
||||
|
||||
home.crop.title=Crop PDF
|
||||
home.crop.title=PDF vágása
|
||||
home.crop.desc=PDF vágása a méret csökkentése érdekében (a szöveg megőrzése mellett!)
|
||||
crop.tags=vágás,csökkentés,szerkesztés,forma
|
||||
|
||||
@@ -469,7 +472,7 @@ home.autoRedact.title=Automatikus Elrejtés
|
||||
home.autoRedact.desc=Automatikusan kitakar (elrejt) szöveget egy PDF-ben az input szöveg alapján
|
||||
autoRedact.tags=Elrejt,Elrejtés,kitakarás,fekete,fekete,marker,elrejtett
|
||||
|
||||
home.tableExtraxt.title=PDF to CSV
|
||||
home.tableExtraxt.title=PDF-től CSV-be való átalakítás
|
||||
home.tableExtraxt.desc=Táblázatok kinyerése a PDF-ből CSV formátumra konvertálva
|
||||
tableExtraxt.tags=CSV,Táblázat kinyerése,kinyer,konvertál
|
||||
|
||||
@@ -487,46 +490,46 @@ home.split-by-sections.title=PDF Szakaszokra osztása
|
||||
home.split-by-sections.desc=Minden oldal felosztása kisebb vízszintes és függőleges szakaszokra
|
||||
split-by-sections.tags=Szakasz elosztás, felosztás, testreszabás
|
||||
|
||||
home.AddStampRequest.title=Add Stamp to PDF
|
||||
home.AddStampRequest.desc=Add text or add image stamps at set locations
|
||||
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
|
||||
home.AddStampRequest.title=Stempel hozzáadása PDF-be
|
||||
home.AddStampRequest.desc=Addja a szövegét vagy képkép stempelésekbe a megadott helyekre
|
||||
AddStampRequest.tags=Stempel, kép hozzáadása, középső rendítés, csatorna, PDF, beágyazás, személyre szokásos
|
||||
|
||||
|
||||
home.PDFToBook.title=PDF to Book
|
||||
home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre
|
||||
home.PDFToBook.title=PDF to könyv
|
||||
home.PDFToBook.desc=A calibre segítségével PDF fájlt könyvtár/szókincs formátumba alakít.
|
||||
PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
|
||||
home.BookToPDF.title=Book to PDF
|
||||
home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre
|
||||
home.BookToPDF.title=Könyv a PDF-be
|
||||
home.BookToPDF.desc=A calibre segítségével könyvtár/szókincs fájlt PDF-be alakít.
|
||||
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
|
||||
home.removeImagePdf.title=Remove image
|
||||
home.removeImagePdf.desc=Remove image from PDF to reduce file size
|
||||
removeImagePdf.tags=Remove Image,Page operations,Back end,server side
|
||||
home.removeImagePdf.title=Kép törölése
|
||||
home.removeImagePdf.desc=Törlés a képből a fájl méret csökkentéséhez
|
||||
removeImagePdf.tags=Kép törlése, oldalszerkezet műveletek, háttér műveletek, kiszolgálói oldal
|
||||
|
||||
|
||||
home.splitPdfByChapters.title=Split PDF by Chapters
|
||||
home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure.
|
||||
splitPdfByChapters.tags=split,chapters,bookmarks,organize
|
||||
home.splitPdfByChapters.title=PDF felosztása fejezetek szerint
|
||||
home.splitPdfByChapters.desc=Fejezetei alapján egy PDF fájl több dokumentumba osztás.
|
||||
splitPdfByChapters.tags=Osztás, fejezetek, jelezes, organizálás
|
||||
|
||||
#replace-invert-color
|
||||
replace-color.title=Replace-Invert-Color
|
||||
replace-color.header=Replace-Invert Color PDF
|
||||
replace-color.header=Visszaalakítás-összevétel a színekkel PDF-ben
|
||||
home.replaceColorPdf.title=Replace and Invert Color
|
||||
home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size
|
||||
replaceColorPdf.tags=Replace Color,Page operations,Back end,server side
|
||||
replace-color.selectText.1=Replace or Invert color Options
|
||||
replace-color.selectText.2=Default(Default high contrast colors)
|
||||
replace-color.selectText.3=Custom(Customized colors)
|
||||
replace-color.selectText.4=Full-Invert(Invert all colors)
|
||||
replace-color.selectText.5=High contrast color options
|
||||
replace-color.selectText.6=white text on black background
|
||||
replace-color.selectText.7=Black text on white background
|
||||
replace-color.selectText.8=Yellow text on black background
|
||||
replace-color.selectText.9=Green text on black background
|
||||
replace-color.selectText.10=Choose text Color
|
||||
replace-color.selectText.11=Choose background Color
|
||||
replace-color.submit=Replace
|
||||
home.replaceColorPdf.desc=Cserélje le a szöveg és háttér színét PDF-ben és visszaalakítja a teljes színt az eszköz méret csökkentéséhez
|
||||
replaceColorPdf.tags=Szín cseréje, oldalszerkezet műveletek, kiszolgálói oldal
|
||||
replace-color.selectText.1=Cserélés-visszaalakítási opciók
|
||||
replace-color.selectText.2=Alapértelmezett (Alacsony kontrastos színek)
|
||||
replace-color.selectText.3=Egyéni (Egyéni színok)
|
||||
replace-color.selectText.4=Összevétel Összesen (Mind a színeket visszaalakítja)
|
||||
replace-color.selectText.5=Alacsony kontrastos szín opciók
|
||||
replace-color.selectText.6=fehér szöveg fekete háttérre
|
||||
replace-color.selectText.7=fekete szöveg fehére háttérre
|
||||
replace-color.selectText.8=pálva szöveg fekete háttérre
|
||||
replace-color.selectText.9=zöld szöveg fekete háttérre
|
||||
replace-color.selectText.10=Válasszon színet a szövékre
|
||||
replace-color.selectText.11=Válassza a háttérszínt
|
||||
replace-color.submit=Cseréljön le
|
||||
|
||||
|
||||
|
||||
@@ -545,17 +548,17 @@ login.locked=A fiókja zárolva lett!
|
||||
login.signinTitle=Kérjük, jelentkezzen be!
|
||||
login.ssoSignIn=Bejelentkezés egyszeri bejelentkezéssel
|
||||
login.oauth2AutoCreateDisabled=OAUTH2 Felhasználó automatikus létrehozása letiltva
|
||||
login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator.
|
||||
login.oauth2RequestNotFound=Authorization request not found
|
||||
login.oauth2InvalidUserInfoResponse=Invalid User Info Response
|
||||
login.oauth2invalidRequest=Invalid Request
|
||||
login.oauth2AccessDenied=Access Denied
|
||||
login.oauth2InvalidTokenResponse=Invalid Token Response
|
||||
login.oauth2InvalidIdToken=Invalid Id Token
|
||||
login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator.
|
||||
login.alreadyLoggedIn=You are already logged in to
|
||||
login.alreadyLoggedIn2=devices. Please log out of the devices and try again.
|
||||
login.toManySessions=You have too many active sessions
|
||||
login.oauth2AdminBlockedUser=A nevű felhasználók regisztrációja vagy bejelentkezése megszakítva. Kérjen segítséget a rendszergazdától.
|
||||
login.oauth2RequestNotFound=Hozzájárulási kérést nem találtunk
|
||||
login.oauth2InvalidUserInfoResponse=Érvénytelen felhasználói információs válasz
|
||||
login.oauth2invalidRequest=Érvénytelen kérelem
|
||||
login.oauth2AccessDenied=Hozzáférés megtagadva
|
||||
login.oauth2InvalidTokenResponse=Érvénytelen token-válasz
|
||||
login.oauth2InvalidIdToken=Érvénytelen azonosító token
|
||||
login.userIsDisabled=A felhasználó deaktivált, a bejelentkezés jelenleg megszakítva ezzel a felhasználónévvel. Kérjen segítséget a rendszergazdától.
|
||||
login.alreadyLoggedIn=Már be van jelentkezve az
|
||||
login.alreadyLoggedIn2=eszközökre. Kijelentkezzen ezekből a eszközökből, majd próbálja újra bejelentkezni.
|
||||
login.toManySessions=Túl sok aktív munkamenet
|
||||
|
||||
#auto-redact
|
||||
autoRedact.title=Érzékeny tartalom eltávolítása
|
||||
@@ -587,7 +590,7 @@ pdfToSinglePage.submit=Átalakítás egyetlen oldallá
|
||||
pageExtracter.title=Oldalak kinyerése
|
||||
pageExtracter.header=Oldalak kinyerése
|
||||
pageExtracter.submit=Kinyerés
|
||||
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
|
||||
pageExtracter.placeholder=(pl. 1,2,8 vagy 4,7,12-16 vagy 2n-1)
|
||||
|
||||
|
||||
#getPdfInfo
|
||||
@@ -619,37 +622,37 @@ HTMLToPDF.header=HTML >> PDF
|
||||
HTMLToPDF.help=Elfogad HTML fájlokat és ZIP-fájlokat, amelyek tartalmaznak html/css/képeket stb.
|
||||
HTMLToPDF.submit=Átalakítás
|
||||
HTMLToPDF.credit=WeasyPrint alkalmazása
|
||||
HTMLToPDF.zoom=Zoom level for displaying the website.
|
||||
HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default)
|
||||
HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default)
|
||||
HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.printBackground=Render the background of websites.
|
||||
HTMLToPDF.defaultHeader=Enable Default Header (Name and page number)
|
||||
HTMLToPDF.cssMediaType=Change the CSS media type of the page.
|
||||
HTMLToPDF.none=None
|
||||
HTMLToPDF.print=Print
|
||||
HTMLToPDF.screen=Screen
|
||||
HTMLToPDF.zoom=Oldalnéző szint a weboldal megjelenítésére.
|
||||
HTMLToPDF.pageWidth=Oldal szélessége centiméterben. (Törlés esetén az alapértelmezett érték lesz)
|
||||
HTMLToPDF.pageHeight=Oldal magassága centiméterben. (Törlés esetén az alapértelmezett érték lesz)
|
||||
HTMLToPDF.marginTop=Oldal felső marginalása milliméterben. (Törlés esetén az alapértelmezett érték lesz)
|
||||
HTMLToPDF.marginBottom=Oldal alsó marginalása milliméterben. (Törlés esetén az alapértelmezett érték lesz)
|
||||
HTMLToPDF.marginLeft=Oldal bal oldali marginalása milliméterben. (Törlés esetén az alapértelmezett érték lesz)
|
||||
HTMLToPDF.marginRight=Oldal jobb oldali marginalása milliméterben. (Törlés esetén az alapértelmezett érték lesz)
|
||||
HTMLToPDF.printBackground=Oldalsáv háttérét nyomtatásra jelenítse meg.
|
||||
HTMLToPDF.defaultHeader=Alapértelmezett fejléc (Nevezés és oldal szám) engedélyezése
|
||||
HTMLToPDF.cssMediaType=Oldal CSS média típusának módosítása.
|
||||
HTMLToPDF.none=Nincs
|
||||
HTMLToPDF.print=Nyomtatás
|
||||
HTMLToPDF.screen=Élő képernyő
|
||||
|
||||
|
||||
#AddStampRequest
|
||||
AddStampRequest.header=Stamp PDF
|
||||
AddStampRequest.title=Stamp PDF
|
||||
AddStampRequest.stampType=Stamp Type
|
||||
AddStampRequest.stampText=Stamp Text
|
||||
AddStampRequest.stampImage=Stamp Image
|
||||
AddStampRequest.header=Stempel PDF-be
|
||||
AddStampRequest.title=Stempel PDF-be
|
||||
AddStampRequest.stampType=Stempel típusa
|
||||
AddStampRequest.stampText=Stempel szövege
|
||||
AddStampRequest.stampImage=Stempel képsora
|
||||
AddStampRequest.alphabet=Alphabet
|
||||
AddStampRequest.fontSize=Font/Image Size
|
||||
AddStampRequest.rotation=Rotation
|
||||
AddStampRequest.opacity=Opacity
|
||||
AddStampRequest.position=Position
|
||||
AddStampRequest.overrideX=Override X Coordinate
|
||||
AddStampRequest.overrideY=Override Y Coordinate
|
||||
AddStampRequest.customMargin=Custom Margin
|
||||
AddStampRequest.customColor=Custom Text Color
|
||||
AddStampRequest.submit=Submit
|
||||
AddStampRequest.fontSize=Betűméret/stépésnév
|
||||
AddStampRequest.rotation=Fordítás
|
||||
AddStampRequest.opacity=Átlátszathossz
|
||||
AddStampRequest.position=Pozíció
|
||||
AddStampRequest.overrideX=Överrite X koordinátája
|
||||
AddStampRequest.overrideY=Överrite Y koordinátája
|
||||
AddStampRequest.customMargin=Egyéni mezők marginalája
|
||||
AddStampRequest.customColor=Egyéni szövegszín
|
||||
AddStampRequest.submit=Küldés
|
||||
|
||||
|
||||
#sanitizePDF
|
||||
@@ -695,7 +698,7 @@ adjustContrast.download=Letöltés
|
||||
|
||||
#crop
|
||||
crop.title=Körülvágás
|
||||
crop.header=Crop PDF
|
||||
crop.header=PDF kivágása
|
||||
crop.submit=Elküldés
|
||||
|
||||
|
||||
@@ -730,7 +733,7 @@ pageLayout.submit=Elküldés
|
||||
scalePages.title=Oldalméret beállítása
|
||||
scalePages.header=Oldalméret beállítása
|
||||
scalePages.pageSize=A dokumentum egy oldalának mérete.
|
||||
scalePages.keepPageSize=Original Size
|
||||
scalePages.keepPageSize=Váltás az eredeti méretre
|
||||
scalePages.scaleFactor=Az oldal nagyításának szintje (vágás).
|
||||
scalePages.submit=Küldés
|
||||
|
||||
@@ -739,25 +742,26 @@ scalePages.submit=Küldés
|
||||
certSign.title=Tanúsítvánnyal történő aláírás
|
||||
certSign.header=Aláírás PDF tanúsítvánnyal (fejlesztés alatt)
|
||||
certSign.selectPDF=Válasszon PDF fájlt az aláíráshoz:
|
||||
certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below.
|
||||
certSign.jksNote=Megjegyzés: Ha a tanúsítvány típusa nem szerepel a fenti listában, konvertálja Java Keystore (.jks) formátumba a keytool parancssor segítségével. Válassza az alábbi .jks vagy .keystore fájl opciót.
|
||||
certSign.selectKey=Válassza ki a saját kulcsfájlját (PKCS#8 formátum, lehet .pem vagy .der kiterjesztésű):
|
||||
certSign.selectCert=Válassza ki a tanúsítványfájlját (X.509 formátum, lehet .pem vagy .der kiterjesztésű):
|
||||
certSign.selectP12=Válassza ki a PKCS#12 kulcstár fájlját (.p12 vagy .pfx) (Opcionális, ha rendelkezésre áll, tartalmaznia kell a privát kulcsot és a tanúsítványt.):
|
||||
certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore):
|
||||
certSign.selectJKS=Java Keystore-fájl választása (.jks vagy .keystore):
|
||||
certSign.certType=Tanúsítvány típusa
|
||||
certSign.password=Adja meg a kulcstár vagy a privát kulcs jelszavát (ha van):
|
||||
certSign.showSig=Aláírás megjelenítése
|
||||
certSign.reason=Ok
|
||||
certSign.location=Hely
|
||||
certSign.name=Név
|
||||
certSign.showLogo=Logó megjelenítése
|
||||
certSign.submit=PDF aláírása
|
||||
|
||||
|
||||
#removeCertSign
|
||||
removeCertSign.title=Remove Certificate Signature
|
||||
removeCertSign.header=Remove the digital certificate from the PDF
|
||||
removeCertSign.selectPDF=Select a PDF file:
|
||||
removeCertSign.submit=Remove Signature
|
||||
removeCertSign.title=Tanúsítvány aláírás eltávolítása
|
||||
removeCertSign.header=PDF-ből törölje a digitális tanúsítványt
|
||||
removeCertSign.selectPDF=PDF fájl kiválasztása:
|
||||
removeCertSign.submit=Aláírást törlés
|
||||
|
||||
|
||||
#removeBlanks
|
||||
@@ -771,35 +775,35 @@ removeBlanks.submit=Üres oldalak eltávolítása
|
||||
|
||||
|
||||
#removeAnnotations
|
||||
removeAnnotations.title=Remove Annotations
|
||||
removeAnnotations.header=Remove Annotations
|
||||
removeAnnotations.submit=Remove
|
||||
removeAnnotations.title=Számítógépes bejegyzések törlése
|
||||
removeAnnotations.header=Számítógépes bejegyzések törlése
|
||||
removeAnnotations.submit=Töröl
|
||||
|
||||
|
||||
#compare
|
||||
compare.title=Összehasonlítás
|
||||
compare.header=PDF-ek összehasonlítása
|
||||
compare.highlightColor.1=Highlight Color 1:
|
||||
compare.highlightColor.2=Highlight Color 2:
|
||||
compare.highlightColor.1=Kötłówiteli szín 1:
|
||||
compare.highlightColor.2=Kijelzési szín 2:
|
||||
compare.document.1=Dokumentum 1
|
||||
compare.document.2=Dokumentum 2
|
||||
compare.submit=Összehasonlítás
|
||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
||||
compare.complex.message=Egy vagy mindkét kiválasztott dokumentum nagy, az összehasonlítás precizégének csökkenhet.
|
||||
compare.large.file.message=Egy vagy mindkét kiválasztott dokumentum túl nagy a feldolgozáshoz.
|
||||
compare.no.text.message=Egy vagy mindkét kiválasztott PDF nincs szöveggal. Kérjük, válasszon szöveg tartalmazó PDF-t.
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Books and Comics to PDF
|
||||
BookToPDF.header=Book to PDF
|
||||
BookToPDF.credit=Uses Calibre
|
||||
BookToPDF.submit=Convert
|
||||
BookToPDF.title=Könyvek és kézirattak PDF-be
|
||||
BookToPDF.header=Könyv to PDF
|
||||
BookToPDF.credit=Használja a Calibre-t
|
||||
BookToPDF.submit=Konvertálás
|
||||
|
||||
#PDFToBook
|
||||
PDFToBook.title=PDF to Book
|
||||
PDFToBook.title=PDF-ből könyv
|
||||
PDFToBook.header=PDF to Book
|
||||
PDFToBook.selectText.1=Format
|
||||
PDFToBook.credit=Uses Calibre
|
||||
PDFToBook.submit=Convert
|
||||
PDFToBook.selectText.1=Formátum
|
||||
PDFToBook.credit=Használja a Calibre-t
|
||||
PDFToBook.submit=Konvertálás
|
||||
|
||||
#sign
|
||||
sign.title=Aláírás
|
||||
@@ -809,12 +813,17 @@ sign.draw=Aláírás rajzolása
|
||||
sign.text=Szöveg beírása
|
||||
sign.clear=Törlés
|
||||
sign.add=Hozzáadás
|
||||
sign.saved=Saved Signatures
|
||||
sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.saved=Mentett aláírások
|
||||
sign.save=Aláíráshoz mentés
|
||||
sign.personalSigs=Személyi aláíráshoz
|
||||
sign.sharedSigs=Megosztott aláíráshoz
|
||||
sign.noSavedSigs=Nincsenek mentett aláírások találat
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Javítás
|
||||
@@ -825,7 +834,7 @@ repair.submit=Javítás
|
||||
#flatten
|
||||
flatten.title=Kiegyenlítés
|
||||
flatten.header=PDF-ek kiegyenlítése
|
||||
flatten.flattenOnlyForms=Flatten only forms
|
||||
flatten.flattenOnlyForms=Csak formákat átalakít
|
||||
flatten.submit=Kiegyenlítés
|
||||
|
||||
|
||||
@@ -840,7 +849,7 @@ ScannerImageSplit.selectText.7=Minimális kontúr terület:
|
||||
ScannerImageSplit.selectText.8=A fotók minimális kontúrterületének beállítása
|
||||
ScannerImageSplit.selectText.9=Keret mérete:
|
||||
ScannerImageSplit.selectText.10=A hozzáadott és eltávolított keret méretének beállítása a fehér keretek elkerülése érdekében a kimeneten (alapértelmezett: 1).
|
||||
ScannerImageSplit.info=Python is not installed. It is required to run.
|
||||
ScannerImageSplit.info=A Python nincs telepítve. Összefogóként szükséges.
|
||||
|
||||
|
||||
#OCR
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=OCR mód
|
||||
ocr.selectText.11=Képek eltávolítása OCR után (Az ÖSSZES kép eltávolítása, csak akkor hasznos, ha a konverzió része)
|
||||
ocr.selectText.12=Render típusa (Speciális)
|
||||
ocr.help=Kérjük, olvassa el ezt a dokumentációt az egyéb nyelvek használatához és/vagy a nem Docker-es használathoz.
|
||||
ocr.credit=Ez a szolgáltatás az OCRmyPDF és a Tesseract OCR használatával működik.
|
||||
ocr.credit=Ez a szolgáltatás az qpdf és a Tesseract OCR használatával működik.
|
||||
ocr.submit=PDF feldolgozása OCR-rel
|
||||
|
||||
|
||||
@@ -867,7 +876,7 @@ ocr.submit=PDF feldolgozása OCR-rel
|
||||
extractImages.title=Képek kinyerése
|
||||
extractImages.header=Képek kinyerése
|
||||
extractImages.selectText=Válassza ki a képformátumot a kinyert képek konvertálásához
|
||||
extractImages.allowDuplicates=Save duplicate images
|
||||
extractImages.allowDuplicates=Duplikált képek mentése
|
||||
extractImages.submit=Kinyerés
|
||||
|
||||
|
||||
@@ -875,7 +884,7 @@ extractImages.submit=Kinyerés
|
||||
fileToPDF.title=Fájl PDF dokumentummá alakítása
|
||||
fileToPDF.header=Konvertáljon bármilyen fájlt PDF dokumentummá
|
||||
fileToPDF.credit=Ez a szolgáltatás a LibreOffice-t és az Unoconv-ot használja a fájlkonverzióhoz.
|
||||
fileToPDF.supportedFileTypesInfo=Supported File types
|
||||
fileToPDF.supportedFileTypesInfo=Támogatott fájltípusok
|
||||
fileToPDF.supportedFileTypes=A funkció az alábbi fájltípusokat támogatja, azonban a teljesen friss támogatott formátumok listájáért kérjük, tekintse meg a LibreOffice dokumentációját
|
||||
fileToPDF.submit=Konvertálás PDF dokumentummá
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Konvertálás PDF dokumentummá
|
||||
#compress
|
||||
compress.title=Tömörítés
|
||||
compress.header=PDF tömörítése
|
||||
compress.credit=Ez a szolgáltatás a Ghostscript-et használja a PDF tömörítéséhez/optimalizálásához.
|
||||
compress.credit=Ez a szolgáltatás a qpdf-et használja a PDF tömörítéséhez/optimalizálásához.
|
||||
compress.selectText.1=Kézi mód - 1-től 4-ig
|
||||
compress.selectText.2=Optimalizálási szint:
|
||||
compress.selectText.3=4 (nem ajánlott a szöveges képekhez)
|
||||
@@ -905,7 +914,7 @@ merge.title=Összevonás
|
||||
merge.header=Több PDF összevonása (2+)
|
||||
merge.sortByName=Név szerinti rendezés
|
||||
merge.sortByDate=Dátum szerinti rendezés
|
||||
merge.removeCertSign=Remove digital signature in the merged file?
|
||||
merge.removeCertSign=Eltávolítja a megyérismereteket az összefuzött fájlban?
|
||||
merge.submit=Összevonás
|
||||
|
||||
|
||||
@@ -913,24 +922,45 @@ merge.submit=Összevonás
|
||||
pdfOrganiser.title=Oldalszervező
|
||||
pdfOrganiser.header=PDF Oldalszervező
|
||||
pdfOrganiser.submit=Oldalak átrendezése
|
||||
pdfOrganiser.mode=Mode
|
||||
pdfOrganiser.mode.1=Custom Page Order
|
||||
pdfOrganiser.mode.2=Reverse Order
|
||||
pdfOrganiser.mode.3=Duplex Sort
|
||||
pdfOrganiser.mode.4=Booklet Sort
|
||||
pdfOrganiser.mode.5=Side Stitch Booklet Sort
|
||||
pdfOrganiser.mode.6=Odd-Even Split
|
||||
pdfOrganiser.mode.7=Remove First
|
||||
pdfOrganiser.mode.8=Remove Last
|
||||
pdfOrganiser.mode.9=Remove First and Last
|
||||
pdfOrganiser.mode.10=Odd-Even Merge
|
||||
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||
pdfOrganiser.mode=Mód
|
||||
pdfOrganiser.mode.1=Törzsbeírás szabályos sorrend
|
||||
pdfOrganiser.mode.2=Fordított sorrend
|
||||
pdfOrganiser.mode.3=Dupla oldal rendezés
|
||||
pdfOrganiser.mode.4=Könyvrész letrehozása rendezés
|
||||
pdfOrganiser.mode.5=Oldalsarkatásos könyvrész letrehozása rendezés
|
||||
pdfOrganiser.mode.6=Tökéletes páratlan-páros split
|
||||
pdfOrganiser.mode.7=Először is eltávolítanunk
|
||||
pdfOrganiser.mode.8=Utolsó törölése
|
||||
pdfOrganiser.mode.9=Először és utolsó törlése
|
||||
pdfOrganiser.mode.10=Tökéletes páratlan-páros összekeverés
|
||||
pdfOrganiser.placeholder=(pl.: 1,3,2 vagy 4-8,2,10-12 vagy 2n-1)
|
||||
|
||||
|
||||
#multiTool
|
||||
multiTool.title=PDF többfunkciós eszköz
|
||||
multiTool.header=PDF többfunkciós eszköz
|
||||
multiTool.uploadPrompts=File Name
|
||||
multiTool.uploadPrompts=Fájl neve
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=PDF megtekintése
|
||||
@@ -941,7 +971,7 @@ pageRemover.title=Oldaltörlő
|
||||
pageRemover.header=PDF oldaltörlő
|
||||
pageRemover.pagesToDelete=Törlendő oldalak (adja meg az oldalszámok vesszővel elválasztott listáját):
|
||||
pageRemover.submit=Oldalak törlése
|
||||
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
|
||||
pageRemover.placeholder=(pl.: 1,2,6 vagy 1-10,15-30)
|
||||
|
||||
|
||||
#rotate
|
||||
@@ -992,7 +1022,7 @@ pdfToImage.color=színes
|
||||
pdfToImage.grey=szürkeárnyalatos
|
||||
pdfToImage.blackwhite=fekete-fehér (adatvesztéssel járhat!)
|
||||
pdfToImage.submit=Átalakítás
|
||||
pdfToImage.info=Python is not installed. Required for WebP conversion.
|
||||
pdfToImage.info=Nincs telepítve a Python. Szükséges a WebP konverzióhoz.
|
||||
|
||||
|
||||
#addPassword
|
||||
@@ -1029,10 +1059,10 @@ watermark.selectText.6=heightSpacer (Hely a vízjelek között függőlegesen):
|
||||
watermark.selectText.7=Átlátszóság (0% - 100%):
|
||||
watermark.selectText.8=Vízjel típusa:
|
||||
watermark.selectText.9=Vízjel képe:
|
||||
watermark.selectText.10=Convert PDF to PDF-Image
|
||||
watermark.selectText.10=PDF-t PDF-ra átalakítás
|
||||
watermark.submit=Vízjel hozzáadása
|
||||
watermark.type.1=Text
|
||||
watermark.type.2=Image
|
||||
watermark.type.1=Szöveg
|
||||
watermark.type.2=Kép
|
||||
|
||||
|
||||
#Change permissions
|
||||
@@ -1082,11 +1112,11 @@ changeMetadata.submit=Módosítás
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF >> PDF/A
|
||||
pdfToPDFA.header=PDF >> PDF/A
|
||||
pdfToPDFA.credit=Ez a szolgáltatás az ghostscript-t használja a PDF/A konverzióhoz
|
||||
pdfToPDFA.credit=Ez a szolgáltatás az qpdf-t használja a PDF/A konverzióhoz
|
||||
pdfToPDFA.submit=Konvertálás
|
||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
||||
pdfToPDFA.outputFormat=Output format
|
||||
pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step.
|
||||
pdfToPDFA.tip=Jelenleg egyszerre több fájl nem működik ezzel a funkcióval
|
||||
pdfToPDFA.outputFormat=Kimeneti formátum
|
||||
pdfToPDFA.pdfWithDigitalSignature=A PDF tartalmaz digitális alásszegyeztetést. Ez lesz eltávolítva az alábbi lépésben.
|
||||
|
||||
|
||||
#PDFToWord
|
||||
@@ -1168,65 +1198,65 @@ split-by-sections.vertical.label=Vízszintes szakaszok
|
||||
split-by-sections.horizontal.placeholder=Adja meg a vízszintes szakaszok számát
|
||||
split-by-sections.vertical.placeholder=Adja meg a függőleges szakaszok számát
|
||||
split-by-sections.submit=Felosztás
|
||||
split-by-sections.merge=Merge Into One PDF
|
||||
split-by-sections.merge=Egyesítsük a dokumentumokat egybe
|
||||
|
||||
|
||||
#printFile
|
||||
printFile.title=Print File
|
||||
printFile.header=Print File to Printer
|
||||
printFile.selectText.1=Select File to Print
|
||||
printFile.selectText.2=Enter Printer Name
|
||||
printFile.submit=Print
|
||||
printFile.title=Fájl kinyomtatása
|
||||
printFile.header=Fájlt nyomtatás a számítógépes kiíróra
|
||||
printFile.selectText.1=Válasszon ki a kinyomtatandó fájlt
|
||||
printFile.selectText.2=Add meg a kiíró nevét
|
||||
printFile.submit=Nyomtatás
|
||||
|
||||
|
||||
#licenses
|
||||
licenses.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
licenses.header=3rd Party Licenses
|
||||
licenses.module=Module
|
||||
licenses.version=Version
|
||||
licenses.module=Modul
|
||||
licenses.version=Verzió
|
||||
licenses.license=License
|
||||
|
||||
#survey
|
||||
survey.nav=Survey
|
||||
survey.title=Stirling-PDF Survey
|
||||
survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF!
|
||||
survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here:
|
||||
survey.changes2=With these changes we are getting paid business support and funding
|
||||
survey.nav=Kérdőív
|
||||
survey.title=Stirling-PDF Kérdőív
|
||||
survey.description=A Stirling-PDF nincs bejelentkezési adatokat tároló funkciója miatt szeretnénk a felhasználóink véleményét gyűjteni, hogy javítsuk meg a Stirling-PDF-t!
|
||||
survey.changes=A Stirling-PDF változásai a visszaérkező kérdőív után! További információért látogasson el az alábbi blogfelsorolást.
|
||||
survey.changes2=Ezek a változtatások során kapunk fizetendő üzleti támogatást és finanszírozást
|
||||
survey.please=Please consider taking our survey!
|
||||
survey.disabled=(Survey popup will be disabled in following updates but available at foot of page)
|
||||
survey.button=Take Survey
|
||||
survey.dontShowAgain=Don't show again
|
||||
survey.disabled=(A kérdőív bejelentkezés nélküli megjelenése le lesz tilos további frissítések után, de folyamatosan elérhető a oldal tetején)
|
||||
survey.button=Kérdőív végrehajtása
|
||||
survey.dontShowAgain=Más nincs mutatni ugyanarra a képernyőre
|
||||
|
||||
|
||||
#error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord:
|
||||
error.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
error.sorry=Sajnáljuk, hogy probléma van!
|
||||
error.needHelp=Segítségüket kérünk! / Hiba találkoztak?
|
||||
error.contactTip=Ha további nehézségekkel találkozna, ne szudirmáld a segítségre kérését. A GitHub oldalán egy típusot is lehet kiküldeni, vagy a Discordban kapcsolatba lépheted veleink:
|
||||
error.404.head=404 - Nincs ilyen oldal | Sajnáljuk, hogy valami meghibásodott!
|
||||
error.404.1=Nem tudom megkerülni az oldalt, amit keresed.
|
||||
error.404.2=Valami meghibásodott
|
||||
error.github=Típusot kiküldheted a GitHub-on
|
||||
error.showStack=Lássuk meg a sorozatot
|
||||
error.copyStack=Kövesse a sorozat másolását
|
||||
error.githubSubmit=GitHub - Típus kiküldése
|
||||
error.discordSubmit=Discord - Jegyzettömb kijavítása
|
||||
|
||||
|
||||
#remove-image
|
||||
removeImage.title=Remove image
|
||||
removeImage.header=Remove image
|
||||
removeImage.removeImage=Remove image
|
||||
removeImage.submit=Remove image
|
||||
removeImage.title=Távolítsa el az kép
|
||||
removeImage.header=Távolítsa el a képet
|
||||
removeImage.removeImage=Távolítsa el a képet
|
||||
removeImage.submit=Távolítsa el a képet
|
||||
|
||||
|
||||
splitByChapters.title=Split PDF by Chapters
|
||||
splitByChapters.header=Split PDF by Chapters
|
||||
splitByChapters.bookmarkLevel=Bookmark Level
|
||||
splitByChapters.includeMetadata=Include Metadata
|
||||
splitByChapters.allowDuplicates=Allow Duplicates
|
||||
splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure.
|
||||
splitByChapters.title=PDF fájlt fejezések szerint bontson fel
|
||||
splitByChapters.header=PDF fájlt fejezések szerint bontson fel
|
||||
splitByChapters.bookmarkLevel=Fejezet címkézése szintje
|
||||
splitByChapters.includeMetadata=Metadata beleszerkesztése
|
||||
splitByChapters.allowDuplicates=Duplikációk engedélyezése
|
||||
splitByChapters.desc.1=Ez az eszköz osztja fel a PDF-fájlt szövegszerkezet alapján lévő több fájlra.
|
||||
splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.).
|
||||
splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF.
|
||||
splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs.
|
||||
splitByChapters.submit=Split PDF
|
||||
splitByChapters.desc.3=Metaadatok belefoglalása: Ha bevanítva van, az eredeti PDF fájl metaadatai megtartódnak minden osztott fájlban.
|
||||
splitByChapters.desc.4=Duplikációk engedélyezése: Ha bevanítva van, lehetővé teszi a megadott oldalon lévő több kijelzőszint alapján új PDF-ek létrehozása.
|
||||
splitByChapters.submit=PDF osztás
|
||||
|
||||
@@ -74,13 +74,14 @@ seeDockerHub=Lihat Docker Hub
|
||||
visitGithub=Kunjungi Repositori Github
|
||||
donate=Donasi
|
||||
color=Warna
|
||||
sponsor=Sponsor
|
||||
info=Info
|
||||
sponsor=Pembantu
|
||||
info=Informasi
|
||||
pro=Pro
|
||||
page=Halaman
|
||||
pages=Halaman-halaman
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
loading=Mengambil data...
|
||||
addToDoc=Tambahkan ke Dokumen
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Kebijakan Privasi
|
||||
legal.terms=Syarat dan Ketentuan
|
||||
@@ -141,6 +142,7 @@ navbar.language=Bahasa
|
||||
navbar.settings=Pengaturan
|
||||
navbar.allTools=Alat
|
||||
navbar.multiTool=Alat Multi
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Atur
|
||||
navbar.sections.convertTo=Konversi ke PDF
|
||||
navbar.sections.convertFrom=Konversi dari PDF
|
||||
@@ -201,7 +203,7 @@ account.syncToAccount=Sinkronisasi Akun <- Browser
|
||||
|
||||
adminUserSettings.title=Pengaturan Kontrol Pengguna
|
||||
adminUserSettings.header=Pengaturan Kontrol Admin
|
||||
adminUserSettings.admin=Admin
|
||||
adminUserSettings.admin=Administrator
|
||||
adminUserSettings.user=Pengguna
|
||||
adminUserSettings.addUser=Tambahkan Pengguna Baru
|
||||
adminUserSettings.deleteUser=Hapus Pengguna
|
||||
@@ -212,7 +214,7 @@ adminUserSettings.roles=Peran
|
||||
adminUserSettings.role=Peran
|
||||
adminUserSettings.actions=Tindakan
|
||||
adminUserSettings.apiUser=Pengguna API Terbatas
|
||||
adminUserSettings.extraApiUser=Additional Limited API User
|
||||
adminUserSettings.extraApiUser=Pengguna API Terbatas Tambahan
|
||||
adminUserSettings.webOnlyUser=Pengguna Khusus Web
|
||||
adminUserSettings.demoUser=Pengguna Demo (Tanpa pengaturan kustom)
|
||||
adminUserSettings.internalApiUser=Pengguna API Internal
|
||||
@@ -246,6 +248,7 @@ database.fileNullOrEmpty=Berkas tidak boleh null atau kosong
|
||||
database.failedImportFile=Impor Berkas Gagal
|
||||
|
||||
session.expired=Sesi Anda telah kedaluwarsa. Silakan muat ulang halaman dan coba lagi.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -392,9 +395,9 @@ home.certSign.title=Tanda tangani dengan Sertifikat
|
||||
home.certSign.desc=Menandatangani PDF dengan Certificate/Key (PEM/P12)
|
||||
certSign.tags=mengotentikasi, PEM, P12, resmi, mengenkripsi
|
||||
|
||||
home.removeCertSign.title=Remove Certificate Sign
|
||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
||||
home.removeCertSign.title=Hapus Tanda Tangan Sertifikat
|
||||
home.removeCertSign.desc=Hapus tanda tangan sertifikat dari PDF
|
||||
removeCertSign.tags=otentikasi, PEM, P12, resmi, dekripsi
|
||||
|
||||
home.pageLayout.title=Tata Letak Multi-Halaman
|
||||
home.pageLayout.desc=Menggabungkan beberapa halaman dokumen PDF menjadi satu halaman
|
||||
@@ -481,15 +484,15 @@ autoSizeSplitPDF.tags=pdf, membagi, dokumen, organisasi
|
||||
|
||||
home.overlay-pdfs.title=Tumpuk PDF
|
||||
home.overlay-pdfs.desc=Menumpuk PDF di atas PDF lain
|
||||
overlay-pdfs.tags=Overlay
|
||||
overlay-pdfs.tags=Overlays
|
||||
|
||||
home.split-by-sections.title=Membagi PDF berdasarkan Bagian
|
||||
home.split-by-sections.desc=Membagi setiap halaman PDF menjadi beberapa bagian horizontal dan vertikal yang lebih kecil
|
||||
split-by-sections.tags=Membagi Bagian, Membagi, Menyesuaikan
|
||||
|
||||
home.AddStampRequest.title=Add Stamp to PDF
|
||||
home.AddStampRequest.desc=Add text or add image stamps at set locations
|
||||
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
|
||||
home.AddStampRequest.title=Tambahkan Tanda Tangan ke PDF
|
||||
home.AddStampRequest.desc=Tambahkan teks atau gambar tanda tangan di lokasi yang ditentukan
|
||||
AddStampRequest.tags=Tanda tangan, tambahkan gambar, posisikan gambar di tengah, air tinta, PDF, embedding, customisasi
|
||||
|
||||
|
||||
home.PDFToBook.title=PDF ke Buku
|
||||
@@ -587,7 +590,7 @@ pdfToSinglePage.submit=Konversi ke Halaman Tunggal
|
||||
pageExtracter.title=Ekstrak Halaman
|
||||
pageExtracter.header=Ekstrak Halaman
|
||||
pageExtracter.submit=Ekstrak
|
||||
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
|
||||
pageExtracter.placeholder=(misalnya 1,2,8 atau 4,7,12-16 atau 2n-1)
|
||||
|
||||
|
||||
#getPdfInfo
|
||||
@@ -730,7 +733,7 @@ pageLayout.submit=Kirim
|
||||
scalePages.title=Sesuaikan skala halaman
|
||||
scalePages.header=Sesuaikan skala halaman
|
||||
scalePages.pageSize=Ukuran halaman dokumen.
|
||||
scalePages.keepPageSize=Original Size
|
||||
scalePages.keepPageSize=Ukuran Asli
|
||||
scalePages.scaleFactor=Tingkat zoom (potong) halaman.
|
||||
scalePages.submit=Kirim
|
||||
|
||||
@@ -743,13 +746,14 @@ certSign.jksNote=Catatan: Jika tipe sertifikat Anda tidak terdaftar di bawah, si
|
||||
certSign.selectKey=Pilih Berkas Kunci Pribadi Anda (format PKCS # 8, bisa .pem atau .der):
|
||||
certSign.selectCert=Pilih Berkas Sertifikat Anda (format X.509, bisa .pem atau .der):
|
||||
certSign.selectP12=Pilih Berkas Keystore PKCS #12 Anda (.p12 atau .pfx) (Opsional, Jika disediakan, berkas tersebut harus berisi kunci pribadi dan sertifikat Anda):
|
||||
certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore):
|
||||
certSign.selectJKS=Pilih Berkas Java Keystore File (.jks atau .keystore):
|
||||
certSign.certType=Jenis Sertifikat
|
||||
certSign.password=Masukkan Kata Sandi Kunci atau Kunci Pribadi Anda (Jika Ada):
|
||||
certSign.showSig=Tampilkan Tanda Tangan
|
||||
certSign.reason=Alasan
|
||||
certSign.location=Lokasi
|
||||
certSign.name=Nama
|
||||
certSign.showLogo=Tampilkan Logo
|
||||
certSign.submit=Tanda tangani PDF
|
||||
|
||||
|
||||
@@ -784,9 +788,9 @@ compare.highlightColor.2=Warna Sorotan 2:
|
||||
compare.document.1=Dokumen 1
|
||||
compare.document.2=Dokumen 2
|
||||
compare.submit=Bandingkan
|
||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
||||
compare.complex.message=Satu atau kedua dokumen yang disediakan adalah file besar, keakuratan perbandingan mungkin berkurang
|
||||
compare.large.file.message=Satu atau Kedua dokumen yang disediakan terlalu besar untuk diproses
|
||||
compare.no.text.message=Satu atau kedua PDF yang dipilih tidak memiliki konten teks. Pilih PDF dengan teks untuk perbandingan.
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Buku dan Komik ke PDF
|
||||
@@ -809,12 +813,17 @@ sign.draw=Gambar Tanda Tangan
|
||||
sign.text=Masukan Teks
|
||||
sign.clear=Hapus
|
||||
sign.add=Tambah
|
||||
sign.saved=Saved Signatures
|
||||
sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.saved=Tanda Tangan Disimpan
|
||||
sign.save=Simpan Tanda Tangan
|
||||
sign.personalSigs=Tanda Tangan Pribadi
|
||||
sign.sharedSigs=Tanda Tangan Berbagi
|
||||
sign.noSavedSigs=Tidak ditemukan tanda tangan yang disimpan
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Perbaiki
|
||||
@@ -825,7 +834,7 @@ repair.submit=Perbaiki
|
||||
#flatten
|
||||
flatten.title=Ratakan
|
||||
flatten.header=Ratakan PDF
|
||||
flatten.flattenOnlyForms=Flatten only forms
|
||||
flatten.flattenOnlyForms=Ratakan hanya formulir
|
||||
flatten.submit=Ratakan
|
||||
|
||||
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=Mode OCR
|
||||
ocr.selectText.11=Hapus gambar setelah OCR (Menghapus Semua gambar, hanya berguna jika merupakan bagian dari langkah konversi)
|
||||
ocr.selectText.12=Jenis Render (Lanjutan)
|
||||
ocr.help=Silakan baca dokumentasi ini tentang cara menggunakan ini untuk bahasa lain dan/atau penggunaan yang tidak ada di docker
|
||||
ocr.credit=Layanan ini menggunakan OCRmyPDF dan Tesseract untuk OCR.
|
||||
ocr.credit=Layanan ini menggunakan qpdf dan Tesseract untuk OCR.
|
||||
ocr.submit=Memproses PDF dengan OCR
|
||||
|
||||
|
||||
@@ -867,7 +876,7 @@ ocr.submit=Memproses PDF dengan OCR
|
||||
extractImages.title=Ekstrak Gambar
|
||||
extractImages.header=Mengekstrak Gambar
|
||||
extractImages.selectText=Pilih format gambar yang akan dikonversi
|
||||
extractImages.allowDuplicates=Save duplicate images
|
||||
extractImages.allowDuplicates=Simpan Gambar Duplikat
|
||||
extractImages.submit=Ekstrak
|
||||
|
||||
|
||||
@@ -875,7 +884,7 @@ extractImages.submit=Ekstrak
|
||||
fileToPDF.title=Berkas ke PDF
|
||||
fileToPDF.header=Mengonversi berkas apa pun ke PDF
|
||||
fileToPDF.credit=Layanan ini menggunakan LibreOffice dan Unoconv untuk konversi berkas.
|
||||
fileToPDF.supportedFileTypesInfo=Supported File types
|
||||
fileToPDF.supportedFileTypesInfo=Jenis File Dukungan
|
||||
fileToPDF.supportedFileTypes=Jenis berkas yang didukung harus mencakup yang di bawah ini, namun untuk daftar lengkap format yang didukung, silakan lihat dokumentasi LibreOffice
|
||||
fileToPDF.submit=Konversi ke PDF
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Konversi ke PDF
|
||||
#compress
|
||||
compress.title=Kompres
|
||||
compress.header=Kompres PDF
|
||||
compress.credit=Layanan ini menggunakan Ghostscript untuk Kompresi/Optimalisasi PDF.
|
||||
compress.credit=Layanan ini menggunakan qpdf untuk Kompresi/Optimalisasi PDF.
|
||||
compress.selectText.1=Mode Manual - Dari 1 hingga 4
|
||||
compress.selectText.2=Tingkat Optimalisasi:
|
||||
compress.selectText.3=4 (Buruk untuk gambar teks)
|
||||
@@ -905,7 +914,7 @@ merge.title=Gabungkan
|
||||
merge.header=Gabungkan beberapa PDFs (2+)
|
||||
merge.sortByName=Sortir berdasarkan nama
|
||||
merge.sortByDate=Sortir berdasrkan tanggal
|
||||
merge.removeCertSign=Remove digital signature in the merged file?
|
||||
merge.removeCertSign=Hapus tanda tangan digital dalam file yang dicampur?
|
||||
merge.submit=Gabungkan
|
||||
|
||||
|
||||
@@ -924,13 +933,34 @@ pdfOrganiser.mode.7=Hapus Pertama
|
||||
pdfOrganiser.mode.8=Hapus Terakhir
|
||||
pdfOrganiser.mode.9=Hapus Pertama dan Terakhir
|
||||
pdfOrganiser.mode.10=Penggabungan Genap-Ganjil
|
||||
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||
pdfOrganiser.placeholder=(misalnya 1,3,2 atau 4-8,2,10-12 atau 2n-1)
|
||||
|
||||
|
||||
#multiTool
|
||||
multiTool.title=Alat Multi PDF
|
||||
multiTool.header=Alat Multi PDF
|
||||
multiTool.uploadPrompts=File Name
|
||||
multiTool.uploadPrompts=Nama Berkas
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=Lihat PDF
|
||||
@@ -941,7 +971,7 @@ pageRemover.title=Penghapus Halaman
|
||||
pageRemover.header=Penghapus Halaman PDF
|
||||
pageRemover.pagesToDelete=Halaman yang akan dihapus (Masukkan daftar nomor halaman yang dipisahkan dengan koma) :
|
||||
pageRemover.submit=Hapus Halaman
|
||||
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
|
||||
pageRemover.placeholder=(misalnya 1,2,6 atau 1-10,15-30)
|
||||
|
||||
|
||||
#rotate
|
||||
@@ -1026,13 +1056,13 @@ watermark.selectText.3=Ukuran Huruf:
|
||||
watermark.selectText.4=Rotasi (0-360):
|
||||
watermark.selectText.5=widthSpacer (Spasi diantara setiap watermark horisontal):
|
||||
watermark.selectText.6=heightSpacer (Spasi diantara setiap watermark vertikal):
|
||||
watermark.selectText.7=Opacity (0% - 100%):
|
||||
watermark.selectText.7=Kejernihan (0% - 100%):
|
||||
watermark.selectText.8=Tipe Watermark:
|
||||
watermark.selectText.9=Gambar Watermark:
|
||||
watermark.selectText.10=Convert PDF to PDF-Image
|
||||
watermark.selectText.10=Konversi PDF ke PDF-Image
|
||||
watermark.submit=Tambahkan Watermark
|
||||
watermark.type.1=Text
|
||||
watermark.type.2=Image
|
||||
watermark.type.1=Teks
|
||||
watermark.type.2=Gambar
|
||||
|
||||
|
||||
#Change permissions
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=Ganti
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF Ke PDF/A
|
||||
pdfToPDFA.header=PDF ke PDF/A
|
||||
pdfToPDFA.credit=Layanan ini menggunakan ghostscript untuk konversi PDF/A.
|
||||
pdfToPDFA.credit=Layanan ini menggunakan qpdf untuk konversi PDF/A.
|
||||
pdfToPDFA.submit=Konversi
|
||||
pdfToPDFA.tip=Saat ini tidak dapat digunakan untuk beberapa input sekaligus
|
||||
pdfToPDFA.outputFormat=Format keluaran
|
||||
|
||||
@@ -27,7 +27,7 @@ bored=Stanco di aspettare?
|
||||
alphabet=Alfabeto
|
||||
downloadPdf=Scarica PDF
|
||||
text=Testo
|
||||
font=Font
|
||||
font=Fonte
|
||||
selectFillter=-- Seleziona --
|
||||
pageNum=Numero pagina
|
||||
sizes.small=Piccolo
|
||||
@@ -79,8 +79,9 @@ info=Info
|
||||
pro=Pro
|
||||
page=Pagina
|
||||
pages=Pagine
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
loading=Caricamento...
|
||||
addToDoc=Aggiungi al documento
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Informativa sulla privacy
|
||||
legal.terms=Termini e Condizioni
|
||||
@@ -110,7 +111,7 @@ pipelineOptions.pipelineNamePrompt=Inserisci qui il nome della pipeline
|
||||
pipelineOptions.selectOperation=Seleziona operazione
|
||||
pipelineOptions.addOperationButton=Aggiungi operazione
|
||||
pipelineOptions.pipelineHeader=Pipeline:
|
||||
pipelineOptions.saveButton=Download
|
||||
pipelineOptions.saveButton=Salva
|
||||
pipelineOptions.validateButton=Convalidare
|
||||
|
||||
########################
|
||||
@@ -141,6 +142,7 @@ navbar.language=Lingue
|
||||
navbar.settings=Impostazioni
|
||||
navbar.allTools=Strumenti
|
||||
navbar.multiTool=Strumenti multipli
|
||||
navbar.search=Cerca
|
||||
navbar.sections.organize=Organizza
|
||||
navbar.sections.convertTo=Converti in PDF
|
||||
navbar.sections.convertFrom=Converti da PDF
|
||||
@@ -246,6 +248,7 @@ database.fileNullOrEmpty=Il file non deve essere nullo o vuoto
|
||||
database.failedImportFile=Importazione file non riuscita
|
||||
|
||||
session.expired=La tua sessione è scaduta. Aggiorna la pagina e riprova.
|
||||
session.refreshPage=Aggiorna pagina
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=Mostra firma
|
||||
certSign.reason=Motivo
|
||||
certSign.location=Posizione
|
||||
certSign.name=Nome
|
||||
certSign.showLogo=Mostra Logo
|
||||
certSign.submit=Firma PDF
|
||||
|
||||
|
||||
@@ -784,9 +788,9 @@ compare.highlightColor.2=Evidenzia colore 2:
|
||||
compare.document.1=Documento 1
|
||||
compare.document.2=Documento 2
|
||||
compare.submit=Compara
|
||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
||||
compare.complex.message=Uno o entrambi i documenti forniti sono file di grandi dimensioni, l'accuratezza del confronto potrebbe risultare ridotta
|
||||
compare.large.file.message=Uno o entrambi i documenti forniti sono troppo grandi per essere elaborati
|
||||
compare.no.text.message=Uno o entrambi i PDF selezionati non hanno contenuto di testo. Si prega di scegliere PDF con testo per il confronto.
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Libri e fumetti in PDF
|
||||
@@ -809,12 +813,17 @@ sign.draw=Disegna Firma
|
||||
sign.text=Testo
|
||||
sign.clear=Cancella
|
||||
sign.add=Aggiungi
|
||||
sign.saved=Saved Signatures
|
||||
sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.saved=Firme salvate
|
||||
sign.save=Firma salvata
|
||||
sign.personalSigs=Firme personali
|
||||
sign.sharedSigs=Firme condivise
|
||||
sign.noSavedSigs=Nessuna firma salvata trovata
|
||||
sign.addToAll=Aggiungi a tutte le pagine
|
||||
sign.delete=Elimina
|
||||
sign.first=Prima pagina
|
||||
sign.last=Ultima pagina
|
||||
sign.next=Prossima pagina
|
||||
sign.previous=Pagina precedente
|
||||
|
||||
#repair
|
||||
repair.title=Ripara
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=Modalità OCR
|
||||
ocr.selectText.11=Rimuovi immagini dopo la scansione (Rimuove TUTTE le immagini, utile solo come parte del processo di conversione)
|
||||
ocr.selectText.12=Modalità di rendering (avanzato)
|
||||
ocr.help=Per favore leggi la documentazione su come usare il programma per altri linguaggi e/o uso non in Docker
|
||||
ocr.credit=Questo servizio utilizza OCRmyPDF e Tesseract per l'OCR.
|
||||
ocr.credit=Questo servizio utilizza qpdf e Tesseract per l'OCR.
|
||||
ocr.submit=Scansiona testo nel PDF con OCR
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Converti in PDF
|
||||
#compress
|
||||
compress.title=Comprimi
|
||||
compress.header=Comprimi PDF
|
||||
compress.credit=Questo servizio utilizza Ghostscript per la compressione/ottimizzazione dei PDF.
|
||||
compress.credit=Questo servizio utilizza qpdf per la compressione/ottimizzazione dei PDF.
|
||||
compress.selectText.1=Modalità manuale - Da 1 a 4
|
||||
compress.selectText.2=Livello di ottimizzazione:
|
||||
compress.selectText.3=4 (Terribile per le immagini di testo)
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1)
|
||||
multiTool.title=Multifunzione PDF
|
||||
multiTool.header=Multifunzione PDF
|
||||
multiTool.uploadPrompts=Nome file
|
||||
multiTool.selectAll=Seleziona tutto
|
||||
multiTool.deselectAll=Deseleziona tutto
|
||||
multiTool.selectPages=Seleziona pagina
|
||||
multiTool.selectedPages=Seleziona pagine
|
||||
multiTool.page=Pagina
|
||||
multiTool.deleteSelected=Elimina selezionata
|
||||
multiTool.downloadAll=Esporta
|
||||
multiTool.downloadSelected=Esporta selezionata
|
||||
|
||||
multiTool.insertPageBreak=Inserisci interruzione di pagina
|
||||
multiTool.addFile=Aggiungi file
|
||||
multiTool.rotateLeft=Ruota a sinistra
|
||||
multiTool.rotateRight=Ruota a destra
|
||||
multiTool.split=Dividi
|
||||
multiTool.moveLeft=Sposta a sinistra
|
||||
multiTool.moveRight=Sposta a destra
|
||||
multiTool.delete=Elimina
|
||||
multiTool.dragDropMessage=Pagina(e) selezionata(e)
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=Questa funzione è disponibile anche nella nostra <a href="{0}">pagina multi-strumento</a>. Scoprila per un'interfaccia utente pagina per pagina migliorata e funzionalità aggiuntive!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=Visualizza PDF
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=Cambia proprietà
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=Da PDF a PDF/A
|
||||
pdfToPDFA.header=Da PDF a PDF/A
|
||||
pdfToPDFA.credit=Questo servizio utilizza Ghostscript per la conversione in PDF/A.
|
||||
pdfToPDFA.credit=Questo servizio utilizza qpdf per la conversione in PDF/A.
|
||||
pdfToPDFA.submit=Converti
|
||||
pdfToPDFA.tip=Attualmente non funziona per più input contemporaneamente
|
||||
pdfToPDFA.outputFormat=Formato di output
|
||||
|
||||
@@ -81,6 +81,7 @@ page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=プライバシーポリシー
|
||||
legal.terms=利用規約
|
||||
@@ -141,6 +142,7 @@ navbar.language=言語
|
||||
navbar.settings=設定
|
||||
navbar.allTools=ツール
|
||||
navbar.multiTool=マルチツール
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=整理
|
||||
navbar.sections.convertTo=PDFへ変換
|
||||
navbar.sections.convertFrom=PDFから変換
|
||||
@@ -246,6 +248,7 @@ database.fileNullOrEmpty=ファイルは null または空であってはなり
|
||||
database.failedImportFile=ファイルのインポートに失敗
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=署名を表示
|
||||
certSign.reason=理由
|
||||
certSign.location=場所
|
||||
certSign.name=名前
|
||||
certSign.showLogo=Show Logo
|
||||
certSign.submit=PDFに署名
|
||||
|
||||
|
||||
@@ -814,7 +818,12 @@ sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=修復
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=OCRモード
|
||||
ocr.selectText.11=OCR後に画像を削除する (すべての画像を削除します。変換ステップの一部である場合にのみ有効です)。
|
||||
ocr.selectText.12=レンダリングタイプ (高度)
|
||||
ocr.help=他の言語でこれを使用する方法やDocker以外で使用する方法についてはこのドキュメントをお読みください。
|
||||
ocr.credit=本サービスにはOCRにOCRmyPDFとTesseractを使用しています。
|
||||
ocr.credit=本サービスにはOCRにqpdfとTesseractを使用しています。
|
||||
ocr.submit=OCRでPDFを処理する
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=PDFを変換
|
||||
#compress
|
||||
compress.title=圧縮
|
||||
compress.header=PDFを圧縮
|
||||
compress.credit=本サービスはPDFの圧縮/最適化にGhostscriptを使用しています。
|
||||
compress.credit=本サービスはPDFの圧縮/最適化にqpdfを使用しています。
|
||||
compress.selectText.1=手動モード - 1 から 4
|
||||
compress.selectText.2=品質レベル:
|
||||
compress.selectText.3=4 (テキスト画像は最悪)
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(例:1,3,2または4-8,2,10-12または2n-1)
|
||||
multiTool.title=PDFマルチツール
|
||||
multiTool.header=PDFマルチツール
|
||||
multiTool.uploadPrompts=ファイル名
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=PDFを表示
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=変更
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDFをPDF/Aに変換
|
||||
pdfToPDFA.header=PDFをPDF/Aに変換
|
||||
pdfToPDFA.credit=本サービスはPDF/Aの変換にghostscriptを使用しています。
|
||||
pdfToPDFA.credit=本サービスはPDF/Aの変換にqpdfを使用しています。
|
||||
pdfToPDFA.submit=変換
|
||||
pdfToPDFA.tip=現在、一度に複数の入力に対して機能しません
|
||||
pdfToPDFA.outputFormat=Output format
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
###########
|
||||
# the direction that the language is written (ltr = left to right, rtl = right to left)
|
||||
language.direction=ltr
|
||||
addPageNumbers.fontSize=Font Size
|
||||
addPageNumbers.fontName=Font Name
|
||||
addPageNumbers.fontSize=폰트 크기
|
||||
addPageNumbers.fontName=폰트 이름
|
||||
pdfPrompt=PDF 파일 선택
|
||||
multiPdfPrompt=여러 PDF 파일 선택
|
||||
multiPdfDropPrompt=사용할 모든 PDF 문서를 선택(또는 드래그 앤 드롭)합니다
|
||||
@@ -47,7 +47,7 @@ green=녹색
|
||||
blue=파랑
|
||||
custom=관습...
|
||||
WorkInProgess=작업 진행 중, 작동하지 않거나 버그가 있을 수 있음, 문제가 있으면 보고하십시오!
|
||||
poweredBy=Powered by
|
||||
poweredBy=제공
|
||||
yes=예
|
||||
no=아니요
|
||||
changedCredsMessage=계정 정보 변경 성공!
|
||||
@@ -56,15 +56,15 @@ userNotFoundMessage=사용자를 찾을 수 없습니다.
|
||||
incorrectPasswordMessage=현재 비밀번호가 틀립니다.
|
||||
usernameExistsMessage=새 사용자명이 이미 존재합니다.
|
||||
invalidUsernameMessage=잘못된 사용자 이름입니다. 사용자 이름에는 문자, 숫자 및 다음 특수 문자(@._+-)만 포함할 수 있거나 유효한 이메일 주소여야 합니다.
|
||||
invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end.
|
||||
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||
invalidPasswordMessage=비밀번호는 빈칸일 수 없습니다. 또한 시작이나 끝에 공백을 가질 수 없습니다.
|
||||
confirmPasswordErrorMessage=새 비밀번호와 새 비밀번호 확인이 일치하지 않습니다.
|
||||
deleteCurrentUserMessage=현재 로그인한 사용자를 삭제할 수 없습니다.
|
||||
deleteUsernameExistsMessage=사용자 이름이 존재하지 않으며 삭제할 수 없습니다.
|
||||
downgradeCurrentUserMessage=현재 사용자의 역할을 다운그레이드할 수 없습니다
|
||||
disabledCurrentUserMessage=The current user cannot be disabled
|
||||
disabledCurrentUserMessage=현재 사용자는 비활성화할 수 없습니다
|
||||
downgradeCurrentUserLongMessage=현재 사용자의 역할을 다운그레이드할 수 없습니다. 따라서 현재 사용자는 표시되지 않습니다.
|
||||
userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user.
|
||||
userAlreadyExistsWebMessage=The user already exists as an web user.
|
||||
userAlreadyExistsOAuthMessage=이미 OAuth2 사용자로 등록되어 있습니다.
|
||||
userAlreadyExistsWebMessage=이미 웹 사용자로 등록되어 있습니다.
|
||||
error=오류
|
||||
oops=어머나!
|
||||
help=도움말
|
||||
@@ -75,18 +75,19 @@ visitGithub=GitHub 저장소 방문하기
|
||||
donate=기부하기
|
||||
color=색상
|
||||
sponsor=스폰서
|
||||
info=Info
|
||||
pro=Pro
|
||||
page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
info=정보
|
||||
pro=프로
|
||||
page=페이지
|
||||
pages=페이지
|
||||
loading=로딩 중...
|
||||
addToDoc=문서에 추가
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Privacy Policy
|
||||
legal.terms=Terms and Conditions
|
||||
legal.accessibility=Accessibility
|
||||
legal.cookie=Cookie Policy
|
||||
legal.impressum=Impressum
|
||||
legal.privacy=개인 정보 정책
|
||||
legal.terms=이용 약관
|
||||
legal.accessibility=접근성
|
||||
legal.cookie=쿠키 정책
|
||||
legal.impressum=임프레스무
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
@@ -98,7 +99,7 @@ pipeline.defaultOption=관습
|
||||
pipeline.submitButton=전송
|
||||
pipeline.help=파이프라인 도움말
|
||||
pipeline.scanHelp=폴더 스캔 도움말
|
||||
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||
pipeline.deletePrompt=프로젝트 파이프라인을 삭제하시겠습니까?
|
||||
|
||||
######################
|
||||
# Pipeline Options #
|
||||
@@ -116,45 +117,46 @@ pipelineOptions.validateButton=확인
|
||||
########################
|
||||
# ENTERPRISE EDITION #
|
||||
########################
|
||||
enterpriseEdition.button=Upgrade to Pro
|
||||
enterpriseEdition.warning=This feature is only available to Pro users.
|
||||
enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features.
|
||||
enterpriseEdition.button=프로페셔널 버전으로 업그레이드
|
||||
enterpriseEdition.warning=이 기능은 프로 버전 사용자만 이용 가능합니다.
|
||||
enterpriseEdition.yamlAdvert=스털링 PDF 프로버전은 YAML 구성 파일과 기타 SSO 기능을 지원합니다.
|
||||
enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro
|
||||
|
||||
|
||||
#################
|
||||
# Analytics #
|
||||
#################
|
||||
analytics.title=Do you want make Stirling PDF better?
|
||||
analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.
|
||||
analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.
|
||||
analytics.enable=Enable analytics
|
||||
analytics.disable=Disable analytics
|
||||
analytics.settings=You can change the settings for analytics in the config/settings.yml file
|
||||
analytics.title=스털링 PDF를 더 나은 서비스로 발전시키고 싶으신가요?
|
||||
analytics.paragraph1=스털링 PDF는 사용자 정보 및 파일 내용을 추적하지 않는 제품 개선을 위한 옵인 애널리틱스 기능을 제공합니다.
|
||||
analytics.paragraph2=애널리틱스 기능을 활성화해 주셔서 스<>털링-PDF가 성장하고 우리 사용자를 더 잘 이해할 수 있도록 도와주세요.
|
||||
analytics.enable=애널리틱스 활성화
|
||||
analytics.disable=애널리틱스 비활성화
|
||||
analytics.settings=애널리틱스 설정은 config/settings.yml 파일에서 변경하실 수 있습니다.
|
||||
|
||||
#############
|
||||
# NAVBAR #
|
||||
#############
|
||||
navbar.favorite=Favorites
|
||||
navbar.favorite=즐겨찾기
|
||||
navbar.darkmode=다크 모드
|
||||
navbar.language=Languages
|
||||
navbar.language=언어
|
||||
navbar.settings=설정
|
||||
navbar.allTools=Tools
|
||||
navbar.allTools=도구
|
||||
navbar.multiTool=Multi Tools
|
||||
navbar.sections.organize=Organize
|
||||
navbar.sections.convertTo=Convert to PDF
|
||||
navbar.sections.convertFrom=Convert from PDF
|
||||
navbar.sections.security=Sign & Security
|
||||
navbar.sections.advance=Advanced
|
||||
navbar.sections.edit=View & Edit
|
||||
navbar.sections.popular=Popular
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=조직
|
||||
navbar.sections.convertTo=PDF로 변환
|
||||
navbar.sections.convertFrom=PDF에서 변환
|
||||
navbar.sections.security=서명 & 보안
|
||||
navbar.sections.advance=고급
|
||||
navbar.sections.edit=보기 & 편집
|
||||
navbar.sections.popular=인기
|
||||
|
||||
#############
|
||||
# SETTINGS #
|
||||
#############
|
||||
settings.title=설정
|
||||
settings.update=업데이트 가능
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.updateAvailable={0}는 현재 설치된 버전입니다. 새로운 버전 ({1})이 있습니다.
|
||||
settings.appVersion=앱 버전:
|
||||
settings.downloadOption.title=다운로드 옵션 선택 (zip 파일이 아닌 단일 파일 다운로드 시):
|
||||
settings.downloadOption.1=현재 창에서 열기
|
||||
@@ -163,9 +165,9 @@ settings.downloadOption.3=다운로드
|
||||
settings.zipThreshold=다운로드한 파일 수가 초과된 경우 파일 압축하기
|
||||
settings.signOut=로그아웃
|
||||
settings.accountSettings=계정 설정
|
||||
settings.bored.help=Enables easter egg game
|
||||
settings.cacheInputs.name=Save form inputs
|
||||
settings.cacheInputs.help=Enable to store previously used inputs for future runs
|
||||
settings.bored.help=알라딘 게임을 활성화합니다
|
||||
settings.cacheInputs.name=입력 저장
|
||||
settings.cacheInputs.help=사용한 입력을 다음 실행에 저장하기 위해 활성화
|
||||
|
||||
changeCreds.title=계정 정보 변경
|
||||
changeCreds.header=계정 정보 업데이트
|
||||
@@ -204,9 +206,9 @@ adminUserSettings.header=사용자 관리
|
||||
adminUserSettings.admin=관리자
|
||||
adminUserSettings.user=사용자
|
||||
adminUserSettings.addUser=새 사용자 추가
|
||||
adminUserSettings.deleteUser=Delete User
|
||||
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||
adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled?
|
||||
adminUserSettings.deleteUser=유저 삭제
|
||||
adminUserSettings.confirmDeleteUser=이 유저를 삭제하시겠습니까?
|
||||
adminUserSettings.confirmChangeUserStatus=이 유저의 상태를 변경하시겠습니까?
|
||||
adminUserSettings.usernameInfo=사용자 이름은 문자, 숫자, 특수 문자 @._+-만 포함할 수 있으며 유효한 이메일 주소여야 합니다.
|
||||
adminUserSettings.roles=역할
|
||||
adminUserSettings.role=역할
|
||||
@@ -219,33 +221,34 @@ adminUserSettings.internalApiUser=내부 API 사용자
|
||||
adminUserSettings.forceChange=다음 로그인 때 사용자명과 비밀번호를 변경하도록 강제
|
||||
adminUserSettings.submit=사용자 저장
|
||||
adminUserSettings.changeUserRole=사용자의 역할 변경
|
||||
adminUserSettings.authenticated=Authenticated
|
||||
adminUserSettings.editOwnProfil=Edit own profile
|
||||
adminUserSettings.enabledUser=enabled user
|
||||
adminUserSettings.disabledUser=disabled user
|
||||
adminUserSettings.activeUsers=Active Users:
|
||||
adminUserSettings.disabledUsers=Disabled Users:
|
||||
adminUserSettings.totalUsers=Total Users:
|
||||
adminUserSettings.lastRequest=Last Request
|
||||
adminUserSettings.authenticated=인증됨
|
||||
adminUserSettings.editOwnProfil=자신의 프로필 편집
|
||||
adminUserSettings.enabledUser=활성화된 사용자
|
||||
adminUserSettings.disabledUser=비활성화된 사용자
|
||||
adminUserSettings.activeUsers=활성화된 사용자:
|
||||
adminUserSettings.disabledUsers=비활성화된 사용자:
|
||||
adminUserSettings.totalUsers=총 사용자 수:
|
||||
adminUserSettings.lastRequest=최근 요청
|
||||
|
||||
|
||||
database.title=Database Import/Export
|
||||
database.header=Database Import/Export
|
||||
database.fileName=File Name
|
||||
database.creationDate=Creation Date
|
||||
database.fileSize=File Size
|
||||
database.deleteBackupFile=Delete Backup File
|
||||
database.importBackupFile=Import Backup File
|
||||
database.downloadBackupFile=Download Backup File
|
||||
database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application.
|
||||
database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention.
|
||||
database.submit=Import Backup
|
||||
database.importIntoDatabaseSuccessed=Import into database successed
|
||||
database.title=데이터베이스 내보내기/임포트
|
||||
database.header=데이터베이스 내보내기/임포트
|
||||
database.fileName=파일 이름
|
||||
database.creationDate=생성 날짜
|
||||
database.fileSize=파일 크기
|
||||
database.deleteBackupFile=백업 파일 삭제
|
||||
database.importBackupFile=백업 파일 가져오기
|
||||
database.downloadBackupFile=백업 파일 다운로드
|
||||
database.info_1=데이터를 가져올 때 적절한 구조가 중요합니다. 자신이 무엇을 하는지 확실하지 않다면 전문가의 조언과 지원을 청하는 것이 좋습니다. 구조에 오류가 있으면 애플리케이션 기능 실패나 애플리케이션이 완전히 작동하지 못하게 되는 등의 문제를 초래할 수 있습니다.
|
||||
database.info_2=업로드 시 파일 이름은 중요하지 않습니다. 후에 backup_user_yyyyMMddHHmm.sql 형식으로 다시 지정되어 일관된 이름 규칙을 유지합니다.
|
||||
database.submit=백업 가져오기
|
||||
database.importIntoDatabaseSuccessed=데이터베이스에 성공적으로 가져왔습니다
|
||||
database.fileNotFound=File not Found
|
||||
database.fileNullOrEmpty=File must not be null or empty
|
||||
database.fileNullOrEmpty=파일은 null이나 빈 상태로 될 수 없습니다
|
||||
database.failedImportFile=Failed Import File
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.expired=세션이 만료되었습니다. 페이지를 새로 고침하고 다시 시도해 주세요.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -256,7 +259,7 @@ home.searchBar=기능 검색...
|
||||
|
||||
home.viewPdf.title=PDF 뷰어
|
||||
home.viewPdf.desc=PDF 문서을 보고 주석을 달거나, 텍스트 또는 이미지를 추가합니다.
|
||||
viewPdf.tags=view,read,annotate,text,image
|
||||
viewPdf.tags=보기, 읽기, 표시, 텍스트, 이미지
|
||||
|
||||
home.multiTool.title=PDF 멀티 툴
|
||||
home.multiTool.desc=PDF 문서의 페이지를 병합, 회전, 재배열, 제거합니다.
|
||||
@@ -264,96 +267,96 @@ 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
|
||||
merge.tags=결합, 페이지 작업, 뒷단, 서버 측
|
||||
|
||||
home.split.title=분할
|
||||
home.split.desc=하나의 PDF 문서을 여러 개의 PDF 문서로 분할합니다.
|
||||
split.tags=Page operations,divide,Multi Page,cut,server side
|
||||
split.tags=페이지 작업, 분할, 멀티페이지, 자르기, 서버 측
|
||||
|
||||
home.rotate.title=회전
|
||||
home.rotate.desc=PDF 페이지를 회전합니다.
|
||||
rotate.tags=server side
|
||||
rotate.tags=서버 측
|
||||
|
||||
|
||||
home.imageToPdf.title=이미지를 PDF로
|
||||
home.imageToPdf.desc=이미지(PNG, JPEG, GIF)를 PDF 문서로 변환합니다.
|
||||
imageToPdf.tags=conversion,img,jpg,picture,photo
|
||||
imageToPdf.tags=변환, 이미지, jpg, 사진, 사진
|
||||
|
||||
home.pdfToImage.title=PDF를 이미지로
|
||||
home.pdfToImage.desc=PDF 문서을 이미지(PNG, JPEG, GIF)로 변환합니다.
|
||||
pdfToImage.tags=conversion,img,jpg,picture,photo
|
||||
pdfToImage.tags=변환, 이미지, jpg, 사진, 사진
|
||||
|
||||
home.pdfOrganiser.title=정렬
|
||||
home.pdfOrganiser.desc=PDF 문서의 각 페이지를 원하는 순서대로 재배열하거나 제거합니다.
|
||||
pdfOrganiser.tags=duplex,even,odd,sort,move
|
||||
pdfOrganiser.tags=복사, 짝수 페이지, 홀수 페이지, 정렬, 이동
|
||||
|
||||
|
||||
home.addImage.title=사진 추가
|
||||
home.addImage.desc=PDF 문서의 설정된 위치에 이미지를 추가합니다. (개발 중)
|
||||
addImage.tags=img,jpg,picture,photo
|
||||
addImage.tags=이미지, jpg, 사진, 사진
|
||||
|
||||
home.watermark.title=워터마크 추가
|
||||
home.watermark.desc=PDF 문서에 사용자 지정 워터마크를 추가합니다.
|
||||
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
|
||||
watermark.tags=텍스트, 반복, 라벨, 소유권, 상표, 이미지, jpg, 사진, 사진
|
||||
|
||||
home.permissions.title=권한 변경
|
||||
home.permissions.desc=PDF 문서의 권한을 변경합니다.
|
||||
permissions.tags=read,write,edit,print
|
||||
permissions.tags=읽기, 쓰기, 편집, 인쇄
|
||||
|
||||
|
||||
home.removePages.title=제거
|
||||
home.removePages.desc=PDF 문서에서 원치 않는 페이지를 제거합니다.
|
||||
removePages.tags=Remove pages,delete pages
|
||||
removePages.tags=페이지 제거, 삭제
|
||||
|
||||
home.addPassword.title=암호 추가
|
||||
home.addPassword.desc=PDF 문서를 비밀번호로 암호화합니다.
|
||||
addPassword.tags=secure,security
|
||||
addPassword.tags=보안, 안전
|
||||
|
||||
home.removePassword.title=비밀번호 제거
|
||||
home.removePassword.desc=PDF 문서에서 비밀번호를 제거합니다.
|
||||
removePassword.tags=secure,Decrypt,security,unpassword,delete password
|
||||
removePassword.tags=보안, 복호화, 안전, 비밀번호 해제, 비밀번호 삭제
|
||||
|
||||
home.compressPdfs.title=압축
|
||||
home.compressPdfs.desc=파일 크기를 줄이기 위해 PDF 문서를 압축합니다.
|
||||
compressPdfs.tags=squish,small,tiny
|
||||
compressPdfs.tags=압축, 작게 만드는
|
||||
|
||||
|
||||
home.changeMetadata.title=메타데이터 변경
|
||||
home.changeMetadata.desc=PDF 문서의 메타데이터를 수정/제거/추가합니다.
|
||||
changeMetadata.tags=Title,author,date,creation,time,publisher,producer,stats
|
||||
changeMetadata.tags=제목, 저자, 날짜, 생성 시간, 출판사, 제작자, 통계
|
||||
|
||||
home.fileToPDF.title=파일을 PDF로 변환
|
||||
home.fileToPDF.desc=거의 모든 파일을 PDF로 변환합니다(DOCX, PNG, XLS, PPT, TXT 등)
|
||||
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
|
||||
fileToPDF.tags=변환, 포맷, 문서, 사진, 슬라이드, 텍스트, 변환, 오피스,-docs, word, excel, powerpoint
|
||||
|
||||
home.ocr.title=OCR / 깔끔하게 스캔
|
||||
home.ocr.desc=깔끔하게 스캔한 뒤, PDF 내의 이미지에서 텍스트를 감지하여 텍스트로 다시 추가합니다.
|
||||
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
|
||||
ocr.tags=인식, 텍스트, 이미지, 스캔, 읽기, 식별, 감지, 편집 가능한
|
||||
|
||||
|
||||
home.extractImages.title=이미지 추출
|
||||
home.extractImages.desc=PDF에서 모든 이미지를 추출하여 zip으로 저장합니다.
|
||||
extractImages.tags=picture,photo,save,archive,zip,capture,grab
|
||||
extractImages.tags=사진, 스크린샷 저장, 압축, 캡처, 잡아두기
|
||||
|
||||
home.pdfToPDFA.title=PDF를 PDF/A로 변환
|
||||
home.pdfToPDFA.desc=장기 보관을 위해 PDF 문서를 PDF/A 문서로 변환합니다.
|
||||
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
|
||||
pdfToPDFA.tags=보관, 장기 보관, 표준화, 변환, 기록 보존
|
||||
|
||||
home.PDFToWord.title=PDF를 Word로
|
||||
home.PDFToWord.desc=PDF 문서를 Word 형식으로 변환합니다. (DOC, DOCX, ODT)
|
||||
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
|
||||
PDFToWord.tags=doc, docx, odt, word, 변환, 포맷, 변환, 오피스, microsoft, docfile
|
||||
|
||||
home.PDFToPresentation.title=PDF를 프리젠테이션으로
|
||||
home.PDFToPresentation.desc=PDF 문서를 프리젠테이션 형식으로 변환합니다. (PPT, PPTX, ODP)
|
||||
PDFToPresentation.tags=slides,show,office,microsoft
|
||||
PDFToPresentation.tags=슬라이드, 강의, office, microsoft
|
||||
|
||||
home.PDFToText.title=PDF to 텍스트/RTF
|
||||
home.PDFToText.desc=PDF 문서를 텍스트 또는 RTF 형식으로 변환합니다.
|
||||
PDFToText.tags=richformat,richtextformat,rich text format
|
||||
PDFToText.tags=가이득한 텍스트 형식, 풍부한 텍스트 형식, 풍부한 텍스트 포맷
|
||||
|
||||
home.PDFToHTML.title=PDF를 HTML로
|
||||
home.PDFToHTML.desc=PDF 문서를 HTML 형식으로 변환합니다.
|
||||
PDFToHTML.tags=web content,browser friendly
|
||||
PDFToHTML.tags=웹 콘텐츠, 브라우저 친화적
|
||||
|
||||
|
||||
home.PDFToXML.title=PDF를 XML로 변환
|
||||
@@ -362,63 +365,63 @@ PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
|
||||
|
||||
home.ScannerImageSplit.title=스캔한 사진 감지/분할
|
||||
home.ScannerImageSplit.desc=스캔된 PDF 문서 내에서 여러 장의 사진을 분할합니다.
|
||||
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
|
||||
ScannerImageSplit.tags=분리, 자동 감지, 스캔, 다중 사진, 조직
|
||||
|
||||
home.sign.title=서명
|
||||
home.sign.desc=PDF 문서에 그림, 텍스트, 이미지로 서명을 추가합니다.
|
||||
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
|
||||
sign.tags=인증, 초기값, 손글씨 서명, 텍스트 서명, 이미지 서명
|
||||
|
||||
home.flatten.title=평탄화
|
||||
home.flatten.desc=PDF 문서에서 모든 상호작용 요소와 양식을 제거합니다.
|
||||
flatten.tags=static,deactivate,non-interactive,streamline
|
||||
flatten.tags=정적화, 비활성화, 비 상호작용, 절전 모드
|
||||
|
||||
home.repair.title=복구
|
||||
home.repair.desc=손상된 PDF 문서의 복구를 시도합니다.
|
||||
repair.tags=fix,restore,correction,recover
|
||||
repair.tags=수리, 복원, 수정, 회복
|
||||
|
||||
home.removeBlanks.title=빈 페이지 제거
|
||||
home.removeBlanks.desc=PDF 문서에서 빈 페이지를 감지하고 제거합니다.
|
||||
removeBlanks.tags=cleanup,streamline,non-content,organize
|
||||
removeBlanks.tags=정돈, 단순화, 콘텐츠 외부 내용 제거, 조직
|
||||
|
||||
home.removeAnnotations.title=주석 제거
|
||||
home.removeAnnotations.desc=PDF에서 모든 주석/주석을 제거합니다.
|
||||
removeAnnotations.tags=comments,highlight,notes,markup,remove
|
||||
removeAnnotations.tags=코멘트, 강조 표시, 주석, 마크업, 삭제
|
||||
|
||||
home.compare.title=비교
|
||||
home.compare.desc=2개의 PDF 문서를 비교하고 차이를 표시합니다.
|
||||
compare.tags=differentiate,contrast,changes,analysis
|
||||
compare.tags=분별, 대조, 변화, 분석
|
||||
|
||||
home.certSign.title=인증서로 서명
|
||||
home.certSign.desc=PDF 문서에 인증서 또는 키로 서명합니다. (PEM/P12)
|
||||
certSign.tags=authenticate,PEM,P12,official,encrypt
|
||||
certSign.tags=인증, PEM, P12, 공식적, 암호화
|
||||
|
||||
home.removeCertSign.title=Remove Certificate Sign
|
||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
||||
home.removeCertSign.title=서명 제거
|
||||
home.removeCertSign.desc=PDF에서 서명을 제거합니다.
|
||||
removeCertSign.tags=인증, PEM, P12, 공식적, 복호화
|
||||
|
||||
home.pageLayout.title=다중 페이지 레이아웃
|
||||
home.pageLayout.desc=PDF 문서의 여러 페이지를 한 페이지로 합칩니다.
|
||||
pageLayout.tags=merge,composite,single-view,organize
|
||||
pageLayout.tags=병합, 합성, 단일 뷰, 정리
|
||||
|
||||
home.scalePages.title=페이지 크기 및 배율 조정
|
||||
home.scalePages.desc=페이지 및 그 페이지 내용의 크기와 배율을 조정합니다.
|
||||
scalePages.tags=resize,modify,dimension,adapt
|
||||
scalePages.tags=크기 조정, 수정, 차원, 적응
|
||||
|
||||
home.pipeline.title=파이프라인 (고급 기능)
|
||||
home.pipeline.desc=파이프라인 스크립트를 사용해서 PDF 문서에 여러 동작을 수행합니다.
|
||||
pipeline.tags=automate,sequence,scripted,batch-process
|
||||
pipeline.tags=자동화, 시퀀스, 스크립트, 배치 처리
|
||||
|
||||
home.add-page-numbers.title=페이지 번호 추가
|
||||
home.add-page-numbers.desc=PDF 문서의 페이지마다, 설정한 위치에 페이지 번호를 삽입합니다.
|
||||
add-page-numbers.tags=paginate,label,organize,index
|
||||
add-page-numbers.tags=페이지 번호 추가, 레이블링, 정리, 인덱싱
|
||||
|
||||
home.auto-rename.title=자동 이름 변경
|
||||
home.auto-rename.desc=제목을 감지하여 자동으로 PDF 문서의 파일 이름을 변경합니다.
|
||||
auto-rename.tags=auto-detect,header-based,organize,relabel
|
||||
auto-rename.tags=자동 탐지, 헤더 기반, 정리, 재레이블
|
||||
|
||||
home.adjust-contrast.title=색상/대비 조정
|
||||
home.adjust-contrast.desc=PDF 문서의 대비, 채도, 밝기를 조정합니다.
|
||||
adjust-contrast.tags=color-correction,tune,modify,enhance
|
||||
adjust-contrast.tags=색상 보정, 조정, 수정, 향상
|
||||
|
||||
home.crop.title=PDF 잘라내기
|
||||
home.crop.desc=PDF 문서를 잘라내서 크기를 줄입니다. (텍스트가 그대로 유지됩니다!)
|
||||
@@ -426,29 +429,29 @@ crop.tags=trim,shrink,edit,shape
|
||||
|
||||
home.autoSplitPDF.title=자동 문서 나누기
|
||||
home.autoSplitPDF.desc=구분용 QR코드가 들어있는 페이지를 경계로 하여, 스캔된 PDF 문서를 자동으로 나눕니다.
|
||||
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
|
||||
autoSplitPDF.tags=QR 코드 기반, 분리, 스캔 분할, 정리
|
||||
|
||||
home.sanitizePdf.title=정제
|
||||
home.sanitizePdf.desc=PDF 문서에서 스크립트와 같은 요소들을 제거합니다.
|
||||
sanitizePdf.tags=clean,secure,safe,remove-threats
|
||||
sanitizePdf.tags=클린징, 보안, 안전, 위협 제거
|
||||
|
||||
home.URLToPDF.title=URL/웹사이트를 PDF로
|
||||
home.URLToPDF.desc=http(s) 웹사이트를 PDF 문서로 변환합니다.
|
||||
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
|
||||
URLToPDF.tags=웹 캡처, 페이지 저장, 웹 문서 변환, 장기 보관
|
||||
|
||||
home.HTMLToPDF.title=HTML에서 PDF로
|
||||
home.HTMLToPDF.desc=HTML 파일, 또는 ZIP 파일을 PDF로 변환합니다.
|
||||
HTMLToPDF.tags=markup,web-content,transformation,convert
|
||||
HTMLToPDF.tags=마크업, 웹 내용 변환, 변환
|
||||
|
||||
|
||||
home.MarkdownToPDF.title=Markdown에서 PDF로
|
||||
home.MarkdownToPDF.desc=마크다운 파일을 PDF 문서로 변환합니다.
|
||||
MarkdownToPDF.tags=markup,web-content,transformation,convert
|
||||
MarkdownToPDF.tags=마크업, 웹 내용 변환, 변환
|
||||
|
||||
|
||||
home.getPdfInfo.title=PDF 정보 읽기
|
||||
home.getPdfInfo.desc=PDF 문서의 가능한 모든 정보를 읽습니다.
|
||||
getPdfInfo.tags=infomation,data,stats,statistics
|
||||
getPdfInfo.tags=정보 제공, 데이터, 통계, 통계
|
||||
|
||||
|
||||
home.extractPage.title=페이지 추출
|
||||
@@ -467,29 +470,29 @@ showJS.tags=JS
|
||||
|
||||
home.autoRedact.title=자동 검열
|
||||
home.autoRedact.desc=PDF 문서에서 입력된 텍스트들을 자동으로 검열(모자이크)합니다.
|
||||
autoRedact.tags=Redact,Hide,black out,black,marker,hidden
|
||||
autoRedact.tags=노출 방지, 숨기기, 검은색 처리, 마커, 숨김
|
||||
|
||||
home.tableExtraxt.title=PDF에서 CSV로
|
||||
home.tableExtraxt.desc=PDF에서 표를 추출하여 CSV로 변환
|
||||
tableExtraxt.tags=CSV,Table Extraction,extract,convert
|
||||
tableExtraxt.tags=CSV, 테이블 추출, 추출, 변환
|
||||
|
||||
|
||||
home.autoSizeSplitPDF.title=크기/개수로 자동 분할
|
||||
home.autoSizeSplitPDF.desc=단일 PDF를 크기, 페이지 수 또는 문서 수에 따라 여러 문서로 분할
|
||||
autoSizeSplitPDF.tags=pdf,split,document,organization
|
||||
autoSizeSplitPDF.tags=pdf 분할, 문서 분할, 조직화
|
||||
|
||||
|
||||
home.overlay-pdfs.title=PDF 오버레이
|
||||
home.overlay-pdfs.desc=PDF를 다른 PDF 위에 오버레이
|
||||
overlay-pdfs.tags=Overlay
|
||||
overlay-pdfs.tags=오버레이
|
||||
|
||||
home.split-by-sections.title=섹션별로 PDF 분할
|
||||
home.split-by-sections.desc=PDF의 각 페이지를 더 작은 가로와 세로 구역으로 나눕니다
|
||||
split-by-sections.tags=Section Split, Divide, Customize
|
||||
split-by-sections.tags=섹션 분할, 나누기, 커스텀
|
||||
|
||||
home.AddStampRequest.title=PDF에 스탬프 추가
|
||||
home.AddStampRequest.desc=설정된 위치에 텍스트 추가 또는 이미지 스탬프 추가
|
||||
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
|
||||
AddStampRequest.tags=주석 추가, 이미지 중앙 정렬, 워터마크, PDF 임베딩, 커스텀
|
||||
|
||||
|
||||
home.PDFToBook.title=PDF를 책으로
|
||||
@@ -500,25 +503,25 @@ home.BookToPDF.title=책을 PDF로
|
||||
home.BookToPDF.desc=구경을 사용하여 책/만화 형식을 PDF로 변환
|
||||
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
|
||||
home.removeImagePdf.title=Remove image
|
||||
home.removeImagePdf.desc=Remove image from PDF to reduce file size
|
||||
removeImagePdf.tags=Remove Image,Page operations,Back end,server side
|
||||
home.removeImagePdf.title=PDF에서 이미지 제거
|
||||
home.removeImagePdf.desc=PDF에서 이미지를 제거하여 파일 크기를 줄입니다.
|
||||
removeImagePdf.tags=이미지 제거, 페이지 작업, 서버 측 처리
|
||||
|
||||
|
||||
home.splitPdfByChapters.title=Split PDF by Chapters
|
||||
home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure.
|
||||
splitPdfByChapters.tags=split,chapters,bookmarks,organize
|
||||
home.splitPdfByChapters.title=챕터별로 PDF 분할
|
||||
home.splitPdfByChapters.desc=PDF를 여러 파일로 나눕니다. 각 장의 구조에 따라.
|
||||
splitPdfByChapters.tags=분할, 챕터, 북마크, 조직화
|
||||
|
||||
#replace-invert-color
|
||||
replace-color.title=Replace-Invert-Color
|
||||
replace-color.header=Replace-Invert Color PDF
|
||||
replace-color.header=색상 교체/반전 PDF
|
||||
home.replaceColorPdf.title=Replace and Invert Color
|
||||
home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size
|
||||
replaceColorPdf.tags=Replace Color,Page operations,Back end,server side
|
||||
replace-color.selectText.1=Replace or Invert color Options
|
||||
replace-color.selectText.2=Default(Default high contrast colors)
|
||||
replace-color.selectText.3=Custom(Customized colors)
|
||||
replace-color.selectText.4=Full-Invert(Invert all colors)
|
||||
home.replaceColorPdf.desc=PDF에서 텍스트와 배경 색상을 바꾸고 전체 PDF의 색상을 반전하여 파일 크기를 줄입니다.
|
||||
replaceColorPdf.tags=색상 교체, 페이지 작업, 서버 측 처리
|
||||
replace-color.selectText.1=색상 교체 또는 반전 옵션
|
||||
replace-color.selectText.2=기본값(고 해밍도 색상)
|
||||
replace-color.selectText.3=커스텀(커스텀 색상)
|
||||
replace-color.selectText.4=전체 반전(모든 색상을 반전)
|
||||
replace-color.selectText.5=High contrast color options
|
||||
replace-color.selectText.6=white text on black background
|
||||
replace-color.selectText.7=Black text on white background
|
||||
@@ -750,14 +753,15 @@ certSign.showSig=서명 보기
|
||||
certSign.reason=이유
|
||||
certSign.location=위치
|
||||
certSign.name=이름
|
||||
certSign.showLogo=로고 표시
|
||||
certSign.submit=PDF 서명
|
||||
|
||||
|
||||
#removeCertSign
|
||||
removeCertSign.title=Remove Certificate Signature
|
||||
removeCertSign.header=Remove the digital certificate from the PDF
|
||||
removeCertSign.selectPDF=Select a PDF file:
|
||||
removeCertSign.submit=Remove Signature
|
||||
removeCertSign.title=인증서 서명 제거
|
||||
removeCertSign.header=PDF에서 디지털 인증서를 제거합니다
|
||||
removeCertSign.selectPDF=PDF 파일 선택:
|
||||
removeCertSign.submit=서명 제거
|
||||
|
||||
|
||||
#removeBlanks
|
||||
@@ -779,14 +783,14 @@ removeAnnotations.submit=제거하다
|
||||
#compare
|
||||
compare.title=비교
|
||||
compare.header=PDF 문서 비교
|
||||
compare.highlightColor.1=Highlight Color 1:
|
||||
compare.highlightColor.2=Highlight Color 2:
|
||||
compare.highlightColor.1=하이라이트 색상 1:
|
||||
compare.highlightColor.2=하이라이트 색상 2:
|
||||
compare.document.1=문서 1
|
||||
compare.document.2=문서 2
|
||||
compare.submit=비교
|
||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
||||
compare.complex.message=제공된 한 개 이상의 문서가 큰 파일인 경우, 비교 정확도가 저하될 수 있습니다
|
||||
compare.large.file.message=제공된 한 개 이상의 문서가 처리할 수 없을 정도로 큽니다
|
||||
compare.no.text.message=선택한 PDF 중 하나 이상은 텍스트 내용이 없습니다. 비교를 위해 텍스트가 포함된 PDF를 선택하세요
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=책과 만화를 PDF로
|
||||
@@ -809,12 +813,17 @@ sign.draw=서명 그리기
|
||||
sign.text=텍스트 입력
|
||||
sign.clear=초기화
|
||||
sign.add=추가
|
||||
sign.saved=Saved Signatures
|
||||
sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.saved=저장된 서명
|
||||
sign.save=서명 저장
|
||||
sign.personalSigs=개인용 서명
|
||||
sign.sharedSigs=공유용 서명
|
||||
sign.noSavedSigs=저장된 서명이 없습니다
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=복구
|
||||
@@ -825,7 +834,7 @@ repair.submit=복구
|
||||
#flatten
|
||||
flatten.title=평탄화
|
||||
flatten.header=PDF 문서의 레이어 평탄화
|
||||
flatten.flattenOnlyForms=Flatten only forms
|
||||
flatten.flattenOnlyForms=양식만 압축
|
||||
flatten.submit=평탄화
|
||||
|
||||
|
||||
@@ -840,7 +849,7 @@ ScannerImageSplit.selectText.7=최소 윤곽 영역:
|
||||
ScannerImageSplit.selectText.8=사진의 최소 윤곽선 영역 임계값을 설정합니다.
|
||||
ScannerImageSplit.selectText.9=테두리 크기:
|
||||
ScannerImageSplit.selectText.10=출력에서 흰색 테두리를 방지하기 위해 추가 및 제거되는 테두리의 크기를 설정합니다(기본값: 1).
|
||||
ScannerImageSplit.info=Python is not installed. It is required to run.
|
||||
ScannerImageSplit.info=Python이 설치되지 않았습니다. 이 기능을 실행하기 위해 필요합니다
|
||||
|
||||
|
||||
#OCR
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=OCR 모드
|
||||
ocr.selectText.11=OCR 후 이미지 제거(모든 이미지 제거, 변환 단계의 일부인 경우에만 유용)
|
||||
ocr.selectText.12=렌더 유형(고급)
|
||||
ocr.help=다른 언어 또는 Docker에 포함되지 않은 언어에 대해 사용하는 방법에 대해서는 이 문서를 참조합니다.
|
||||
ocr.credit=이 서비스는 OCR에 OCRmyPDF와 Tesseract를 사용합니다.
|
||||
ocr.credit=이 서비스는 OCR에 qpdf와 Tesseract를 사용합니다.
|
||||
ocr.submit=인식
|
||||
|
||||
|
||||
@@ -867,15 +876,15 @@ ocr.submit=인식
|
||||
extractImages.title=이미지 추출
|
||||
extractImages.header=이미지 추출
|
||||
extractImages.selectText=추출된 이미지를 변환할 이미지 형식을 선택합니다.
|
||||
extractImages.allowDuplicates=Save duplicate images
|
||||
extractImages.allowDuplicates=중복 이미지 저장 허용
|
||||
extractImages.submit=추출
|
||||
|
||||
|
||||
#File to PDF
|
||||
fileToPDF.title=File to PDF
|
||||
fileToPDF.title=파일 to PDF
|
||||
fileToPDF.header=다양한 파일을 PDF로 변환
|
||||
fileToPDF.credit=이 서비스는 파일 변환에 LibreOffice와 Unoconv를 사용합니다.
|
||||
fileToPDF.supportedFileTypesInfo=Supported File types
|
||||
fileToPDF.supportedFileTypesInfo=지원되는 파일 형식
|
||||
fileToPDF.supportedFileTypes=지원되는 파일 형식은 아래와 같습니다. 지원되는 형식의 전체 업데이트 목록은 LibreOffice 설명서를 참조합니다.
|
||||
fileToPDF.submit=PDF로 변환
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=PDF로 변환
|
||||
#compress
|
||||
compress.title=압축
|
||||
compress.header=PDF 압축
|
||||
compress.credit=이 서비스는 PDF 압축 및 최적화를 위해 Ghostscript를 사용합니다.
|
||||
compress.credit=이 서비스는 PDF 압축 및 최적화를 위해 qpdf를 사용합니다.
|
||||
compress.selectText.1=수동 모드 - 1에서 4
|
||||
compress.selectText.2=최적화 수준:
|
||||
compress.selectText.3=4 (텍스트 이미지에 적합하지 않음)
|
||||
@@ -905,7 +914,7 @@ merge.title=병합
|
||||
merge.header=여러 개의 PDF 병합 (2개 이상)
|
||||
merge.sortByName=이름순 정렬
|
||||
merge.sortByDate=날짜순 정렬
|
||||
merge.removeCertSign=Remove digital signature in the merged file?
|
||||
merge.removeCertSign=병합 파일에서 디지털 서명을 제거하시겠습니까?
|
||||
merge.submit=병합
|
||||
|
||||
|
||||
@@ -923,14 +932,35 @@ pdfOrganiser.mode.6=홀수-짝수 분할
|
||||
pdfOrganiser.mode.7=첫 번째 항목 삭제
|
||||
pdfOrganiser.mode.8=마지막 항목 제거
|
||||
pdfOrganiser.mode.9=첫 번째와 마지막 제거
|
||||
pdfOrganiser.mode.10=Odd-Even Merge
|
||||
pdfOrganiser.mode.10=홀 짝 번갈아가기 병합
|
||||
pdfOrganiser.placeholder=(예: 1,3,2 또는 4-8,2,10-12 또는 2n-1)
|
||||
|
||||
|
||||
#multiTool
|
||||
multiTool.title=PDF 멀티툴
|
||||
multiTool.header=PDF 멀티툴
|
||||
multiTool.uploadPrompts=File Name
|
||||
multiTool.uploadPrompts=파일 이름
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=PDF 뷰어
|
||||
@@ -992,7 +1022,7 @@ pdfToImage.color=컬러
|
||||
pdfToImage.grey=그레이스케일
|
||||
pdfToImage.blackwhite=흑백 (데이터 손실 가능성 있음!)
|
||||
pdfToImage.submit=변환
|
||||
pdfToImage.info=Python is not installed. Required for WebP conversion.
|
||||
pdfToImage.info=Python이 설치되어 있지 않습니다. WebP 변환에 필요합니다.
|
||||
|
||||
|
||||
#addPassword
|
||||
@@ -1029,7 +1059,7 @@ watermark.selectText.6=세로 간격 (각 워터마크 사이의 세로 공간):
|
||||
watermark.selectText.7=투명도 (0% - 100%):
|
||||
watermark.selectText.8=워터마크 유형:
|
||||
watermark.selectText.9=워터마크 이미지:
|
||||
watermark.selectText.10=Convert PDF to PDF-Image
|
||||
watermark.selectText.10=PDF를 PDF-Image로 변환
|
||||
watermark.submit=워터마크 추가
|
||||
watermark.type.1=텍스트
|
||||
watermark.type.2=이미지
|
||||
@@ -1082,11 +1112,11 @@ changeMetadata.submit=변경
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF를 PDF/A로
|
||||
pdfToPDFA.header=PDF 문서를 PDF/A로 변환
|
||||
pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 ghostscript 문서를 사용합니다.
|
||||
pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 qpdf 문서를 사용합니다.
|
||||
pdfToPDFA.submit=변환
|
||||
pdfToPDFA.tip=현재 한 번에 여러 입력에 대해 작동하지 않습니다.
|
||||
pdfToPDFA.outputFormat=Output format
|
||||
pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step.
|
||||
pdfToPDFA.outputFormat=출력 형식
|
||||
pdfToPDFA.pdfWithDigitalSignature=이 PDF에는 디지털 서명이 포함되어 있습니다. 다음 단계에서 이 서명이 제거될 것입니다.
|
||||
|
||||
|
||||
#PDFToWord
|
||||
@@ -1172,11 +1202,11 @@ split-by-sections.merge=하나의 PDF로 병합
|
||||
|
||||
|
||||
#printFile
|
||||
printFile.title=Print File
|
||||
printFile.header=Print File to Printer
|
||||
printFile.selectText.1=Select File to Print
|
||||
printFile.selectText.2=Enter Printer Name
|
||||
printFile.submit=Print
|
||||
printFile.title=파일 인쇄
|
||||
printFile.header=프린터로 파일 인쇄
|
||||
printFile.selectText.1=인쇄할 파일 선택
|
||||
printFile.selectText.2=프린터 이름 입력
|
||||
printFile.submit=인쇄
|
||||
|
||||
|
||||
#licenses
|
||||
@@ -1188,15 +1218,15 @@ licenses.version=버전
|
||||
licenses.license=라이센스
|
||||
|
||||
#survey
|
||||
survey.nav=Survey
|
||||
survey.title=Stirling-PDF Survey
|
||||
survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF!
|
||||
survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here:
|
||||
survey.changes2=With these changes we are getting paid business support and funding
|
||||
survey.nav=설문조사
|
||||
survey.title=스테링-PDF 설문조사
|
||||
survey.description=스테링-PDF는 추적 기능이 없으므로 사용자 의견을 듣습니다. 스테링-PDF를 개선합니다!
|
||||
survey.changes=최근 설문조사를 진행한 이후로 스테링-PDF가 변경되었습니다! 자세한 내용은 여기의 블로그 포스트를 확인하시기 바랍니다:
|
||||
survey.changes2=이러한 변경 사항으로 인해 수익화된 비즈니스 지원과 펀딩을 받게 되었습니다
|
||||
survey.please=Please consider taking our survey!
|
||||
survey.disabled=(Survey popup will be disabled in following updates but available at foot of page)
|
||||
survey.button=Take Survey
|
||||
survey.dontShowAgain=Don't show again
|
||||
survey.disabled=(다음 업데이트에서는 설문 조사 팝업이 무단으로 끄일 수 있으나 페이지 하단에서 사용 가능)
|
||||
survey.button=설문조사 참여
|
||||
survey.dontShowAgain=이것은 다시 보지 않기
|
||||
|
||||
|
||||
#error
|
||||
@@ -1214,19 +1244,19 @@ error.discordSubmit=Discord - 문의 게시
|
||||
|
||||
|
||||
#remove-image
|
||||
removeImage.title=Remove image
|
||||
removeImage.header=Remove image
|
||||
removeImage.removeImage=Remove image
|
||||
removeImage.submit=Remove image
|
||||
removeImage.title=이미지 제거
|
||||
removeImage.header=이미지 제거
|
||||
removeImage.removeImage=이미지 제거
|
||||
removeImage.submit=제거
|
||||
|
||||
|
||||
splitByChapters.title=Split PDF by Chapters
|
||||
splitByChapters.header=Split PDF by Chapters
|
||||
splitByChapters.bookmarkLevel=Bookmark Level
|
||||
splitByChapters.includeMetadata=Include Metadata
|
||||
splitByChapters.allowDuplicates=Allow Duplicates
|
||||
splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure.
|
||||
splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.).
|
||||
splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF.
|
||||
splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs.
|
||||
splitByChapters.submit=Split PDF
|
||||
splitByChapters.title=챕터별 PDF 분할
|
||||
splitByChapters.header=챕터별 PDF 분할
|
||||
splitByChapters.bookmarkLevel=북마크 레벨
|
||||
splitByChapters.includeMetadata=메타데이터 포함
|
||||
splitByChapters.allowDuplicates=중복 허용
|
||||
splitByChapters.desc.1=이 도구는 챕터 구조를 기반으로 한 PDF 파일을 여러 개의 PDF로 분할합니다.
|
||||
splitByChapters.desc.2=북마크 레벨: 분할에 사용할 북마크 레벨을 선택하세요 (0은 상위 수준, 1은 하위 수준 등).
|
||||
splitByChapters.desc.3=메타데이터 포함: 체크하면 각 분할된 PDF에는 원본 PDF의 메타데이터가 포함됩니다.
|
||||
splitByChapters.desc.4=중복 허용: 중복 북마크가 있는 같은 페이지에 여러 번 분할 PDF를 생성합니다.
|
||||
splitByChapters.submit=PDF 분할
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
###########
|
||||
# the direction that the language is written (ltr = left to right, rtl = right to left)
|
||||
language.direction=ltr
|
||||
addPageNumbers.fontSize=Font Size
|
||||
addPageNumbers.fontName=Font Name
|
||||
addPageNumbers.fontSize=Lettertypegrootte
|
||||
addPageNumbers.fontName=Lettertypenaam
|
||||
pdfPrompt=Selecteer PDF('s)
|
||||
multiPdfPrompt=Selecteer PDF's (2+)
|
||||
multiPdfDropPrompt=Selecteer (of sleep & zet neer) alle PDF's die je nodig hebt
|
||||
@@ -25,13 +25,13 @@ noFavourites=Geen favorieten toegevoegd
|
||||
downloadComplete=Download klaar
|
||||
bored=Verveeld met wachten?
|
||||
alphabet=Alfabet
|
||||
downloadPdf=Download PDF
|
||||
downloadPdf=PDF downloaden
|
||||
text=Tekst
|
||||
font=Lettertype
|
||||
selectFillter=-- Selecteer --
|
||||
pageNum=Paginanummer
|
||||
sizes.small=Klein
|
||||
sizes.medium=Medium
|
||||
sizes.medium=Gemiddeld
|
||||
sizes.large=Groot
|
||||
sizes.x-large=Extra groot
|
||||
error.pdfPassword=Het PDF document is beveiligd met een wachtwoord en het wachtwoord is niet ingevoerd of is onjuist
|
||||
@@ -56,18 +56,18 @@ userNotFoundMessage=Gebruiker niet gevonden.
|
||||
incorrectPasswordMessage=Huidige wachtwoord is onjuist.
|
||||
usernameExistsMessage=Nieuwe gebruikersnaam bestaat al.
|
||||
invalidUsernameMessage=Ongeldige gebruikersnaam, gebruikersnaam kan alleen letters, nummers en de volgende speciale tekens @._+- bevatten of moet een geldig emailadres zijn.
|
||||
invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end.
|
||||
invalidPasswordMessage=Het wachtwoord mag geen spaties ten beginne of einde bevatten en mag niet leeg zijn.
|
||||
confirmPasswordErrorMessage=Nieuw wachtwoord en bevestig wachtwoord moeten overeenkomen.
|
||||
deleteCurrentUserMessage=Kan niet een momenteel ingelogde gebruiker verwijderen.
|
||||
deleteUsernameExistsMessage=De gebruikersnaam bestaat niet en kan niet verwijderd worden.
|
||||
downgradeCurrentUserMessage=Kan de rol van de huidige gebruiker niet downgraden
|
||||
disabledCurrentUserMessage=The current user cannot be disabled
|
||||
disabledCurrentUserMessage=De huidige gebruiker kan niet worden uitgeschakeld
|
||||
downgradeCurrentUserLongMessage=Kan de rol van de huidige gebruiker niet downgraden. Huidige gebruiker wordt dus niet weergegeven.
|
||||
userAlreadyExistsOAuthMessage=De gebruiker bestaat al als een OAuth2 gebruiker.
|
||||
userAlreadyExistsWebMessage=De gebruiker bestaat al als een web gebruiker.
|
||||
error=Error
|
||||
error=Fout
|
||||
oops=Oeps!
|
||||
help=Help
|
||||
help=Hulp
|
||||
goHomepage=Ga naar de startpagina
|
||||
joinDiscord=Word lid van onze Discord server
|
||||
seeDockerHub=Zie Docker Hub
|
||||
@@ -75,18 +75,19 @@ visitGithub=Ga naar de Github Repository
|
||||
donate=Doneer
|
||||
color=Kleur
|
||||
sponsor=Sponsor
|
||||
info=Info
|
||||
info=Informatie
|
||||
pro=Pro
|
||||
page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
page=Pagina
|
||||
pages=Pagen
|
||||
loading=Laden...
|
||||
addToDoc=Toevoegen aan document
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Privacy Policy
|
||||
legal.terms=Terms and Conditions
|
||||
legal.accessibility=Accessibility
|
||||
legal.cookie=Cookie Policy
|
||||
legal.impressum=Impressum
|
||||
legal.privacy=Privacybeleid
|
||||
legal.terms=Voorwaarden van gebruik
|
||||
legal.accessibility=Toegankelijkheid
|
||||
legal.cookie=Cookiesbeleid
|
||||
legal.impressum=Imprint
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
@@ -141,6 +142,7 @@ navbar.language=Talen
|
||||
navbar.settings=Instellingen
|
||||
navbar.allTools=Tools
|
||||
navbar.multiTool=Multitools
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Organizeren
|
||||
navbar.sections.convertTo=Converteren naar PDF
|
||||
navbar.sections.convertFrom=Converteren van PDF
|
||||
@@ -226,26 +228,27 @@ adminUserSettings.disabledUser=disabled user
|
||||
adminUserSettings.activeUsers=Active Users:
|
||||
adminUserSettings.disabledUsers=Disabled Users:
|
||||
adminUserSettings.totalUsers=Total Users:
|
||||
adminUserSettings.lastRequest=Last Request
|
||||
adminUserSettings.lastRequest=Laatste aanvraag
|
||||
|
||||
|
||||
database.title=Database Import/Export
|
||||
database.header=Database Import/Export
|
||||
database.fileName=File Name
|
||||
database.creationDate=Creation Date
|
||||
database.fileSize=File Size
|
||||
database.deleteBackupFile=Delete Backup File
|
||||
database.importBackupFile=Import Backup File
|
||||
database.downloadBackupFile=Download Backup File
|
||||
database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application.
|
||||
database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention.
|
||||
database.submit=Import Backup
|
||||
database.importIntoDatabaseSuccessed=Import into database successed
|
||||
database.title=Database Importeer/Exporteer
|
||||
database.header=Database Importeer/Exporteer
|
||||
database.fileName=Bestandsnaam
|
||||
database.creationDate=Creatiedatum
|
||||
database.fileSize=Bestandsgrootte
|
||||
database.deleteBackupFile=Backupbestand verwijderen
|
||||
database.importBackupFile=Backupbestand importeren
|
||||
database.downloadBackupFile=Backupbestand downloaden
|
||||
database.info_1=Bij het importeren van gegevens is het cruciaal om de juiste structuur te zorgen voor. Als je niet zeker bent van wat je doet, raadpleeg dan advies en ondersteuning bij een professionele. Een fout in de structuur kan leiden tot toepassingsfouten, waarmee wellicht zelfs de volledige uitvoerbaarheid van de toepassing belemmerd wordt.
|
||||
database.info_2=De bestandsnaam maakt geen verschil bij het uploaden. Hij zal later worden herbewoond om de indeling backup_user_yyyyMMddHHmm.sql te volgen, waardoor een consistente bestandsnaamconventie waarborgd wordt.
|
||||
database.submit=Backup importeren
|
||||
database.importIntoDatabaseSuccessed=Importeer naar database succesvol
|
||||
database.fileNotFound=File not Found
|
||||
database.fileNullOrEmpty=File must not be null or empty
|
||||
database.fileNullOrEmpty=Bestand mag niet null of leeg zijn
|
||||
database.failedImportFile=Failed Import File
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.expired=Je sessie is verlopen. Voer de pagina opnieuw in en probeer het opnieuw.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -467,7 +470,7 @@ showJS.tags=JS
|
||||
|
||||
home.autoRedact.title=Automatisch censureren
|
||||
home.autoRedact.desc=Automatisch censureren (onherkenbaar maken) van tekst in een PDF op basis van ingevoerde tekst
|
||||
autoRedact.tags=Redact,Hide,black out,black,marker,hidden
|
||||
autoRedact.tags=Verzwakken, Verbergen, Uitroepen, Gekleurd, Verborgen
|
||||
|
||||
home.tableExtraxt.title=PDF naar CSV
|
||||
home.tableExtraxt.desc=Haalt tabellen uit een PDF en converteert ze naar CSV
|
||||
@@ -500,33 +503,33 @@ home.BookToPDF.title=Boek naar PDF
|
||||
home.BookToPDF.desc=Converteert boek-/stripformaat naar PDF met gebruik van Calibre
|
||||
BookToPDF.tags=Boek,Strip,Comic,Calibre,Converteren,manga,amazon,kindle
|
||||
|
||||
home.removeImagePdf.title=Remove image
|
||||
home.removeImagePdf.desc=Remove image from PDF to reduce file size
|
||||
removeImagePdf.tags=Remove Image,Page operations,Back end,server side
|
||||
home.removeImagePdf.title=Afbeelding verwijderen
|
||||
home.removeImagePdf.desc=Afbeeldingen uit PDF verwijderen om het bestandsgrootte te verminderen
|
||||
removeImagePdf.tags=Afbeelding verwijderen, Paginabewerkingen, Achterkant, Serverkant
|
||||
|
||||
|
||||
home.splitPdfByChapters.title=Split PDF by Chapters
|
||||
home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure.
|
||||
splitPdfByChapters.tags=split,chapters,bookmarks,organize
|
||||
home.splitPdfByChapters.title=PDF op hoofdstukken splitsen
|
||||
home.splitPdfByChapters.desc=Splits een PDF op basis van zijn hoofdstukstructuur in meerdere bestanden.
|
||||
splitPdfByChapters.tags=splitsen, hoofdstukken, bookmarks, organiseren
|
||||
|
||||
#replace-invert-color
|
||||
replace-color.title=Replace-Invert-Color
|
||||
replace-color.header=Replace-Invert Color PDF
|
||||
replace-color.header=Kleur-instellingen voor PDF's
|
||||
home.replaceColorPdf.title=Replace and Invert Color
|
||||
home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size
|
||||
replaceColorPdf.tags=Replace Color,Page operations,Back end,server side
|
||||
replace-color.selectText.1=Replace or Invert color Options
|
||||
replace-color.selectText.2=Default(Default high contrast colors)
|
||||
replace-color.selectText.3=Custom(Customized colors)
|
||||
replace-color.selectText.4=Full-Invert(Invert all colors)
|
||||
replace-color.selectText.5=High contrast color options
|
||||
replace-color.selectText.6=white text on black background
|
||||
replace-color.selectText.7=Black text on white background
|
||||
replace-color.selectText.8=Yellow text on black background
|
||||
replace-color.selectText.9=Green text on black background
|
||||
replace-color.selectText.10=Choose text Color
|
||||
replace-color.selectText.11=Choose background Color
|
||||
replace-color.submit=Replace
|
||||
home.replaceColorPdf.desc=Vervang de kleur van tekst en achtergrond in een PDF en omverkeer de volledige kleur van het document om bestandsgrootte te verkleinen.
|
||||
replaceColorPdf.tags=Kleur vervangen, pagina-acties, achterkant, serverzijde
|
||||
replace-color.selectText.1=Vervang of invertere kleure opties
|
||||
replace-color.selectText.2=Standaard (hoog contrast kleuren)
|
||||
replace-color.selectText.3=Aangepast (aangepaste kleuren)
|
||||
replace-color.selectText.4=Volledig inverteren (alle kleuren omverkeren)
|
||||
replace-color.selectText.5=Opties voor hoog contrast
|
||||
replace-color.selectText.6=wit tekst op een zwart grondvlak
|
||||
replace-color.selectText.7=zwarte tekst op wit grondvlak
|
||||
replace-color.selectText.8=gele tekst op een zwart grondvlak
|
||||
replace-color.selectText.9=groene tekst op een zwart grondvlak
|
||||
replace-color.selectText.10=Kies de tekstkleur
|
||||
replace-color.selectText.11=Kies het achtergrondkleur
|
||||
replace-color.submit=Vervang
|
||||
|
||||
|
||||
|
||||
@@ -545,17 +548,17 @@ login.locked=Je account is geblokkeerd.
|
||||
login.signinTitle=Gelieve in te loggen
|
||||
login.ssoSignIn=Inloggen via Single Sign-on
|
||||
login.oauth2AutoCreateDisabled=OAUTH2 Automatisch aanmaken gebruiker uitgeschakeld
|
||||
login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator.
|
||||
login.oauth2AdminBlockedUser=Registratie of inloggen van niet-registreerde gebruikers is helaas momenteel geblokkeerd. Neem contact op met de beheerder.
|
||||
login.oauth2RequestNotFound=Autorisatieverzoek niet gevonden
|
||||
login.oauth2InvalidUserInfoResponse=Ongeldige reactie op gebruikersinfo
|
||||
login.oauth2invalidRequest=Ongeldig verzoek
|
||||
login.oauth2AccessDenied=Toegang geweigerd
|
||||
login.oauth2InvalidTokenResponse=Ongeldige tokenreactie
|
||||
login.oauth2InvalidIdToken=Ongeldige ID token
|
||||
login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator.
|
||||
login.alreadyLoggedIn=You are already logged in to
|
||||
login.alreadyLoggedIn2=devices. Please log out of the devices and try again.
|
||||
login.toManySessions=You have too many active sessions
|
||||
login.userIsDisabled=De gebruiker is gedesactiveerd, inloggen is momenteel geblokkeerd voor deze gebruikersnaam. Neem contact op met de beheerder.
|
||||
login.alreadyLoggedIn=U zit reeds ingelogd bij
|
||||
login.alreadyLoggedIn2=apparaten. U moet u a.u.b. uitloggen van de apparaten en opnieuw proberen.
|
||||
login.toManySessions=U heeft te veel actieve sessies
|
||||
|
||||
#auto-redact
|
||||
autoRedact.title=Automatisch censureren
|
||||
@@ -573,7 +576,7 @@ autoRedact.submitButton=Indienen
|
||||
#showJS
|
||||
showJS.title=Toon Javascript
|
||||
showJS.header=Toon Javascript
|
||||
showJS.downloadJS=Download Javascript
|
||||
showJS.downloadJS=Javascript downloaden
|
||||
showJS.submit=Toon
|
||||
|
||||
|
||||
@@ -587,14 +590,14 @@ pdfToSinglePage.submit=Converteren naar enkele pagina
|
||||
pageExtracter.title=Pagina's extraheren
|
||||
pageExtracter.header=Pagina's extraheren
|
||||
pageExtracter.submit=Extraheren
|
||||
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
|
||||
pageExtracter.placeholder=(bijv. 1,2,8 of 4,7,12-16 of 2n-1)
|
||||
|
||||
|
||||
#getPdfInfo
|
||||
getPdfInfo.title=Informatie over PDF ophalen
|
||||
getPdfInfo.header=Informatie over PDF ophalen
|
||||
getPdfInfo.submit=Haal informatie op
|
||||
getPdfInfo.downloadJson=Download JSON
|
||||
getPdfInfo.downloadJson=JSON downloaden
|
||||
|
||||
|
||||
#markdown-to-pdf
|
||||
@@ -630,7 +633,7 @@ HTMLToPDF.printBackground=De achtergrond van websites weergeven.
|
||||
HTMLToPDF.defaultHeader=Standaard koptekst weergeven (naam en paginanummer)
|
||||
HTMLToPDF.cssMediaType=Wijzig het CSS-mediatype van de pagina.
|
||||
HTMLToPDF.none=Geen
|
||||
HTMLToPDF.print=Print
|
||||
HTMLToPDF.print=Printen
|
||||
HTMLToPDF.screen=Scherm
|
||||
|
||||
|
||||
@@ -687,7 +690,7 @@ auto-rename.submit=Automatisch hernoemen
|
||||
#adjustContrast
|
||||
adjustContrast.title=Contrast aanpassen
|
||||
adjustContrast.header=Contrast aanpassen
|
||||
adjustContrast.contrast=Contrast:
|
||||
adjustContrast.contrast=Kehrbrechting:
|
||||
adjustContrast.brightness=Helderheid:
|
||||
adjustContrast.saturation=Verzadiging:
|
||||
adjustContrast.download=Downloaden
|
||||
@@ -730,7 +733,7 @@ pageLayout.submit=Indienen
|
||||
scalePages.title=Pagina-schaal aanpassen
|
||||
scalePages.header=Pagina-schaal aanpassen
|
||||
scalePages.pageSize=Grootte van een pagina van het document.
|
||||
scalePages.keepPageSize=Original Size
|
||||
scalePages.keepPageSize=Oorspronkelijke grootte behouden
|
||||
scalePages.scaleFactor=Zoomniveau (uitsnede) van een pagina.
|
||||
scalePages.submit=Indienen
|
||||
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=Toon handtekening
|
||||
certSign.reason=Reden
|
||||
certSign.location=Locatie
|
||||
certSign.name=Naam
|
||||
certSign.showLogo=Logotype tonen
|
||||
certSign.submit=PDF ondertekenen
|
||||
|
||||
|
||||
@@ -779,14 +783,14 @@ removeAnnotations.submit=Verwijderen
|
||||
#compare
|
||||
compare.title=Vergelijken
|
||||
compare.header=PDF's vergelijken
|
||||
compare.highlightColor.1=Highlight Color 1:
|
||||
compare.highlightColor.2=Highlight Color 2:
|
||||
compare.highlightColor.1=Hervormingskleur 1:
|
||||
compare.highlightColor.2=Hervormingskleur 2:
|
||||
compare.document.1=Document 1
|
||||
compare.document.2=Document 2
|
||||
compare.submit=Vergelijken
|
||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
||||
compare.complex.message=Eén of beide van de bijgewerkte documenten zijn grote bestanden, het vergelijken kan mogelijk minder nauwkeurig zijn.
|
||||
compare.large.file.message=Eén of beiden van de bijgewerkte documenten zijn te groot om verwerkt te worden.
|
||||
compare.no.text.message=Een of beide geselecteerde PDF-bestanden bevatten geen tekstinhoud. Kies a.u.b. PDF-bestanden met tekst voor vergelijking.
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Boeken en strips naar PDF
|
||||
@@ -809,12 +813,17 @@ sign.draw=Handtekening tekenen
|
||||
sign.text=Tekstinvoer
|
||||
sign.clear=Wissen
|
||||
sign.add=Toevoegen
|
||||
sign.saved=Saved Signatures
|
||||
sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.saved=Gesleutelde handtekeningen opgeslagen
|
||||
sign.save=Opslaan Signatuur
|
||||
sign.personalSigs=Persoonlijke Signatuuren
|
||||
sign.sharedSigs=Gedeelde Signatuuren
|
||||
sign.noSavedSigs=Geen opgeslagen signatuuren gevonden
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Repareren
|
||||
@@ -840,7 +849,7 @@ ScannerImageSplit.selectText.7=Minimum contour oppervlakte:
|
||||
ScannerImageSplit.selectText.8=Stelt de minimale contour oppervlakte drempel in voor een foto
|
||||
ScannerImageSplit.selectText.9=Randgrootte:
|
||||
ScannerImageSplit.selectText.10=Stelt de grootte van de toegevoegde en verwijderde rand in om witte randen in de uitvoer te voorkomen (standaard: 1).
|
||||
ScannerImageSplit.info=Python is not installed. It is required to run.
|
||||
ScannerImageSplit.info=Python is niet geïnstalleerd. Het wordt vereist om te worden uitgevoerd.
|
||||
|
||||
|
||||
#OCR
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=OCR-modus
|
||||
ocr.selectText.11=Verwijder afbeeldingen na OCR (Verwijdert ALLE afbeeldingen, alleen nuttig als onderdeel van conversiestap)
|
||||
ocr.selectText.12=Weergave Type (Geavanceerd)
|
||||
ocr.help=Lees deze documentatie over hoe dit te gebruiken voor andere talen en/of gebruik buiten docker
|
||||
ocr.credit=Deze dienst maakt gebruik van OCRmyPDF en Tesseract voor OCR.
|
||||
ocr.credit=Deze dienst maakt gebruik van qpdf en Tesseract voor OCR.
|
||||
ocr.submit=Verwerk PDF met OCR
|
||||
|
||||
|
||||
@@ -867,7 +876,7 @@ ocr.submit=Verwerk PDF met OCR
|
||||
extractImages.title=Afbeeldingen extraheren
|
||||
extractImages.header=Afbeeldingen extraheren
|
||||
extractImages.selectText=Selecteer het beeldformaat voor geëxtraheerde afbeeldingen
|
||||
extractImages.allowDuplicates=Save duplicate images
|
||||
extractImages.allowDuplicates=Dubbele afbeeldingen opslaan
|
||||
extractImages.submit=Extraheer
|
||||
|
||||
|
||||
@@ -875,7 +884,7 @@ extractImages.submit=Extraheer
|
||||
fileToPDF.title=Bestand naar PDF
|
||||
fileToPDF.header=Zet elk bestand om naar PDF
|
||||
fileToPDF.credit=Deze service gebruikt LibreOffice en Unoconv voor bestandsconversie.
|
||||
fileToPDF.supportedFileTypesInfo=Supported File types
|
||||
fileToPDF.supportedFileTypesInfo=Gestandaardiseerde Bestandstypen
|
||||
fileToPDF.supportedFileTypes=Ondersteunde bestandstypen zijn hieronder opgenomen, maar raadpleeg voor een volledige lijst met ondersteunde formaten de LibreOffice-documentatie
|
||||
fileToPDF.submit=Omzetten naar PDF
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Omzetten naar PDF
|
||||
#compress
|
||||
compress.title=Comprimeren
|
||||
compress.header=PDF comprimeren
|
||||
compress.credit=Deze functie gebruikt Ghostscript voor PDF Compressie/Optimalisatie.
|
||||
compress.credit=Deze functie gebruikt qpdf voor PDF Compressie/Optimalisatie.
|
||||
compress.selectText.1=Handmatige modus - Van 1 tot 4
|
||||
compress.selectText.2=Optimalisatieniveau:
|
||||
compress.selectText.3=4 (Verschrikkelijk voor tekstafbeeldingen)
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(bijv. 1,3,2 of 4-8,2,10-12 of 2n-1)
|
||||
multiTool.title=PDF Multitool
|
||||
multiTool.header=PDF Multitool
|
||||
multiTool.uploadPrompts=Bestandsnaam
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=PDF bekijken
|
||||
@@ -992,7 +1022,7 @@ pdfToImage.color=Kleur
|
||||
pdfToImage.grey=Grijstinten
|
||||
pdfToImage.blackwhite=Zwart en wit (kan data verliezen!)
|
||||
pdfToImage.submit=Omzetten
|
||||
pdfToImage.info=Python is not installed. Required for WebP conversion.
|
||||
pdfToImage.info=Python is niet geïnstalleerd. Vereist voor WebP-conversie.
|
||||
|
||||
|
||||
#addPassword
|
||||
@@ -1029,10 +1059,10 @@ watermark.selectText.6=hoogteSpacer (Ruimte tussen elk watermerk verticaal):
|
||||
watermark.selectText.7=Transparantie (0% - 100%):
|
||||
watermark.selectText.8=Type watermerk:
|
||||
watermark.selectText.9=Watermerk afbeelding:
|
||||
watermark.selectText.10=Convert PDF to PDF-Image
|
||||
watermark.selectText.10=PDF omzetten naar PDF-Afbeelding
|
||||
watermark.submit=Watermerk toevoegen
|
||||
watermark.type.1=Text
|
||||
watermark.type.2=Image
|
||||
watermark.type.1=Tekst
|
||||
watermark.type.2=Afbeelding
|
||||
|
||||
|
||||
#Change permissions
|
||||
@@ -1082,10 +1112,10 @@ changeMetadata.submit=Wijzigen
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF naar PDF/A
|
||||
pdfToPDFA.header=PDF naar PDF/A
|
||||
pdfToPDFA.credit=Deze service gebruikt ghostscript voor PDF/A-conversie
|
||||
pdfToPDFA.credit=Deze service gebruikt qpdf voor PDF/A-conversie
|
||||
pdfToPDFA.submit=Converteren
|
||||
pdfToPDFA.tip=Werkt momenteel niet voor meerdere inputs tegelijkertijd.
|
||||
pdfToPDFA.outputFormat=Output format
|
||||
pdfToPDFA.outputFormat=Uitvoerindeling
|
||||
pdfToPDFA.pdfWithDigitalSignature=Dit PDF bestand bevat een digitale handtekening. Deze wordt in de volgende stap verwijderd.
|
||||
|
||||
|
||||
@@ -1176,7 +1206,7 @@ printFile.title=Print bestand
|
||||
printFile.header=Print bestand naar printer
|
||||
printFile.selectText.1=Selecteer bestand om te printen
|
||||
printFile.selectText.2=Voer printernaam in
|
||||
printFile.submit=Print
|
||||
printFile.submit=Druk af
|
||||
|
||||
|
||||
#licenses
|
||||
@@ -1191,8 +1221,8 @@ licenses.license=Licentie
|
||||
survey.nav=Enquête
|
||||
survey.title=Stirling-PDF Enquête
|
||||
survey.description=Stirling-PDF heeft geen tracking, dus we willen van onze gebruikers horen om Stirling-PDF te verbeteren.
|
||||
survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here:
|
||||
survey.changes2=With these changes we are getting paid business support and funding
|
||||
survey.changes=Stirling-PDF is sinds de laatste enquête veranderd! Zie hier onze blogpost voor meer informatie:
|
||||
survey.changes2=Met deze veranderingen krijgen we betaalde bedrijfsondersteuning en financiering
|
||||
survey.please=Overweeg alstublieft om onze enquête in te vullen!
|
||||
survey.disabled=(Enquête popup wordt in een toekomstige update weggehaald, maar is beschikbaar aan de onderkant van de pagina.)
|
||||
survey.button=Vul enquête in.
|
||||
@@ -1214,19 +1244,19 @@ error.discordSubmit=Discord - Maak een support post
|
||||
|
||||
|
||||
#remove-image
|
||||
removeImage.title=Remove image
|
||||
removeImage.header=Remove image
|
||||
removeImage.removeImage=Remove image
|
||||
removeImage.submit=Remove image
|
||||
removeImage.title=Afbeelding verwijderen
|
||||
removeImage.header=Afbeelding verwijderen
|
||||
removeImage.removeImage=Afbeelding verwijderen
|
||||
removeImage.submit=Verwijder afbeelding
|
||||
|
||||
|
||||
splitByChapters.title=Split PDF by Chapters
|
||||
splitByChapters.header=Split PDF by Chapters
|
||||
splitByChapters.bookmarkLevel=Bookmark Level
|
||||
splitByChapters.includeMetadata=Include Metadata
|
||||
splitByChapters.allowDuplicates=Allow Duplicates
|
||||
splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure.
|
||||
splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.).
|
||||
splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF.
|
||||
splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs.
|
||||
splitByChapters.submit=Split PDF
|
||||
splitByChapters.title=PDF splits op hoofdstukken
|
||||
splitByChapters.header=PDF splitsen per hoofdstuk
|
||||
splitByChapters.bookmarkLevel=Boekmarkeer niveau
|
||||
splitByChapters.includeMetadata=Metadata inclusief
|
||||
splitByChapters.allowDuplicates=Dubbele items toestaan
|
||||
splitByChapters.desc.1=Dit hulpmiddel splits een PDF-bestand op in meerdere PDF's gebaseerd op zijn hoofdstukstructuur.
|
||||
splitByChapters.desc.2=Boekmarkeer niveau: Kies het boekmarkeer niveau om te gebruiken voor delen (0 voor topniveau, 1 voor tweedelvou, etc.).
|
||||
splitByChapters.desc.3=Metadata inclusief: Als gecijfeld, de originele PDF's metadata wordt ingevoegd in elk gesplitst PDF-bestand.
|
||||
splitByChapters.desc.4=Dubbele items toestaan: Als gecijfeld, zorgen multiple boekmarkeersymboolen op dezelfde pagina voor het maken van aparte PDF-bestanden.
|
||||
splitByChapters.submit=PDF splitsen
|
||||
|
||||
@@ -81,6 +81,7 @@ page=Page
|
||||
pages=Pages
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Privacy Policy
|
||||
legal.terms=Terms and Conditions
|
||||
@@ -141,6 +142,7 @@ navbar.language=Språk
|
||||
navbar.settings=Innstillinger
|
||||
navbar.allTools=Verktøy
|
||||
navbar.multiTool=Multi Verktøy
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Organisere
|
||||
navbar.sections.convertTo=Konverter til PDF
|
||||
navbar.sections.convertFrom=Konverter fra PDF
|
||||
@@ -246,6 +248,7 @@ database.fileNullOrEmpty=Fil må ikke være tom eller null
|
||||
database.failedImportFile=Import av fil mislyktes
|
||||
|
||||
session.expired=Your session has expired. Please refresh the page and try again.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=Vis signatur
|
||||
certSign.reason=Årsak
|
||||
certSign.location=Sted
|
||||
certSign.name=Navn
|
||||
certSign.showLogo=Show Logo
|
||||
certSign.submit=Signer PDF
|
||||
|
||||
|
||||
@@ -814,7 +818,12 @@ sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Reparer
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=OCR-modus
|
||||
ocr.selectText.11=Fjern bilder etter OCR (Fjerner ALLE bilder, kun nyttig hvis det er en del av konverteringsprosessen)
|
||||
ocr.selectText.12=Renderingstype (Avansert)
|
||||
ocr.help=Vennligst les denne dokumentasjonen for hvordan du bruker dette for andre språk og/eller bruk utenfor Docker.
|
||||
ocr.credit=Denne tjenesten bruker OCRmyPDF og Tesseract for OCR.
|
||||
ocr.credit=Denne tjenesten bruker qpdf og Tesseract for OCR.
|
||||
ocr.submit=Behandle PDF med OCR
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Konverter til PDF
|
||||
#compress
|
||||
compress.title=Komprimer
|
||||
compress.header=Komprimer PDF
|
||||
compress.credit=Denne tjenesten bruker Ghostscript for PDF-komprimering/optimisering.
|
||||
compress.credit=Denne tjenesten bruker qpdf for PDF-komprimering/optimisering.
|
||||
compress.selectText.1=Manuell modus - Fra 1 til 4
|
||||
compress.selectText.2=Optimeringsnivå:
|
||||
compress.selectText.3=4 (Dårlig for tekstbilder)
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1)
|
||||
multiTool.title=PDF-multiverktøy
|
||||
multiTool.header=PDF-multiverktøy
|
||||
multiTool.uploadPrompts=Filnavn
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=Vis PDF
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=Endre
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF til PDF/A
|
||||
pdfToPDFA.header=PDF til PDF/A
|
||||
pdfToPDFA.credit=Denne tjenesten bruker ghostscript for PDF/A-konvertering
|
||||
pdfToPDFA.credit=Denne tjenesten bruker qpdf for PDF/A-konvertering
|
||||
pdfToPDFA.submit=Konverter
|
||||
pdfToPDFA.tip=Fungere for øyeblikket ikke for flere innganger samtidig
|
||||
pdfToPDFA.outputFormat=Utdataformat
|
||||
|
||||
@@ -81,6 +81,7 @@ page=Strona
|
||||
pages=Strony
|
||||
loading=Loading...
|
||||
addToDoc=Add to Document
|
||||
reset=Reset
|
||||
|
||||
legal.privacy=Polityka Prywatności
|
||||
legal.terms=Zasady i Postanowienia
|
||||
@@ -141,6 +142,7 @@ navbar.language=Języki
|
||||
navbar.settings=Ustawienia
|
||||
navbar.allTools=Narzędzia
|
||||
navbar.multiTool=Narzędzie Wielofunkcyjne
|
||||
navbar.search=Search
|
||||
navbar.sections.organize=Organizuj
|
||||
navbar.sections.convertTo=Przetwórz na PDF
|
||||
navbar.sections.convertFrom=Przetwórz z PDF
|
||||
@@ -246,6 +248,7 @@ database.fileNullOrEmpty=Plik nie może być pusty
|
||||
database.failedImportFile=Nie udało się zaimportować pliku
|
||||
|
||||
session.expired=Twoja sesja wygasła. Odśwież stronę i spróbuj ponownie.
|
||||
session.refreshPage=Refresh Page
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
@@ -750,6 +753,7 @@ certSign.showSig=Wyświetl podpis
|
||||
certSign.reason=Organizacja
|
||||
certSign.location=Lokalizacja
|
||||
certSign.name=Nazwa
|
||||
certSign.showLogo=Show Logo
|
||||
certSign.submit=Podpisz PDF
|
||||
|
||||
|
||||
@@ -814,7 +818,12 @@ sign.save=Save Signature
|
||||
sign.personalSigs=Personal Signatures
|
||||
sign.sharedSigs=Shared Signatures
|
||||
sign.noSavedSigs=No saved signatures found
|
||||
|
||||
sign.addToAll=Add to all pages
|
||||
sign.delete=Delete
|
||||
sign.first=First page
|
||||
sign.last=Last page
|
||||
sign.next=Next page
|
||||
sign.previous=Previous page
|
||||
|
||||
#repair
|
||||
repair.title=Napraw
|
||||
@@ -859,7 +868,7 @@ ocr.selectText.10=Tryb OCR
|
||||
ocr.selectText.11=Usuń obrazy po OCR (usuwa wszystkie obrazy, przydatne tylko, jeśli jest częścią etapu konwersji)
|
||||
ocr.selectText.12=Typ renderowania (zaawansowany)
|
||||
ocr.help=Przeczytaj tę dokumentację, aby dowiedzieć się, jak używać tego w innych językach i/lub nie używać docker
|
||||
ocr.credit=Ta usługa używa OCRmyPDF i Tesseract do OCR.
|
||||
ocr.credit=Ta usługa używa qpdf i Tesseract do OCR.
|
||||
ocr.submit=Przetwarzaj PDF za pomocą OCR
|
||||
|
||||
|
||||
@@ -883,7 +892,7 @@ fileToPDF.submit=Konwertuj na PDF
|
||||
#compress
|
||||
compress.title=Kompresuj
|
||||
compress.header=Kompresuj PDF
|
||||
compress.credit=Ta usługa używa Ghostscript do kompresji/optymalizacji PDF.
|
||||
compress.credit=Ta usługa używa qpdf do kompresji/optymalizacji PDF.
|
||||
compress.selectText.1=Tryb ręczny - Od 1 do 4
|
||||
compress.selectText.2=Poziom optymalizacji:
|
||||
compress.selectText.3=4 (Duże dla obrazów tekstowych)
|
||||
@@ -931,6 +940,27 @@ pdfOrganiser.placeholder=(przykład 1,3,2 lub 4-8,2,10-12 lub 2n-1)
|
||||
multiTool.title=Narzędzie Wielofunkcyjne PDF
|
||||
multiTool.header=Narzędzie Wielofunkcyjne PDF
|
||||
multiTool.uploadPrompts=Nazwa pliku
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.deselectAll=Deselect All
|
||||
multiTool.selectPages=Page Select
|
||||
multiTool.selectedPages=Selected Pages
|
||||
multiTool.page=Page
|
||||
multiTool.deleteSelected=Delete Selected
|
||||
multiTool.downloadAll=Export
|
||||
multiTool.downloadSelected=Export Selected
|
||||
|
||||
multiTool.insertPageBreak=Insert Page Break
|
||||
multiTool.addFile=Add File
|
||||
multiTool.rotateLeft=Rotate Left
|
||||
multiTool.rotateRight=Rotate Right
|
||||
multiTool.split=Split
|
||||
multiTool.moveLeft=Move Left
|
||||
multiTool.moveRight=Move Right
|
||||
multiTool.delete=Delete
|
||||
multiTool.dragDropMessage=Page(s) Selected
|
||||
|
||||
#multiTool-advert
|
||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=Podejrzyj PDF
|
||||
@@ -1082,7 +1112,7 @@ changeMetadata.submit=Zmień
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF na PDF/A
|
||||
pdfToPDFA.header=PDF na PDF/A
|
||||
pdfToPDFA.credit=Ta usługa używa ghostscript do konwersji PDF/A
|
||||
pdfToPDFA.credit=Ta usługa używa qpdf do konwersji PDF/A
|
||||
pdfToPDFA.submit=Konwertuj
|
||||
pdfToPDFA.tip=Tylko jeden plik na raz
|
||||
pdfToPDFA.outputFormat=Format wyjściowy:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user