```
diff --git a/README.md b/README.md
index e642dd8b4..988781097 100644
--- a/README.md
+++ b/README.md
@@ -112,7 +112,7 @@ Visit our comprehensive documentation at [docs.stirlingpdf.com](https://docs.sti
## Supported Languages
-Stirling-PDF currently supports 39 languages!
+Stirling-PDF currently supports 40 languages!
| Language | Progress |
| -------------------------------------------- | -------------------------------------- |
@@ -127,7 +127,7 @@ Stirling-PDF currently supports 39 languages!
| Dutch (Nederlands) (nl_NL) |  |
| English (English) (en_GB) |  |
| English (US) (en_US) |  |
-| French (Français) (fr_FR) |  |
+| French (Français) (fr_FR) |  |
| German (Deutsch) (de_DE) |  |
| Greek (Ελληνικά) (el_GR) |  |
| Hindi (हिंदी) (hi_IN) |  |
@@ -148,7 +148,7 @@ Stirling-PDF currently supports 39 languages!
| Simplified Chinese (简体中文) (zh_CN) |  |
| Slovakian (Slovensky) (sk_SK) |  |
| Slovenian (Slovenščina) (sl_SI) |  |
-| Spanish (Español) (es_ES) |  |
+| Spanish (Español) (es_ES) |  |
| Swedish (Svenska) (sv_SE) |  |
| Thai (ไทย) (th_TH) |  |
| Tibetan (བོད་ཡིག་) (zh_BO) |  |
@@ -156,12 +156,12 @@ Stirling-PDF currently supports 39 languages!
| Turkish (Türkçe) (tr_TR) |  |
| Ukrainian (Українська) (uk_UA) |  |
| Vietnamese (Tiếng Việt) (vi_VN) |  |
-
+| Malayalam (മലയാളം) (ml_ML) |  |
## Stirling PDF Enterprise
Stirling PDF offers an Enterprise edition of its software. This is the same great software but with added features, support and comforts.
-Check out our [Enterprise docs](https://docs.stirlingpdf.com/Enterprise%20Edition)
+Check out our [Enterprise docs](https://docs.stirlingpdf.com/Pro)
## 🤝 Looking to contribute?
diff --git a/build.gradle b/build.gradle
index e91f0a467..9adf2f1b5 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,5 +1,6 @@
plugins {
id "java"
+ id 'jacoco'
id "org.springframework.boot" version "3.4.5"
id "io.spring.dependency-management" version "1.1.7"
id "org.springdoc.openapi-gradle-plugin" version "1.9.0"
@@ -9,7 +10,7 @@ plugins {
id "com.github.jk1.dependency-license-report" version "2.9"
//id "nebula.lint" version "19.0.3"
id("org.panteleyev.jpackageplugin") version "1.6.1"
- id "org.sonarqube" version "6.1.0.5360"
+ id "org.sonarqube" version "6.2.0.5505"
}
import com.github.jk1.license.render.*
@@ -23,13 +24,13 @@ ext {
imageioVersion = "3.12.0"
lombokVersion = "1.18.38"
bouncycastleVersion = "1.80"
- springSecuritySamlVersion = "6.4.5"
+ springSecuritySamlVersion = "6.5.0"
openSamlVersion = "4.3.2"
tempJrePath = null
}
group = "stirling.software"
-version = "0.46.0"
+version = "0.46.2"
java {
// 17 is lowest but we support and recommend 21
@@ -433,7 +434,7 @@ dependencies {
}
//security updates
- implementation "org.springframework:spring-webmvc:6.2.6"
+ implementation "org.springframework:spring-webmvc:6.2.7"
implementation("io.github.pixee:java-security-toolkit:1.2.1")
@@ -458,7 +459,7 @@ dependencies {
implementation "org.springframework.boot:spring-boot-starter-mail:$springBootVersion"
implementation "org.springframework.session:spring-session-core:3.4.3"
- implementation "org.springframework:spring-jdbc:6.2.6"
+ implementation "org.springframework:spring-jdbc:6.2.7"
implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5'
// Don't upgrade h2database
@@ -479,7 +480,7 @@ dependencies {
testImplementation "org.springframework.boot:spring-boot-starter-test:$springBootVersion"
// Batik
- implementation "org.apache.xmlgraphics:batik-all:1.18"
+ implementation "org.apache.xmlgraphics:batik-all:1.19"
// TwelveMonkeys
runtimeOnly "com.twelvemonkeys.imageio:imageio-batik:$imageioVersion"
@@ -527,7 +528,7 @@ dependencies {
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.14.6"
+ implementation "io.micrometer:micrometer-core:1.15.0"
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"
@@ -542,6 +543,10 @@ dependencies {
compileOnly "org.projectlombok:lombok:$lombokVersion"
annotationProcessor "org.projectlombok:lombok:$lombokVersion"
+ // Mockito (core)
+ testImplementation 'org.mockito:mockito-core:5.17.0'
+
+
testRuntimeOnly 'org.mockito:mockito-inline:5.2.0'
}
diff --git a/settings.gradle b/settings.gradle
index 6f039dc93..49d1c98ad 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,5 +1,5 @@
plugins {
// Apply the foojay-resolver plugin to allow automatic download of JDKs
- id 'org.gradle.toolchains.foojay-resolver-convention' version '0.10.0'
+ id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0'
}
rootProject.name = 'Stirling-PDF'
diff --git a/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java b/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java
index a83b17090..3803ebea4 100644
--- a/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java
+++ b/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java
@@ -34,6 +34,11 @@ public class EEAppConfig {
return licenseKeyChecker.getPremiumLicenseEnabledResult() != License.NORMAL;
}
+ @Bean(name = "license")
+ public String licenseType() {
+ return licenseKeyChecker.getPremiumLicenseEnabledResult().name();
+ }
+
@Bean(name = "runningEE")
public boolean runningEnterprise() {
return licenseKeyChecker.getPremiumLicenseEnabledResult() == License.ENTERPRISE;
@@ -56,6 +61,7 @@ public class EEAppConfig {
}
// TODO: Remove post migration
+ @SuppressWarnings("deprecation")
public void migrateEnterpriseSettingsToPremium(ApplicationProperties applicationProperties) {
EnterpriseEdition enterpriseEdition = applicationProperties.getEnterpriseEdition();
Premium premium = applicationProperties.getPremium();
diff --git a/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java b/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java
index 473f5f385..092665dc3 100644
--- a/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java
+++ b/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java
@@ -48,30 +48,47 @@ public class KeygenLicenseVerifier {
private static final ObjectMapper objectMapper = new ObjectMapper();
private final ApplicationProperties applicationProperties;
+ // Shared HTTP client for connection pooling
+ private static final HttpClient httpClient =
+ HttpClient.newBuilder()
+ .version(HttpClient.Version.HTTP_2)
+ .connectTimeout(java.time.Duration.ofSeconds(10))
+ .build();
+
+ // License metadata context class to avoid shared mutable state
+ private static class LicenseContext {
+ private boolean isFloatingLicense = false;
+ private int maxMachines = 1; // Default to 1 if not specified
+ private boolean isEnterpriseLicense = false;
+
+ public LicenseContext() {}
+ }
+
public License verifyLicense(String licenseKeyOrCert) {
License license;
+ LicenseContext context = new LicenseContext();
if (isCertificateLicense(licenseKeyOrCert)) {
log.info("Detected certificate-based license. Processing...");
- boolean isValid = verifyCertificateLicense(licenseKeyOrCert);
+ boolean isValid = verifyCertificateLicense(licenseKeyOrCert, context);
if (isValid) {
- license = isEnterpriseLicense ? License.ENTERPRISE : License.PRO;
+ license = context.isEnterpriseLicense ? License.ENTERPRISE : License.PRO;
} else {
license = License.NORMAL;
}
} else if (isJWTLicense(licenseKeyOrCert)) {
log.info("Detected JWT-style license key. Processing...");
- boolean isValid = verifyJWTLicense(licenseKeyOrCert);
+ boolean isValid = verifyJWTLicense(licenseKeyOrCert, context);
if (isValid) {
- license = isEnterpriseLicense ? License.ENTERPRISE : License.PRO;
+ license = context.isEnterpriseLicense ? License.ENTERPRISE : License.PRO;
} else {
license = License.NORMAL;
}
} else {
log.info("Detected standard license key. Processing...");
- boolean isValid = verifyStandardLicense(licenseKeyOrCert);
+ boolean isValid = verifyStandardLicense(licenseKeyOrCert, context);
if (isValid) {
- license = isEnterpriseLicense ? License.ENTERPRISE : License.PRO;
+ license = context.isEnterpriseLicense ? License.ENTERPRISE : License.PRO;
} else {
license = License.NORMAL;
}
@@ -79,7 +96,7 @@ public class KeygenLicenseVerifier {
return license;
}
- private boolean isEnterpriseLicense = false;
+ // Removed instance field for isEnterpriseLicense, now using LicenseContext
private boolean isCertificateLicense(String license) {
return license != null && license.trim().startsWith(CERT_PREFIX);
@@ -89,7 +106,7 @@ public class KeygenLicenseVerifier {
return license != null && license.trim().startsWith(JWT_PREFIX);
}
- private boolean verifyCertificateLicense(String licenseFile) {
+ private boolean verifyCertificateLicense(String licenseFile, LicenseContext context) {
try {
String encodedPayload = licenseFile;
// Remove the header
@@ -144,7 +161,7 @@ public class KeygenLicenseVerifier {
}
// Process the certificate data
- boolean isValid = processCertificateData(decodedData);
+ boolean isValid = processCertificateData(decodedData, context);
return isValid;
} catch (Exception e) {
@@ -187,7 +204,7 @@ public class KeygenLicenseVerifier {
}
}
- private boolean processCertificateData(String certData) {
+ private boolean processCertificateData(String certData, LicenseContext context) {
try {
JSONObject licenseData = new JSONObject(certData);
JSONObject metaObj = licenseData.optJSONObject("meta");
@@ -229,15 +246,17 @@ public class KeygenLicenseVerifier {
if (attributesObj != null) {
log.info("Found attributes in certificate data");
+ // Check for floating license
+ context.isFloatingLicense = attributesObj.optBoolean("floating", false);
+ context.maxMachines = attributesObj.optInt("maxMachines", 1);
+
// Extract metadata
JSONObject metadataObj = attributesObj.optJSONObject("metadata");
if (metadataObj != null) {
- int users = metadataObj.optInt("users", 0);
- if (users > 0) {
- applicationProperties.getPremium().setMaxUsers(users);
- log.info("License allows for {} users", users);
- }
- isEnterpriseLicense = metadataObj.optBoolean("isEnterprise", false);
+ int users = metadataObj.optInt("users", 1);
+ applicationProperties.getPremium().setMaxUsers(users);
+ log.info("License allows for {} users", users);
+ context.isEnterpriseLicense = metadataObj.optBoolean("isEnterprise", false);
}
// Check license status if available
@@ -257,7 +276,7 @@ public class KeygenLicenseVerifier {
}
}
- private boolean verifyJWTLicense(String licenseKey) {
+ private boolean verifyJWTLicense(String licenseKey, LicenseContext context) {
try {
log.info("Verifying ED25519_SIGN format license key");
@@ -291,7 +310,7 @@ public class KeygenLicenseVerifier {
String payload = new String(payloadBytes);
// Process the license payload
- boolean isValid = processJWTLicensePayload(payload);
+ boolean isValid = processJWTLicensePayload(payload, context);
return isValid;
} catch (Exception e) {
@@ -327,7 +346,7 @@ public class KeygenLicenseVerifier {
}
}
- private boolean processJWTLicensePayload(String payload) {
+ private boolean processJWTLicensePayload(String payload, LicenseContext context) {
try {
log.info("Processing license payload: {}", payload);
@@ -348,6 +367,13 @@ public class KeygenLicenseVerifier {
String licenseId = licenseObj.optString("id", "unknown");
log.info("Processing license with ID: {}", licenseId);
+ // Check for floating license in license object
+ context.isFloatingLicense = licenseObj.optBoolean("floating", false);
+ context.maxMachines = licenseObj.optInt("maxMachines", 1);
+ if (context.isFloatingLicense) {
+ log.info("Detected floating license with max machines: {}", context.maxMachines);
+ }
+
// Check expiry date
String expiryStr = licenseObj.optString("expiry", null);
if (expiryStr != null && !"null".equals(expiryStr)) {
@@ -383,9 +409,22 @@ public class KeygenLicenseVerifier {
String policyId = policyObj.optString("id", "unknown");
log.info("License uses policy: {}", policyId);
+ // Check for floating license in policy
+ boolean policyFloating = policyObj.optBoolean("floating", false);
+ int policyMaxMachines = policyObj.optInt("maxMachines", 1);
+
+ // Policy settings take precedence
+ if (policyFloating) {
+ context.isFloatingLicense = true;
+ context.maxMachines = policyMaxMachines;
+ log.info(
+ "Policy defines floating license with max machines: {}",
+ context.maxMachines);
+ }
+
// Extract max users and isEnterprise from policy or metadata
- int users = policyObj.optInt("users", 0);
- isEnterpriseLicense = policyObj.optBoolean("isEnterprise", false);
+ int users = policyObj.optInt("users", 1);
+ context.isEnterpriseLicense = policyObj.optBoolean("isEnterprise", false);
if (users > 0) {
applicationProperties.getPremium().setMaxUsers(users);
@@ -399,7 +438,7 @@ public class KeygenLicenseVerifier {
log.info("License allows for {} users (from metadata)", users);
// Check for isEnterprise flag in metadata
- isEnterpriseLicense = metadata.optBoolean("isEnterprise", false);
+ context.isEnterpriseLicense = metadata.optBoolean("isEnterprise", false);
} else {
// Default value
applicationProperties.getPremium().setMaxUsers(1);
@@ -415,13 +454,13 @@ public class KeygenLicenseVerifier {
}
}
- private boolean verifyStandardLicense(String licenseKey) {
+ private boolean verifyStandardLicense(String licenseKey, LicenseContext context) {
try {
log.info("Checking standard license key");
String machineFingerprint = generateMachineFingerprint();
// First, try to validate the license
- JsonNode validationResponse = validateLicense(licenseKey, machineFingerprint);
+ JsonNode validationResponse = validateLicense(licenseKey, machineFingerprint, context);
if (validationResponse != null) {
boolean isValid = validationResponse.path("meta").path("valid").asBoolean();
String licenseId = validationResponse.path("data").path("id").asText();
@@ -435,10 +474,11 @@ public class KeygenLicenseVerifier {
"License not activated for this machine. Attempting to"
+ " activate...");
boolean activated =
- activateMachine(licenseKey, licenseId, machineFingerprint);
+ activateMachine(licenseKey, licenseId, machineFingerprint, context);
if (activated) {
// Revalidate after activation
- validationResponse = validateLicense(licenseKey, machineFingerprint);
+ validationResponse =
+ validateLicense(licenseKey, machineFingerprint, context);
isValid =
validationResponse != null
&& validationResponse
@@ -458,9 +498,8 @@ public class KeygenLicenseVerifier {
}
}
- private JsonNode validateLicense(String licenseKey, String machineFingerprint)
- throws Exception {
- HttpClient client = HttpClient.newHttpClient();
+ private JsonNode validateLicense(
+ String licenseKey, String machineFingerprint, LicenseContext context) throws Exception {
String requestBody =
String.format(
"{\"meta\":{\"key\":\"%s\",\"scope\":{\"fingerprint\":\"%s\"}}}",
@@ -479,7 +518,8 @@ public class KeygenLicenseVerifier {
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
- HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
+ HttpResponse response =
+ httpClient.send(request, HttpResponse.BodyHandlers.ofString());
log.info("ValidateLicenseResponse body: {}", response.body());
JsonNode jsonResponse = objectMapper.readTree(response.body());
if (response.statusCode() == 200) {
@@ -493,18 +533,61 @@ public class KeygenLicenseVerifier {
log.info("Validation detail: " + detail);
log.info("Validation code: " + code);
- // Extract user count
+ // Check if the license itself has floating attribute
+ JsonNode licenseAttrs = jsonResponse.path("data").path("attributes");
+ if (!licenseAttrs.isMissingNode()) {
+ context.isFloatingLicense = licenseAttrs.path("floating").asBoolean(false);
+ context.maxMachines = licenseAttrs.path("maxMachines").asInt(1);
+
+ log.info(
+ "License floating (from license): {}, maxMachines: {}",
+ context.isFloatingLicense,
+ context.maxMachines);
+ }
+
+ // Also check the policy for floating license support if included
+ JsonNode includedNode = jsonResponse.path("included");
+ JsonNode policyNode = null;
+
+ if (includedNode.isArray()) {
+ for (JsonNode node : includedNode) {
+ if ("policies".equals(node.path("type").asText())) {
+ policyNode = node;
+ break;
+ }
+ }
+ }
+
+ if (policyNode != null) {
+ // Check if this is a floating license from policy
+ boolean policyFloating =
+ policyNode.path("attributes").path("floating").asBoolean(false);
+ int policyMaxMachines = policyNode.path("attributes").path("maxMachines").asInt(1);
+
+ // Policy takes precedence over license attributes
+ if (policyFloating) {
+ context.isFloatingLicense = true;
+ context.maxMachines = policyMaxMachines;
+ }
+
+ log.info(
+ "License floating (from policy): {}, maxMachines: {}",
+ context.isFloatingLicense,
+ context.maxMachines);
+ }
+
+ // Extract user count, default to 1 if not specified
int users =
jsonResponse
.path("data")
.path("attributes")
.path("metadata")
.path("users")
- .asInt(0);
+ .asInt(1);
applicationProperties.getPremium().setMaxUsers(users);
// Extract isEnterprise flag
- isEnterpriseLicense =
+ context.isEnterpriseLicense =
jsonResponse
.path("data")
.path("attributes")
@@ -520,10 +603,105 @@ public class KeygenLicenseVerifier {
return jsonResponse;
}
- private boolean activateMachine(String licenseKey, String licenseId, String machineFingerprint)
+ private boolean activateMachine(
+ String licenseKey, String licenseId, String machineFingerprint, LicenseContext context)
throws Exception {
- HttpClient client = HttpClient.newHttpClient();
+ // For floating licenses, we first need to check if we need to deregister any machines
+ if (context.isFloatingLicense) {
+ log.info(
+ "Processing floating license activation. Max machines allowed: {}",
+ context.maxMachines);
+ // Get the current machines for this license
+ JsonNode machinesResponse = fetchMachinesForLicense(licenseKey, licenseId);
+ if (machinesResponse != null) {
+ JsonNode machines = machinesResponse.path("data");
+ int currentMachines = machines.size();
+
+ log.info(
+ "Current machine count: {}, Max allowed: {}",
+ currentMachines,
+ context.maxMachines);
+
+ // Check if the current fingerprint is already activated
+ boolean isCurrentMachineActivated = false;
+ String currentMachineId = null;
+
+ for (JsonNode machine : machines) {
+ if (machineFingerprint.equals(
+ machine.path("attributes").path("fingerprint").asText())) {
+ isCurrentMachineActivated = true;
+ currentMachineId = machine.path("id").asText();
+ log.info(
+ "Current machine is already activated with ID: {}",
+ currentMachineId);
+ break;
+ }
+ }
+
+ // If the current machine is already activated, there's no need to do anything
+ if (isCurrentMachineActivated) {
+ log.info("Machine already activated. No action needed.");
+ return true;
+ }
+
+ // If we've reached the max machines limit, we need to deregister the oldest machine
+ if (currentMachines >= context.maxMachines) {
+ log.info(
+ "Max machines reached. Deregistering oldest machine to make room for the new machine.");
+
+ // Find the oldest machine based on creation timestamp
+ if (machines.size() > 0) {
+ // Find the machine with the oldest creation date
+ String oldestMachineId = null;
+ java.time.Instant oldestTime = null;
+
+ for (JsonNode machine : machines) {
+ String createdStr =
+ machine.path("attributes").path("created").asText(null);
+ if (createdStr != null && !createdStr.isEmpty()) {
+ try {
+ java.time.Instant createdTime =
+ java.time.Instant.parse(createdStr);
+ if (oldestTime == null || createdTime.isBefore(oldestTime)) {
+ oldestTime = createdTime;
+ oldestMachineId = machine.path("id").asText();
+ }
+ } catch (Exception e) {
+ log.warn(
+ "Could not parse creation time for machine: {}",
+ e.getMessage());
+ }
+ }
+ }
+
+ // If we couldn't determine the oldest by timestamp, use the first one
+ if (oldestMachineId == null) {
+ log.warn(
+ "Could not determine oldest machine by timestamp, using first machine in list");
+ oldestMachineId = machines.path(0).path("id").asText();
+ }
+
+ log.info("Deregistering machine with ID: {}", oldestMachineId);
+
+ boolean deregistered = deregisterMachine(licenseKey, oldestMachineId);
+ if (!deregistered) {
+ log.error(
+ "Failed to deregister machine. Cannot proceed with activation.");
+ return false;
+ }
+ log.info(
+ "Machine deregistered successfully. Proceeding with activation of new machine.");
+ } else {
+ log.error(
+ "License has reached machine limit but no machines were found to deregister. This is unexpected.");
+ // We'll still try to activate, but it might fail
+ }
+ }
+ }
+ }
+
+ // Proceed with machine activation
String hostname;
try {
hostname = java.net.InetAddress.getLocalHost().getHostName();
@@ -570,7 +748,8 @@ public class KeygenLicenseVerifier {
.POST(HttpRequest.BodyPublishers.ofString(body.toString()))
.build();
- HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
+ HttpResponse response =
+ httpClient.send(request, HttpResponse.BodyHandlers.ofString());
log.info("activateMachine Response body: " + response.body());
if (response.statusCode() == 201) {
log.info("Machine activated successfully");
@@ -588,4 +767,81 @@ public class KeygenLicenseVerifier {
private String generateMachineFingerprint() {
return GeneralUtils.generateMachineFingerprint();
}
+
+ /**
+ * Fetches all machines associated with a specific license
+ *
+ * @param licenseKey The license key to check
+ * @param licenseId The license ID
+ * @return JsonNode containing the list of machines, or null if an error occurs
+ * @throws Exception if an error occurs during the HTTP request
+ */
+ private JsonNode fetchMachinesForLicense(String licenseKey, String licenseId) throws Exception {
+ HttpRequest request =
+ HttpRequest.newBuilder()
+ .uri(
+ URI.create(
+ BASE_URL
+ + "/"
+ + ACCOUNT_ID
+ + "/licenses/"
+ + licenseId
+ + "/machines"))
+ .header("Content-Type", "application/vnd.api+json")
+ .header("Accept", "application/vnd.api+json")
+ .header("Authorization", "License " + licenseKey)
+ .GET()
+ .build();
+
+ HttpResponse response =
+ httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+ log.info("fetchMachinesForLicense Response body: {}", response.body());
+
+ if (response.statusCode() == 200) {
+ return objectMapper.readTree(response.body());
+ } else {
+ log.error(
+ "Error fetching machines for license. Status code: {}, error: {}",
+ response.statusCode(),
+ response.body());
+ return null;
+ }
+ }
+
+ /**
+ * Deregisters a machine from a license
+ *
+ * @param licenseKey The license key
+ * @param machineId The ID of the machine to deregister
+ * @return true if deregistration was successful, false otherwise
+ */
+ private boolean deregisterMachine(String licenseKey, String machineId) {
+ try {
+ HttpRequest request =
+ HttpRequest.newBuilder()
+ .uri(URI.create(BASE_URL + "/" + ACCOUNT_ID + "/machines/" + machineId))
+ .header("Content-Type", "application/vnd.api+json")
+ .header("Accept", "application/vnd.api+json")
+ .header("Authorization", "License " + licenseKey)
+ .DELETE()
+ .build();
+
+ HttpResponse response =
+ httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+ if (response.statusCode() == 204) {
+ log.info("Machine {} successfully deregistered", machineId);
+ return true;
+ } else {
+ log.error(
+ "Error deregistering machine. Status code: {}, error: {}",
+ response.statusCode(),
+ response.body());
+ return false;
+ }
+ } catch (Exception e) {
+ log.error("Exception during machine deregistration: {}", e.getMessage(), e);
+ return false;
+ }
+ }
}
diff --git a/src/main/java/stirling/software/SPDF/LibreOfficeListener.java b/src/main/java/stirling/software/SPDF/LibreOfficeListener.java
index 5b00700e8..2be2a082c 100644
--- a/src/main/java/stirling/software/SPDF/LibreOfficeListener.java
+++ b/src/main/java/stirling/software/SPDF/LibreOfficeListener.java
@@ -31,7 +31,8 @@ public class LibreOfficeListener {
log.info("waiting for listener to start");
try (Socket socket = new Socket()) {
socket.connect(
- new InetSocketAddress("localhost", 2002), 1000); // Timeout after 1 second
+ new InetSocketAddress("localhost", LISTENER_PORT),
+ 1000); // Timeout after 1 second
return true;
} catch (Exception e) {
return false;
diff --git a/src/main/java/stirling/software/SPDF/config/AppConfig.java b/src/main/java/stirling/software/SPDF/config/AppConfig.java
index f07368527..fd55a471d 100644
--- a/src/main/java/stirling/software/SPDF/config/AppConfig.java
+++ b/src/main/java/stirling/software/SPDF/config/AppConfig.java
@@ -5,6 +5,7 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
+import java.util.Locale;
import java.util.Properties;
import java.util.function.Predicate;
@@ -15,6 +16,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
+import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
@@ -33,6 +35,8 @@ public class AppConfig {
private final ApplicationProperties applicationProperties;
+ private final Environment env;
+
@Bean
@ConditionalOnProperty(name = "system.customHTMLFiles", havingValue = "true")
public SpringTemplateEngine templateEngine(ResourceLoader resourceLoader) {
@@ -193,4 +197,37 @@ public class AppConfig {
public String uuid() {
return applicationProperties.getAutomaticallyGenerated().getUUID();
}
+
+ @Bean(name = "disablePixel")
+ public boolean disablePixel() {
+ return Boolean.getBoolean(env.getProperty("DISABLE_PIXEL"));
+ }
+
+ @Bean(name = "machineType")
+ public String determineMachineType() {
+ try {
+ boolean isDocker = runningInDocker();
+ boolean isKubernetes = System.getenv("KUBERNETES_SERVICE_HOST") != null;
+ boolean isBrowserOpen = "true".equalsIgnoreCase(env.getProperty("BROWSER_OPEN"));
+
+ if (isKubernetes) {
+ return "Kubernetes";
+ } else if (isDocker) {
+ return "Docker";
+ } else if (isBrowserOpen) {
+ String os = System.getProperty("os.name").toLowerCase(Locale.ROOT);
+ if (os.contains("win")) {
+ return "Client-windows";
+ } else if (os.contains("mac")) {
+ return "Client-mac";
+ } else {
+ return "Client-unix";
+ }
+ } else {
+ return "Server-jar";
+ }
+ } catch (Exception e) {
+ return "Unknown";
+ }
+ }
}
diff --git a/src/main/java/stirling/software/SPDF/config/FileFallbackTemplateResolver.java b/src/main/java/stirling/software/SPDF/config/FileFallbackTemplateResolver.java
index b6315db92..8073f2358 100644
--- a/src/main/java/stirling/software/SPDF/config/FileFallbackTemplateResolver.java
+++ b/src/main/java/stirling/software/SPDF/config/FileFallbackTemplateResolver.java
@@ -11,8 +11,11 @@ import org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver;
import org.thymeleaf.templateresource.FileTemplateResource;
import org.thymeleaf.templateresource.ITemplateResource;
+import lombok.extern.slf4j.Slf4j;
+
import stirling.software.SPDF.model.InputStreamTemplateResource;
+@Slf4j
public class FileFallbackTemplateResolver extends AbstractConfigurableTemplateResolver {
private final ResourceLoader resourceLoader;
@@ -40,7 +43,8 @@ public class FileFallbackTemplateResolver extends AbstractConfigurableTemplateRe
return new FileTemplateResource(resource.getFile().getPath(), characterEncoding);
}
} catch (IOException e) {
-
+ // Log the exception to help with debugging issues loading external templates
+ log.warn("Unable to read template '{}' from file system", resourceName, e);
}
InputStream inputStream =
diff --git a/src/main/java/stirling/software/SPDF/config/InitialSetup.java b/src/main/java/stirling/software/SPDF/config/InitialSetup.java
index 44de07d38..0adc3d133 100644
--- a/src/main/java/stirling/software/SPDF/config/InitialSetup.java
+++ b/src/main/java/stirling/software/SPDF/config/InitialSetup.java
@@ -73,7 +73,7 @@ public class InitialSetup {
// Initialize Terms and Conditions
String termsUrl = applicationProperties.getLegal().getTermsAndConditions();
if (StringUtils.isEmpty(termsUrl)) {
- String defaultTermsUrl = "https://www.stirlingpdf.com/terms-and-conditions";
+ String defaultTermsUrl = "https://www.stirlingpdf.com/terms";
GeneralUtils.saveKeyToSettings("legal.termsAndConditions", defaultTermsUrl);
applicationProperties.getLegal().setTermsAndConditions(defaultTermsUrl);
}
diff --git a/src/main/java/stirling/software/SPDF/config/MetricsConfig.java b/src/main/java/stirling/software/SPDF/config/MetricsConfig.java
index ba216be75..7012ad517 100644
--- a/src/main/java/stirling/software/SPDF/config/MetricsConfig.java
+++ b/src/main/java/stirling/software/SPDF/config/MetricsConfig.java
@@ -15,7 +15,7 @@ public class MetricsConfig {
return new MeterFilter() {
@Override
public MeterFilterReply accept(Meter.Id id) {
- if (id.getName().equals("http.requests")) {
+ if ("http.requests".equals(id.getName())) {
return MeterFilterReply.NEUTRAL;
}
return MeterFilterReply.DENY;
diff --git a/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java b/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java
index d98c33257..d4ff7d167 100644
--- a/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java
+++ b/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java
@@ -5,7 +5,9 @@ import org.springframework.context.annotation.Configuration;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
@@ -31,14 +33,25 @@ public class OpenApiConfig {
// default version if all else fails
version = "1.0.0";
}
+ Info info =
+ new Info()
+ .title(DEFAULT_TITLE)
+ .version(version)
+ .license(
+ new License()
+ .name("MIT")
+ .url(
+ "https://raw.githubusercontent.com/Stirling-Tools/Stirling-PDF/refs/heads/main/LICENSE")
+ .identifier("MIT"))
+ .termsOfService("https://www.stirlingpdf.com/terms")
+ .contact(
+ new Contact()
+ .name("Stirling Software")
+ .url("https://www.stirlingpdf.com")
+ .email("contact@stirlingpdf.com"))
+ .description(DEFAULT_DESCRIPTION);
if (!applicationProperties.getSecurity().getEnableLogin()) {
- return new OpenAPI()
- .components(new Components())
- .info(
- new Info()
- .title(DEFAULT_TITLE)
- .version(version)
- .description(DEFAULT_DESCRIPTION));
+ return new OpenAPI().components(new Components()).info(info);
} else {
SecurityScheme apiKeyScheme =
new SecurityScheme()
@@ -47,11 +60,7 @@ public class OpenApiConfig {
.name("X-API-KEY");
return new OpenAPI()
.components(new Components().addSecuritySchemes("apiKey", apiKeyScheme))
- .info(
- new Info()
- .title(DEFAULT_TITLE)
- .version(version)
- .description(DEFAULT_DESCRIPTION))
+ .info(info)
.addSecurityItem(new SecurityRequirement().addList("apiKey"));
}
}
diff --git a/src/main/java/stirling/software/SPDF/config/security/mail/EmailService.java b/src/main/java/stirling/software/SPDF/config/security/mail/EmailService.java
index 8939fbab6..507e51599 100644
--- a/src/main/java/stirling/software/SPDF/config/security/mail/EmailService.java
+++ b/src/main/java/stirling/software/SPDF/config/security/mail/EmailService.java
@@ -37,8 +37,21 @@ public class EmailService {
*/
@Async
public void sendEmailWithAttachment(Email email) throws MessagingException {
- ApplicationProperties.Mail mailProperties = applicationProperties.getMail();
MultipartFile file = email.getFileInput();
+ // 1) Validate recipient email address
+ if (email.getTo() == null || email.getTo().trim().isEmpty()) {
+ throw new MessagingException("Invalid Addresses");
+ }
+
+ // 2) Validate attachment
+ if (file == null
+ || file.isEmpty()
+ || file.getOriginalFilename() == null
+ || file.getOriginalFilename().isEmpty()) {
+ throw new MessagingException("An attachment is required to send the email.");
+ }
+
+ ApplicationProperties.Mail mailProperties = applicationProperties.getMail();
// Creates a MimeMessage to represent the email
MimeMessage message = mailSender.createMimeMessage();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/AnalysisController.java b/src/main/java/stirling/software/SPDF/controller/api/AnalysisController.java
index 49c5bc81c..0fb2f2e8d 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/AnalysisController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/AnalysisController.java
@@ -59,7 +59,8 @@ public class AnalysisController {
description = "Returns title, author, subject, etc. Input:PDF Output:JSON Type:SISO")
public Map getDocumentProperties(@ModelAttribute PDFFile file)
throws IOException {
- // Load the document in read-only mode to prevent modifications and ensure the integrity of the original file.
+ // Load the document in read-only mode to prevent modifications and ensure the integrity of
+ // the original file.
try (PDDocument document = pdfDocumentFactory.load(file.getFileInput(), true)) {
PDDocumentInformation info = document.getDocumentInformation();
Map properties = new HashMap<>();
@@ -180,14 +181,16 @@ public class AnalysisController {
// Get permissions
Map permissions = new HashMap<>();
- permissions.put("canPrint", document.getCurrentAccessPermission().canPrint());
- permissions.put("canModify", document.getCurrentAccessPermission().canModify());
permissions.put(
- "canExtractContent",
- document.getCurrentAccessPermission().canExtractContent());
+ "preventPrinting", !document.getCurrentAccessPermission().canPrint());
permissions.put(
- "canModifyAnnotations",
- document.getCurrentAccessPermission().canModifyAnnotations());
+ "preventModify", !document.getCurrentAccessPermission().canModify());
+ permissions.put(
+ "preventExtractContent",
+ !document.getCurrentAccessPermission().canExtractContent());
+ permissions.put(
+ "preventModifyAnnotations",
+ !document.getCurrentAccessPermission().canModifyAnnotations());
securityInfo.put("permissions", permissions);
} else {
diff --git a/src/main/java/stirling/software/SPDF/controller/api/CropController.java b/src/main/java/stirling/software/SPDF/controller/api/CropController.java
index ad16c460e..0c4afc861 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/CropController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/CropController.java
@@ -39,8 +39,8 @@ public class CropController {
description =
"This operation takes an input PDF file and crops it according to the given"
+ " coordinates. Input:PDF Output:PDF Type:SISO")
- public ResponseEntity cropPdf(@ModelAttribute CropPdfForm form) throws IOException {
- PDDocument sourceDocument = pdfDocumentFactory.load(form);
+ public ResponseEntity cropPdf(@ModelAttribute CropPdfForm request) throws IOException {
+ PDDocument sourceDocument = pdfDocumentFactory.load(request);
PDDocument newDocument =
pdfDocumentFactory.createNewDocumentBasedOnOldDocument(sourceDocument);
@@ -64,7 +64,8 @@ public class CropController {
contentStream.saveGraphicsState();
// Define the crop area
- contentStream.addRect(form.getX(), form.getY(), form.getWidth(), form.getHeight());
+ contentStream.addRect(
+ request.getX(), request.getY(), request.getWidth(), request.getHeight());
contentStream.clip();
// Draw the entire formXObject
@@ -76,7 +77,11 @@ public class CropController {
// Now, set the new page's media box to the cropped size
newPage.setMediaBox(
- new PDRectangle(form.getX(), form.getY(), form.getWidth(), form.getHeight()));
+ new PDRectangle(
+ request.getX(),
+ request.getY(),
+ request.getWidth(),
+ request.getHeight()));
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
@@ -87,7 +92,7 @@ public class CropController {
byte[] pdfContent = baos.toByteArray();
return WebResponseUtils.bytesToWebResponse(
pdfContent,
- form.getFileInput().getOriginalFilename().replaceFirst("[.][^.]+$", "")
+ request.getFileInput().getOriginalFilename().replaceFirst("[.][^.]+$", "")
+ "_cropped.pdf");
}
}
diff --git a/src/main/java/stirling/software/SPDF/controller/api/EmailController.java b/src/main/java/stirling/software/SPDF/controller/api/EmailController.java
index 3b91368ef..dc1c9dff4 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/EmailController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/EmailController.java
@@ -3,11 +3,13 @@ package stirling.software.SPDF.controller.api;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
+import org.springframework.mail.MailSendException;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.mail.MessagingException;
@@ -41,11 +43,22 @@ public class EmailController {
* @return ResponseEntity with success or error message.
*/
@PostMapping(consumes = "multipart/form-data", value = "/send-email")
+ @Operation(
+ summary = "Send an email with an attachment",
+ description =
+ "This endpoint sends an email with an attachment. Input:PDF"
+ + " Output:Success/Failure Type:MISO")
public ResponseEntity sendEmailWithAttachment(@Valid @ModelAttribute Email email) {
+ log.info("Sending email to: {}", email.toString());
try {
// Calls the service to send the email with attachment
emailService.sendEmailWithAttachment(email);
return ResponseEntity.ok("Email sent successfully");
+ } catch (MailSendException ex) {
+ // handles your "Invalid Addresses" case
+ String errorMsg = ex.getMessage();
+ log.error("MailSendException: {}", errorMsg, ex);
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorMsg);
} catch (MessagingException e) {
// Catches any messaging exception (e.g., invalid email address, SMTP server issues)
String errorMsg = "Failed to send email: " + e.getMessage();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java
index a226bd02d..f8ee0d1b5 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java
@@ -117,20 +117,20 @@ public class MergeController {
"This endpoint merges multiple PDF files into a single PDF file. The merged"
+ " file will contain all pages from the input files in the order they were"
+ " provided. Input:PDF Output:PDF Type:MISO")
- public ResponseEntity mergePdfs(@ModelAttribute MergePdfsRequest form)
+ public ResponseEntity mergePdfs(@ModelAttribute MergePdfsRequest request)
throws IOException {
List filesToDelete = new ArrayList<>(); // List of temporary files to delete
File mergedTempFile = null;
PDDocument mergedDocument = null;
- boolean removeCertSign = form.isRemoveCertSign();
+ boolean removeCertSign = Boolean.TRUE.equals(request.getRemoveCertSign());
try {
- MultipartFile[] files = form.getFileInput();
+ MultipartFile[] files = request.getFileInput();
Arrays.sort(
files,
getSortComparator(
- form.getSortType())); // Sort files based on the given sort type
+ request.getSortType())); // Sort files based on the given sort type
PDFMergerUtility mergerUtility = new PDFMergerUtility();
long totalSize = 0;
diff --git a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java
index f8f4bd73c..bb795a08a 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java
@@ -47,7 +47,7 @@ public class MultiPageLayoutController {
int pagesPerSheet = request.getPagesPerSheet();
MultipartFile file = request.getFileInput();
- boolean addBorder = request.isAddBorder();
+ boolean addBorder = Boolean.TRUE.equals(request.getAddBorder());
if (pagesPerSheet != 2
&& pagesPerSheet != 3
diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java
index 5e0f1d012..b50e4eb96 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java
@@ -127,7 +127,7 @@ public class SplitPdfByChaptersController {
Path zipFile = null;
try {
- boolean includeMetadata = request.getIncludeMetadata();
+ boolean includeMetadata = Boolean.TRUE.equals(request.getIncludeMetadata());
Integer bookmarkLevel =
request.getBookmarkLevel(); // levels start from 0 (top most bookmarks)
if (bookmarkLevel < 0) {
@@ -161,7 +161,7 @@ public class SplitPdfByChaptersController {
.body("Unable to extract outline items".getBytes());
}
- boolean allowDuplicates = request.getAllowDuplicates();
+ boolean allowDuplicates = Boolean.TRUE.equals(request.getAllowDuplicates());
if (!allowDuplicates) {
/*
duplicates are generated when multiple bookmarks correspond to the same page,
diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java
index a2b0e2add..fec4e2657 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java
@@ -60,7 +60,7 @@ public class SplitPdfBySectionsController {
// Process the PDF based on split parameters
int horiz = request.getHorizontalDivisions() + 1;
int verti = request.getVerticalDivisions() + 1;
- boolean merge = request.isMerge();
+ boolean merge = Boolean.TRUE.equals(request.getMerge());
List splitDocuments = splitPdfPages(sourceDocument, verti, horiz);
String filename =
diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java
index ce4770499..aa4ae9a00 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java
@@ -3,7 +3,6 @@ package stirling.software.SPDF.controller.api;
import java.io.IOException;
import java.security.Principal;
import java.sql.SQLException;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -168,13 +167,23 @@ public class UserController {
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
@PostMapping("/updateUserSettings")
- public String updateUserSettings(HttpServletRequest request, Principal principal)
+ /**
+ * Updates the user settings based on the provided JSON payload.
+ *
+ * @param updates A map containing the settings to update. The expected structure is:
+ *
+ *
emailNotifications (optional): "true" or "false" - Enable or disable email notifications.
+ *
theme (optional): "light" or "dark" - Set the user's preferred theme.
+ *
language (optional): A string representing the preferred language (e.g., "en", "fr").
+ *
+ * Keys not listed above will be ignored.
+ * @param principal The currently authenticated user.
+ * @return A redirect string to the account page after updating the settings.
+ * @throws SQLException If a database error occurs.
+ * @throws UnsupportedProviderException If the operation is not supported for the user's provider.
+ */
+ public String updateUserSettings(@RequestBody Map updates, Principal principal)
throws SQLException, UnsupportedProviderException {
- Map paramMap = request.getParameterMap();
- Map updates = new HashMap<>();
- for (Map.Entry entry : paramMap.entrySet()) {
- updates.put(entry.getKey(), entry.getValue()[0]);
- }
log.debug("Processed updates: {}", updates);
// Assuming you have a method in userService to update the settings for a user
userService.updateUserSettings(principal.getName(), updates);
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java
index 2fad77e37..ae46f5d45 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java
@@ -58,7 +58,7 @@ public class ConvertImgPDFController {
String imageFormat = request.getImageFormat();
String singleOrMultiple = request.getSingleOrMultiple();
String colorType = request.getColorType();
- String dpi = request.getDpi();
+ int dpi = request.getDpi();
String pageNumbers = request.getPageNumbers();
Path tempFile = null;
Path tempOutputDir = null;
@@ -94,7 +94,7 @@ public class ConvertImgPDFController {
: imageFormat.toUpperCase(),
colorTypeResult,
singleImage,
- Integer.valueOf(dpi),
+ dpi,
filename);
if (result == null || result.length == 0) {
log.error("resultant bytes for {} is null, error converting ", filename);
@@ -132,7 +132,7 @@ public class ConvertImgPDFController {
command.add(tempOutputDir.toString());
}
command.add("--dpi");
- command.add(dpi);
+ command.add(String.valueOf(dpi));
ProcessExecutorResult resultProcess =
ProcessExecutor.getInstance(ProcessExecutor.Processes.PYTHON_OPENCV)
.runCommandWithOutputHandling(command);
@@ -213,7 +213,7 @@ public class ConvertImgPDFController {
MultipartFile[] file = request.getFileInput();
String fitOption = request.getFitOption();
String colorType = request.getColorType();
- boolean autoRotate = request.isAutoRotate();
+ boolean autoRotate = Boolean.TRUE.equals(request.getAutoRotate());
// Handle Null entries for formdata
if (colorType == null || colorType.isBlank()) {
colorType = "color";
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java
index b8a190f90..f0c999a45 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java
@@ -47,9 +47,9 @@ public class ConvertMarkdownToPdf {
description =
"This endpoint takes a Markdown file input, converts it to HTML, and then to"
+ " PDF format. Input:MARKDOWN Output:PDF Type:SISO")
- public ResponseEntity markdownToPdf(@ModelAttribute GeneralFile request)
+ public ResponseEntity markdownToPdf(@ModelAttribute GeneralFile generalFile)
throws Exception {
- MultipartFile fileInput = request.getFileInput();
+ MultipartFile fileInput = generalFile.getFileInput();
if (fileInput == null) {
throw new IllegalArgumentException("Please provide a Markdown file for conversion.");
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java
index 38a0ac16e..52976b44d 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java
@@ -90,9 +90,9 @@ public class ConvertOfficeController {
description =
"This endpoint converts a given file to a PDF using LibreOffice API Input:ANY"
+ " Output:PDF Type:SISO")
- public ResponseEntity processFileToPDF(@ModelAttribute GeneralFile request)
+ public ResponseEntity processFileToPDF(@ModelAttribute GeneralFile generalFile)
throws Exception {
- MultipartFile inputFile = request.getFileInput();
+ MultipartFile inputFile = generalFile.getFileInput();
// unused but can start server instance if startup time is to long
// LibreOfficeListener.getInstance().start();
File file = null;
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToHtml.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToHtml.java
index beafd3896..c3233f4d7 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToHtml.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToHtml.java
@@ -23,9 +23,8 @@ public class ConvertPDFToHtml {
summary = "Convert PDF to HTML",
description =
"This endpoint converts a PDF file to HTML format. Input:PDF Output:HTML Type:SISO")
- public ResponseEntity processPdfToHTML(@ModelAttribute PDFFile request)
- throws Exception {
- MultipartFile inputFile = request.getFileInput();
+ public ResponseEntity processPdfToHTML(@ModelAttribute PDFFile file) throws Exception {
+ MultipartFile inputFile = file.getFileInput();
PDFToFile pdfToFile = new PDFToFile();
return pdfToFile.processPdfToHtml(inputFile);
}
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java
index 76f0b9286..c2563887c 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java
@@ -97,9 +97,8 @@ public class ConvertPDFToOffice {
description =
"This endpoint converts a PDF file to an XML file. Input:PDF Output:XML"
+ " Type:SISO")
- public ResponseEntity processPdfToXML(@ModelAttribute PDFFile request)
- throws Exception {
- MultipartFile inputFile = request.getFileInput();
+ public ResponseEntity processPdfToXML(@ModelAttribute PDFFile file) throws Exception {
+ MultipartFile inputFile = file.getFileInput();
PDFToFile pdfToFile = new PDFToFile();
return pdfToFile.processPdfToOfficeFormat(inputFile, "xml", "writer_pdf_import");
diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java
index 878936534..4ee3f7606 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java
@@ -52,12 +52,12 @@ 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> pdfToCsv(@ModelAttribute PDFWithPageNums form) throws Exception {
- String baseName = getBaseName(form.getFileInput().getOriginalFilename());
+ public ResponseEntity> pdfToCsv(@ModelAttribute PDFWithPageNums request) throws Exception {
+ String baseName = getBaseName(request.getFileInput().getOriginalFilename());
List csvEntries = new ArrayList<>();
- try (PDDocument document = pdfDocumentFactory.load(form)) {
- List pages = form.getPageNumbersList(document, true);
+ try (PDDocument document = pdfDocumentFactory.load(request)) {
+ List pages = request.getPageNumbersList(document, true);
SpreadsheetExtractionAlgorithm sea = new SpreadsheetExtractionAlgorithm();
CSVFormat format =
CSVFormat.EXCEL.builder().setEscape('"').setQuoteMode(QuoteMode.ALL).build();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java b/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java
index 935118a7d..09d93a8b0 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java
@@ -77,7 +77,7 @@ public class FilterController {
public ResponseEntity pageCount(@ModelAttribute PDFComparisonAndCount request)
throws IOException, InterruptedException {
MultipartFile inputFile = request.getFileInput();
- String pageCount = request.getPageCount();
+ int pageCount = request.getPageCount();
String comparator = request.getComparator();
// Load the PDF
PDDocument document = pdfDocumentFactory.load(inputFile);
@@ -87,13 +87,13 @@ public class FilterController {
// Perform the comparison
switch (comparator) {
case "Greater":
- valid = actualPageCount > Integer.parseInt(pageCount);
+ valid = actualPageCount > pageCount;
break;
case "Equal":
- valid = actualPageCount == Integer.parseInt(pageCount);
+ valid = actualPageCount == pageCount;
break;
case "Less":
- valid = actualPageCount < Integer.parseInt(pageCount);
+ valid = actualPageCount < pageCount;
break;
default:
throw new IllegalArgumentException("Invalid comparator: " + comparator);
@@ -153,7 +153,7 @@ public class FilterController {
public ResponseEntity fileSize(@ModelAttribute FileSizeRequest request)
throws IOException, InterruptedException {
MultipartFile inputFile = request.getFileInput();
- String fileSize = request.getFileSize();
+ long fileSize = request.getFileSize();
String comparator = request.getComparator();
// Get the file size
@@ -163,13 +163,13 @@ public class FilterController {
// Perform the comparison
switch (comparator) {
case "Greater":
- valid = actualFileSize > Long.parseLong(fileSize);
+ valid = actualFileSize > fileSize;
break;
case "Equal":
- valid = actualFileSize == Long.parseLong(fileSize);
+ valid = actualFileSize == fileSize;
break;
case "Less":
- valid = actualFileSize < Long.parseLong(fileSize);
+ valid = actualFileSize < fileSize;
break;
default:
throw new IllegalArgumentException("Invalid comparator: " + comparator);
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java
index 5d6ce4516..e628a98bb 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java
@@ -47,7 +47,7 @@ public class AutoRenameController {
public ResponseEntity extractHeader(@ModelAttribute ExtractHeaderRequest request)
throws Exception {
MultipartFile file = request.getFileInput();
- Boolean useFirstTextAsFallback = request.isUseFirstTextAsFallback();
+ boolean useFirstTextAsFallback = Boolean.TRUE.equals(request.getUseFirstTextAsFallback());
PDDocument document = pdfDocumentFactory.load(file);
PDFTextStripper reader =
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java
index 4e976d12d..b7cb7541d 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java
@@ -113,7 +113,7 @@ public class AutoSplitPdfController {
public ResponseEntity autoSplitPdf(@ModelAttribute AutoSplitPdfRequest request)
throws IOException {
MultipartFile file = request.getFileInput();
- boolean duplexMode = request.isDuplexMode();
+ boolean duplexMode = Boolean.TRUE.equals(request.getDuplexMode());
PDDocument document = null;
List splitDocuments = new ArrayList<>();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java
index 79d46cc45..cbaa12a0c 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java
@@ -627,23 +627,30 @@ public class CompressController {
// Scale factors for different optimization levels
private double getScaleFactorForLevel(int optimizeLevel) {
return switch (optimizeLevel) {
- case 4 -> 0.9; // 90% - lite compression
- case 5 -> 0.8; // 80% - lite compression
- case 6 -> 0.7; // 70% - lite compression
- case 7 -> 0.6; // 60% - intense compression
- case 8 -> 0.5; // 50% - intense compression
- case 9, 10 -> 0.4; // 40% - intense compression
- default -> 1.0; // No scaling for levels 1-3
+ case 3 -> 0.85;
+ case 4 -> 0.75;
+ case 5 -> 0.65;
+ case 6 -> 0.55;
+ case 7 -> 0.45;
+ case 8 -> 0.35;
+ case 9 -> 0.25;
+ case 10 -> 0.15;
+ default -> 1.0;
};
}
// JPEG quality for different optimization levels
private float getJpegQualityForLevel(int optimizeLevel) {
return switch (optimizeLevel) {
- case 7 -> 0.8f; // 80% quality
- case 8 -> 0.6f; // 60% quality
- case 9, 10 -> 0.4f; // 40% quality
- default -> 0.7f; // 70% quality for levels 1-6
+ case 3 -> 0.85f;
+ case 4 -> 0.80f;
+ case 5 -> 0.75f;
+ case 6 -> 0.70f;
+ case 7 -> 0.60f;
+ case 8 -> 0.50f;
+ case 9 -> 0.35f;
+ case 10 -> 0.2f;
+ default -> 0.7f;
};
}
@@ -698,7 +705,7 @@ public class CompressController {
while (!sizeMet && optimizeLevel <= 9) {
// Apply image compression for levels 4-9
- if ((optimizeLevel >= 4 || Boolean.TRUE.equals(convertToGrayscale))
+ if ((optimizeLevel >= 3 || Boolean.TRUE.equals(convertToGrayscale))
&& !imageCompressionApplied) {
double scaleFactor = getScaleFactorForLevel(optimizeLevel);
float jpegQuality = getJpegQualityForLevel(optimizeLevel);
@@ -790,10 +797,14 @@ public class CompressController {
log.info("Pre-QPDF file size: {}", GeneralUtils.formatBytes(preQpdfSize));
// Map optimization levels to QPDF compression levels
- int qpdfCompressionLevel =
- optimizeLevel <= 3
- ? optimizeLevel * 3 // Level 1->3, 2->6, 3->9
- : 9; // Max compression for levels 4-9
+ int qpdfCompressionLevel;
+ if (optimizeLevel == 1) {
+ qpdfCompressionLevel = 5;
+ } else if (optimizeLevel == 2) {
+ qpdfCompressionLevel = 9;
+ } else {
+ qpdfCompressionLevel = 9;
+ }
// Create output file for QPDF
Path qpdfOutputFile = Files.createTempFile("qpdf_output_", ".pdf");
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java
index 67019559e..5a01ad103 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java
@@ -18,14 +18,13 @@ import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.parameters.RequestBody;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
@@ -58,24 +57,11 @@ public class ExtractImageScansController {
+ " minimum contour area, and border size. Input:PDF Output:IMAGE/ZIP"
+ " Type:SIMO")
public ResponseEntity extractImageScans(
- @RequestBody(
- description = "Form data containing file and extraction parameters",
- required = true,
- content =
- @Content(
- mediaType = "multipart/form-data",
- schema =
- @Schema(
- implementation =
- ExtractImageScansRequest
- .class) // This should
- // represent
- // your form's
- // structure
- ))
- ExtractImageScansRequest form)
+ @ModelAttribute ExtractImageScansRequest request)
throws IOException, InterruptedException {
- String fileName = form.getFileInput().getOriginalFilename();
+ MultipartFile inputFile = request.getFileInput();
+
+ String fileName = inputFile.getOriginalFilename();
String extension = fileName.substring(fileName.lastIndexOf(".") + 1);
List images = new ArrayList<>();
@@ -94,7 +80,7 @@ public class ExtractImageScansController {
// Check if input file is a PDF
if ("pdf".equalsIgnoreCase(extension)) {
// Load PDF document
- try (PDDocument document = pdfDocumentFactory.load(form.getFileInput())) {
+ try (PDDocument document = pdfDocumentFactory.load(inputFile)) {
PDFRenderer pdfRenderer = new PDFRenderer(document);
pdfRenderer.setSubsamplingAllowed(true);
int pageCount = document.getNumberOfPages();
@@ -116,7 +102,7 @@ public class ExtractImageScansController {
}
} else {
tempInputFile = Files.createTempFile("input_", "." + extension);
- form.getFileInput().transferTo(tempInputFile);
+ inputFile.transferTo(tempInputFile);
// Add input file path to images list
images.add(tempInputFile.toString());
}
@@ -136,15 +122,15 @@ public class ExtractImageScansController {
images.get(i),
tempDir.toString(),
"--angle_threshold",
- String.valueOf(form.getAngleThreshold()),
+ String.valueOf(request.getAngleThreshold()),
"--tolerance",
- String.valueOf(form.getTolerance()),
+ String.valueOf(request.getTolerance()),
"--min_area",
- String.valueOf(form.getMinArea()),
+ String.valueOf(request.getMinArea()),
"--min_contour_area",
- String.valueOf(form.getMinContourArea()),
+ String.valueOf(request.getMinContourArea()),
"--border_size",
- String.valueOf(form.getBorderSize())));
+ String.valueOf(request.getBorderSize())));
// Run CLI command
ProcessExecutorResult returnCode =
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java
index 187eda305..e03916745 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java
@@ -64,7 +64,7 @@ public class ExtractImagesController {
throws IOException, InterruptedException, ExecutionException {
MultipartFile file = request.getFileInput();
String format = request.getFormat();
- boolean allowDuplicates = request.isAllowDuplicates();
+ boolean allowDuplicates = Boolean.TRUE.equals(request.getAllowDuplicates());
PDDocument document = pdfDocumentFactory.load(file);
// Determine if multithreading should be used based on PDF size or number of pages
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java
index 10e4f6fdd..3e90132b6 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java
@@ -65,7 +65,7 @@ public class MetadataController {
MultipartFile pdfFile = request.getFileInput();
// Extract metadata information
- Boolean deleteAll = request.isDeleteAll();
+ boolean deleteAll = Boolean.TRUE.equals(request.getDeleteAll());
String author = request.getAuthor();
String creationDate = request.getCreationDate();
String creator = request.getCreator();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java
index 51ca9f9ff..40773ab0d 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java
@@ -43,7 +43,7 @@ public class OverlayImageController {
MultipartFile imageFile = request.getImageFile();
float x = request.getX();
float y = request.getY();
- boolean everyPage = request.isEveryPage();
+ boolean everyPage = Boolean.TRUE.equals(request.getEveryPage());
try {
byte[] pdfBytes = pdfFile.getBytes();
byte[] imageBytes = imageFile.getBytes();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java
index cdae7dfad..ae31bd01b 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java
@@ -49,33 +49,30 @@ public class PageNumbersController {
MultipartFile file = request.getFileInput();
String customMargin = request.getCustomMargin();
int position = request.getPosition();
- int startingNumber = request.getStartingNumber();
+ int pageNumber = request.getStartingNumber();
String pagesToNumber = request.getPagesToNumber();
String customText = request.getCustomText();
- int pageNumber = startingNumber;
+ float fontSize = request.getFontSize();
+ String fontType = request.getFontType();
+
PDDocument document = pdfDocumentFactory.load(file);
- float font_size = request.getFontSize();
- String font_type = request.getFontType();
float marginFactor;
switch (customMargin.toLowerCase()) {
case "small":
marginFactor = 0.02f;
break;
- case "medium":
- marginFactor = 0.035f;
- break;
case "large":
marginFactor = 0.05f;
break;
case "x-large":
marginFactor = 0.075f;
break;
+ case "medium":
default:
marginFactor = 0.035f;
break;
}
- float fontSize = font_size;
if (pagesToNumber == null || pagesToNumber.isEmpty()) {
pagesToNumber = "all";
}
@@ -99,7 +96,7 @@ public class PageNumbersController {
.replaceFirst("[.][^.]+$", ""));
PDType1Font currentFont =
- switch (font_type.toLowerCase()) {
+ switch (fontType.toLowerCase()) {
case "courier" -> new PDType1Font(Standard14Fonts.FontName.COURIER);
case "times" -> new PDType1Font(Standard14Fonts.FontName.TIMES_ROMAN);
default -> new PDType1Font(Standard14Fonts.FontName.HELVETICA);
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java
index 1a358b08e..01d9049df 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java
@@ -40,9 +40,9 @@ public class RepairController {
"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 repairPdf(@ModelAttribute PDFFile request)
+ public ResponseEntity repairPdf(@ModelAttribute PDFFile file)
throws IOException, InterruptedException {
- MultipartFile inputFile = request.getFileInput();
+ MultipartFile inputFile = file.getFileInput();
// Save the uploaded file to a temporary location
Path tempInputFile = Files.createTempFile("input_", ".pdf");
byte[] pdfBytes = null;
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java
index 865724a74..85fb7cfc3 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java
@@ -31,18 +31,18 @@ public class ReplaceAndInvertColorController {
@Operation(
summary = "Replace-Invert Color PDF",
description =
- "This endpoint accepts a PDF file and option of invert all colors or replace text and background colors. Input:PDF Output:PDF Type:SISO")
+ "This endpoint accepts a PDF file and option of invert all colors or replace"
+ + " text and background colors. Input:PDF Output:PDF Type:SISO")
public ResponseEntity replaceAndInvertColor(
- @ModelAttribute ReplaceAndInvertColorRequest replaceAndInvertColorRequest)
- throws IOException {
+ @ModelAttribute ReplaceAndInvertColorRequest request) throws IOException {
InputStreamResource resource =
replaceAndInvertColorService.replaceAndInvertColor(
- replaceAndInvertColorRequest.getFileInput(),
- replaceAndInvertColorRequest.getReplaceAndInvertOption(),
- replaceAndInvertColorRequest.getHighContrastColorCombination(),
- replaceAndInvertColorRequest.getBackGroundColor(),
- replaceAndInvertColorRequest.getTextColor());
+ request.getFileInput(),
+ request.getReplaceAndInvertOption(),
+ request.getHighContrastColorCombination(),
+ request.getBackGroundColor(),
+ request.getTextColor());
// Return the modified PDF as a downloadable file
return ResponseEntity.ok()
diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java
index 400650be3..f6aab4527 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java
@@ -36,8 +36,8 @@ public class ShowJavascript {
@Operation(
summary = "Grabs all JS from a PDF and returns a single JS file with all code",
description = "desc. Input:PDF Output:JS Type:SISO")
- public ResponseEntity extractHeader(@ModelAttribute PDFFile request) throws Exception {
- MultipartFile inputFile = request.getFileInput();
+ public ResponseEntity extractHeader(@ModelAttribute PDFFile file) throws Exception {
+ MultipartFile inputFile = file.getFileInput();
String script = "";
try (PDDocument document = pdfDocumentFactory.load(inputFile)) {
diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java
index 2833ee99e..12c131f59 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java
@@ -93,6 +93,7 @@ public class PipelineProcessor {
ByteArrayOutputStream logStream = new ByteArrayOutputStream();
PrintStream logPrintStream = new PrintStream(logStream);
boolean hasErrors = false;
+ boolean filtersApplied = false;
for (PipelineOperation pipelineOperation : config.getOperations()) {
String operation = pipelineOperation.getOperation();
boolean isMultiInputOperation = apiDocService.isMultiInput(operation);
@@ -134,7 +135,7 @@ public class PipelineProcessor {
if (operation.startsWith("filter-")
&& (response.getBody() == null
|| response.getBody().length == 0)) {
- result.setFiltersApplied(true);
+ filtersApplied = true;
log.info("Skipping file due to filtering {}", operation);
continue;
}
@@ -215,12 +216,12 @@ public class PipelineProcessor {
log.error("Errors occurred during processing. Log: {}", logStream.toString());
}
result.setHasErrors(hasErrors);
- result.setFiltersApplied(hasErrors);
+ result.setFiltersApplied(filtersApplied);
result.setOutputFiles(outputFiles);
return result;
}
- private ResponseEntity sendWebRequest(String url, MultiValueMap body) {
+ /* package */ ResponseEntity sendWebRequest(String url, MultiValueMap body) {
RestTemplate restTemplate = new RestTemplate();
// Set up headers, including API key
HttpHeaders headers = new HttpHeaders();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java
index 58e5b848c..e853faa62 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java
@@ -146,8 +146,8 @@ public class CertSignController {
summary = "Sign PDF with a Digital Certificate",
description =
"This endpoint accepts a PDF file, a digital certificate and related"
- + " information to sign the PDF. It then returns the digitally signed PDF"
- + " file. Input:PDF Output:PDF Type:SISO")
+ + " information to sign the PDF. It then returns the digitally signed PDF"
+ + " file. Input:PDF Output:PDF Type:SISO")
public ResponseEntity signPDFWithCert(@ModelAttribute SignPDFWithCertRequest request)
throws Exception {
MultipartFile pdf = request.getFileInput();
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java b/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java
index 830810628..90fd03dea 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java
@@ -63,25 +63,27 @@ public class PasswordController {
String ownerPassword = request.getOwnerPassword();
String password = request.getPassword();
int keyLength = request.getKeyLength();
- boolean canAssembleDocument = request.isCanAssembleDocument();
- boolean canExtractContent = request.isCanExtractContent();
- boolean canExtractForAccessibility = request.isCanExtractForAccessibility();
- boolean canFillInForm = request.isCanFillInForm();
- boolean canModify = request.isCanModify();
- boolean canModifyAnnotations = request.isCanModifyAnnotations();
- boolean canPrint = request.isCanPrint();
- boolean canPrintFaithful = request.isCanPrintFaithful();
+ boolean preventAssembly = Boolean.TRUE.equals(request.getPreventAssembly());
+ boolean preventExtractContent = Boolean.TRUE.equals(request.getPreventExtractContent());
+ boolean preventExtractForAccessibility =
+ Boolean.TRUE.equals(request.getPreventExtractForAccessibility());
+ boolean preventFillInForm = Boolean.TRUE.equals(request.getPreventFillInForm());
+ boolean preventModify = Boolean.TRUE.equals(request.getPreventModify());
+ boolean preventModifyAnnotations =
+ Boolean.TRUE.equals(request.getPreventModifyAnnotations());
+ boolean preventPrinting = Boolean.TRUE.equals(request.getPreventPrinting());
+ boolean preventPrintingFaithful = Boolean.TRUE.equals(request.getPreventPrintingFaithful());
PDDocument document = pdfDocumentFactory.load(fileInput);
AccessPermission ap = new AccessPermission();
- ap.setCanAssembleDocument(!canAssembleDocument);
- ap.setCanExtractContent(!canExtractContent);
- ap.setCanExtractForAccessibility(!canExtractForAccessibility);
- ap.setCanFillInForm(!canFillInForm);
- ap.setCanModify(!canModify);
- ap.setCanModifyAnnotations(!canModifyAnnotations);
- ap.setCanPrint(!canPrint);
- ap.setCanPrintFaithful(!canPrintFaithful);
+ ap.setCanAssembleDocument(!preventAssembly);
+ ap.setCanExtractContent(!preventExtractContent);
+ ap.setCanExtractForAccessibility(!preventExtractForAccessibility);
+ ap.setCanFillInForm(!preventFillInForm);
+ ap.setCanModify(!preventModify);
+ ap.setCanModifyAnnotations(!preventModifyAnnotations);
+ ap.setCanPrint(!preventPrinting);
+ ap.setCanPrintFaithful(!preventPrintingFaithful);
StandardProtectionPolicy spp = new StandardProtectionPolicy(ownerPassword, password, ap);
if (!"".equals(ownerPassword) || !"".equals(password)) {
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java
index 0c8a7f7e6..72571e2d7 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java
@@ -75,7 +75,7 @@ public class RedactController {
redactPages(request, document, allPages);
redactAreas(redactionAreas, document, allPages);
- if (request.isConvertPDFToImage()) {
+ if (Boolean.TRUE.equals(request.getConvertPDFToImage())) {
PDDocument convertedPdf = PdfUtils.convertPdfToPdfImage(document);
document.close();
document = convertedPdf;
@@ -170,14 +170,14 @@ public class RedactController {
}
private Color decodeOrDefault(String hex, Color defaultColor) {
- Color color = null;
try {
- color = Color.decode(hex);
+ if (hex != null && !hex.startsWith("#")) {
+ hex = "#" + hex;
+ }
+ return Color.decode(hex);
} catch (Exception e) {
- color = defaultColor;
+ return defaultColor;
}
-
- return color;
}
private List getPageNumbers(ManualRedactPdfRequest request, int pagesCount) {
@@ -200,11 +200,11 @@ public class RedactController {
throws Exception {
MultipartFile file = request.getFileInput();
String listOfTextString = request.getListOfText();
- boolean useRegex = request.isUseRegex();
- boolean wholeWordSearchBool = request.isWholeWordSearch();
+ boolean useRegex = Boolean.TRUE.equals(request.getUseRegex());
+ boolean wholeWordSearchBool = Boolean.TRUE.equals(request.getWholeWordSearch());
String colorString = request.getRedactColor();
float customPadding = request.getCustomPadding();
- boolean convertPDFToImage = request.isConvertPDFToImage();
+ boolean convertPDFToImage = Boolean.TRUE.equals(request.getConvertPDFToImage());
String[] listOfText = listOfTextString.split("\n");
PDDocument document = pdfDocumentFactory.load(file);
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java b/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java
index 42dbfef64..9be4cacbc 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java
@@ -46,12 +46,12 @@ public class SanitizeController {
public ResponseEntity sanitizePDF(@ModelAttribute SanitizePdfRequest request)
throws IOException {
MultipartFile inputFile = request.getFileInput();
- boolean removeJavaScript = request.isRemoveJavaScript();
- boolean removeEmbeddedFiles = request.isRemoveEmbeddedFiles();
- boolean removeXMPMetadata = request.isRemoveXMPMetadata();
- boolean removeMetadata = request.isRemoveMetadata();
- boolean removeLinks = request.isRemoveLinks();
- boolean removeFonts = request.isRemoveFonts();
+ boolean removeJavaScript = Boolean.TRUE.equals(request.getRemoveJavaScript());
+ boolean removeEmbeddedFiles = Boolean.TRUE.equals(request.getRemoveEmbeddedFiles());
+ boolean removeXMPMetadata = Boolean.TRUE.equals(request.getRemoveXMPMetadata());
+ boolean removeMetadata = Boolean.TRUE.equals(request.getRemoveMetadata());
+ boolean removeLinks = Boolean.TRUE.equals(request.getRemoveLinks());
+ boolean removeFonts = Boolean.TRUE.equals(request.getRemoveFonts());
PDDocument document = pdfDocumentFactory.load(inputFile, true);
if (removeJavaScript) {
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/ValidateSignatureController.java b/src/main/java/stirling/software/SPDF/controller/api/security/ValidateSignatureController.java
index 361bc1e3f..67f776408 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/security/ValidateSignatureController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/security/ValidateSignatureController.java
@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.security;
+import java.beans.PropertyEditorSupport;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.security.cert.CertificateException;
@@ -23,6 +24,8 @@ import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoVerifierBuilder;
import org.bouncycastle.util.Store;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -48,6 +51,18 @@ public class ValidateSignatureController {
private final CustomPDFDocumentFactory pdfDocumentFactory;
private final CertificateValidationService certValidationService;
+ @InitBinder
+ public void initBinder(WebDataBinder binder) {
+ binder.registerCustomEditor(
+ MultipartFile.class,
+ new PropertyEditorSupport() {
+ @Override
+ public void setAsText(String text) throws IllegalArgumentException {
+ setValue(null);
+ }
+ });
+ }
+
@Operation(
summary = "Validate PDF Digital Signature",
description =
@@ -58,12 +73,12 @@ public class ValidateSignatureController {
@ModelAttribute SignatureValidationRequest request) throws IOException {
List results = new ArrayList<>();
MultipartFile file = request.getFileInput();
+ MultipartFile certFile = request.getCertFile();
// Load custom certificate if provided
X509Certificate customCert = null;
- if (request.getCertFile() != null && !request.getCertFile().isEmpty()) {
- try (ByteArrayInputStream certStream =
- new ByteArrayInputStream(request.getCertFile().getBytes())) {
+ if (certFile != null && !certFile.isEmpty()) {
+ try (ByteArrayInputStream certStream = new ByteArrayInputStream(certFile.getBytes())) {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
customCert = (X509Certificate) cf.generateCertificate(certStream);
} catch (CertificateException e) {
diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java
index c477a88f8..14d23ac09 100644
--- a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java
+++ b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java
@@ -2,6 +2,7 @@ package stirling.software.SPDF.controller.api.security;
import java.awt.*;
import java.awt.image.BufferedImage;
+import java.beans.PropertyEditorSupport;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -24,6 +25,8 @@ import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.util.Matrix;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -49,6 +52,18 @@ public class WatermarkController {
private final CustomPDFDocumentFactory pdfDocumentFactory;
+ @InitBinder
+ public void initBinder(WebDataBinder binder) {
+ binder.registerCustomEditor(
+ MultipartFile.class,
+ new PropertyEditorSupport() {
+ @Override
+ public void setAsText(String text) throws IllegalArgumentException {
+ setValue(null);
+ }
+ });
+ }
+
@PostMapping(consumes = "multipart/form-data", value = "/add-watermark")
@Operation(
summary = "Add watermark to a PDF file",
@@ -69,7 +84,7 @@ public class WatermarkController {
int widthSpacer = request.getWidthSpacer();
int heightSpacer = request.getHeightSpacer();
String customColor = request.getCustomColor();
- boolean convertPdfToImage = request.isConvertPDFToImage();
+ boolean convertPdfToImage = Boolean.TRUE.equals(request.getConvertPDFToImage());
// Load the input PDF
PDDocument document = pdfDocumentFactory.load(pdfFile);
diff --git a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java b/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java
index 9a3b2b3e2..9fc644863 100644
--- a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java
+++ b/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java
@@ -77,9 +77,8 @@ public class HomeWebController {
}
@GetMapping("/home-legacy")
- public String homeLegacy(Model model) {
- model.addAttribute("currentPage", "home-legacy");
- return "home-legacy";
+ public String redirectHomeLegacy() {
+ return "redirect:/";
}
@GetMapping(value = "/robots.txt", produces = MediaType.TEXT_PLAIN_VALUE)
diff --git a/src/main/java/stirling/software/SPDF/controller/web/UploadLimitService.java b/src/main/java/stirling/software/SPDF/controller/web/UploadLimitService.java
index 200df6d07..9a074b6e4 100644
--- a/src/main/java/stirling/software/SPDF/controller/web/UploadLimitService.java
+++ b/src/main/java/stirling/software/SPDF/controller/web/UploadLimitService.java
@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.web;
+import java.util.Locale;
import java.util.regex.Pattern;
import org.springframework.beans.factory.annotation.Autowired;
@@ -52,6 +53,6 @@ public class UploadLimitService {
if (bytes < 1024) return bytes + " B";
int exp = (int) (Math.log(bytes) / Math.log(1024));
String pre = "KMGTPE".charAt(exp - 1) + "B";
- return String.format("%.1f %s", bytes / Math.pow(1024, exp), pre);
+ return String.format(Locale.US, "%.1f %s", bytes / Math.pow(1024, exp), pre);
}
}
diff --git a/src/main/java/stirling/software/SPDF/model/InputStreamTemplateResource.java b/src/main/java/stirling/software/SPDF/model/InputStreamTemplateResource.java
index b4271df02..3e0bd65e8 100644
--- a/src/main/java/stirling/software/SPDF/model/InputStreamTemplateResource.java
+++ b/src/main/java/stirling/software/SPDF/model/InputStreamTemplateResource.java
@@ -39,7 +39,6 @@ public class InputStreamTemplateResource implements ITemplateResource {
@Override
public boolean exists() {
- // TODO Auto-generated method stub
- return false;
+ return inputStream != null;
}
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/Email.java b/src/main/java/stirling/software/SPDF/model/api/Email.java
index 21b5152e5..6048195e2 100644
--- a/src/main/java/stirling/software/SPDF/model/api/Email.java
+++ b/src/main/java/stirling/software/SPDF/model/api/Email.java
@@ -4,7 +4,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import io.swagger.v3.oas.annotations.media.Schema;
-
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
diff --git a/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java b/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java
index 068978fac..e3ffc8c8b 100644
--- a/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java
+++ b/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java
@@ -11,6 +11,9 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class GeneralFile {
- @Schema(description = "The input file")
+ @Schema(
+ description = "The input file",
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ format = "binary")
private MultipartFile fileInput;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java b/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java
index 27a0dc3bb..7f425dc04 100644
--- a/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java
@@ -11,9 +11,12 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class HandleDataRequest {
- @Schema(description = "The input files")
+ @Schema(description = "The input files", requiredMode = Schema.RequiredMode.REQUIRED)
private MultipartFile[] fileInput;
- @Schema(description = "JSON String")
+ @Schema(
+ description = "JSON String",
+ defaultValue = "{}",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private String json;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/ImageFile.java b/src/main/java/stirling/software/SPDF/model/api/ImageFile.java
index 9719e2372..bd51ac8db 100644
--- a/src/main/java/stirling/software/SPDF/model/api/ImageFile.java
+++ b/src/main/java/stirling/software/SPDF/model/api/ImageFile.java
@@ -10,6 +10,9 @@ import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode
public class ImageFile {
- @Schema(description = "The input image file")
+ @Schema(
+ description = "The input image file",
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ format = "binary")
private MultipartFile fileInput;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java b/src/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java
index fbca980e2..b56a52c7a 100644
--- a/src/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java
+++ b/src/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java
@@ -10,6 +10,6 @@ import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode
public class MultiplePDFFiles {
- @Schema(description = "The input PDF files", type = "array", format = "binary")
+ @Schema(description = "The input PDF files", requiredMode = Schema.RequiredMode.REQUIRED)
private MultipartFile[] fileInput;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFComparison.java b/src/main/java/stirling/software/SPDF/model/api/PDFComparison.java
index a2702c3f8..2dcf3731e 100644
--- a/src/main/java/stirling/software/SPDF/model/api/PDFComparison.java
+++ b/src/main/java/stirling/software/SPDF/model/api/PDFComparison.java
@@ -11,6 +11,7 @@ public class PDFComparison extends PDFFile {
@Schema(
description = "The comparison type, accepts Greater, Equal, Less than",
- allowableValues = {"Greater", "Equal", "Less"})
+ allowableValues = {"Greater", "Equal", "Less"},
+ requiredMode = Schema.RequiredMode.REQUIRED)
private String comparator;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java b/src/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java
index d850b94ae..32037ea9f 100644
--- a/src/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java
+++ b/src/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java
@@ -8,6 +8,6 @@ import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class PDFComparisonAndCount extends PDFComparison {
- @Schema(description = "Count")
- private String pageCount;
+ @Schema(description = "Count", requiredMode = Schema.RequiredMode.REQUIRED, defaultValue = "0")
+ private int pageCount;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFExtractImagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/PDFExtractImagesRequest.java
index 9983d32ea..272c5c8b1 100644
--- a/src/main/java/stirling/software/SPDF/model/api/PDFExtractImagesRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/PDFExtractImagesRequest.java
@@ -11,6 +11,8 @@ public class PDFExtractImagesRequest extends PDFWithImageFormatRequest {
@Schema(
description =
- "Boolean to enable/disable the saving of duplicate images, true to enable duplicates")
- private boolean allowDuplicates;
+ "Boolean to enable/disable the saving of duplicate images, true to enable"
+ + " duplicates",
+ defaultValue = "false")
+ private Boolean allowDuplicates;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFFile.java b/src/main/java/stirling/software/SPDF/model/api/PDFFile.java
index 930f9b0ff..c6284ab99 100644
--- a/src/main/java/stirling/software/SPDF/model/api/PDFFile.java
+++ b/src/main/java/stirling/software/SPDF/model/api/PDFFile.java
@@ -12,6 +12,10 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
@EqualsAndHashCode
public class PDFFile {
- @Schema(description = "The input PDF file", format = "binary")
+ @Schema(
+ description = "The input PDF file",
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ contentMediaType = "application/pdf",
+ format = "binary")
private MultipartFile fileInput;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithImageFormatRequest.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithImageFormatRequest.java
index 34f15c135..e269f91ca 100644
--- a/src/main/java/stirling/software/SPDF/model/api/PDFWithImageFormatRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/PDFWithImageFormatRequest.java
@@ -11,6 +11,8 @@ public class PDFWithImageFormatRequest extends PDFFile {
@Schema(
description = "The output image format e.g., 'png', 'jpeg', or 'gif'",
- allowableValues = {"png", "jpeg", "gif"})
+ allowableValues = {"png", "jpeg", "gif"},
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "png")
private String format;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java
index 39ace7f1e..dd73f9763 100644
--- a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java
+++ b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java
@@ -21,9 +21,9 @@ public class PDFWithPageNums extends PDFFile {
description =
"The pages to select, Supports ranges (e.g., '1,3,5-9'), or 'all' or functions in the"
+ " format 'an+b' where 'a' is the multiplier of the page number 'n', and 'b' is a"
- + " constant (e.g., '2n+1', '3n', '6n-5')\"",
+ + " constant (e.g., '2n+1', '3n', '6n-5')",
defaultValue = "all",
- requiredMode = RequiredMode.NOT_REQUIRED)
+ requiredMode = RequiredMode.REQUIRED)
private String pageNumbers;
@Hidden
diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageSize.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageSize.java
index 1cb0e11a7..81f1eedb9 100644
--- a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageSize.java
+++ b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageSize.java
@@ -11,7 +11,9 @@ public class PDFWithPageSize extends PDFFile {
@Schema(
description =
- "The scale of pages in the output PDF. Acceptable values are A0-A6, LETTER, LEGAL, KEEP.",
+ "The scale of pages in the output PDF. Acceptable values are A0-A6, LETTER,"
+ + " LEGAL, KEEP.",
+ requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"A0", "A1", "A2", "A3", "A4", "A5", "A6", "LETTER", "LEGAL", "KEEP"})
private String pageSize;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/SplitPdfByChaptersRequest.java b/src/main/java/stirling/software/SPDF/model/api/SplitPdfByChaptersRequest.java
index 03930009e..b6a619d53 100644
--- a/src/main/java/stirling/software/SPDF/model/api/SplitPdfByChaptersRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/SplitPdfByChaptersRequest.java
@@ -8,12 +8,22 @@ import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class SplitPdfByChaptersRequest extends PDFFile {
- @Schema(description = "Whether to include Metadata or not", example = "true")
+ @Schema(
+ description = "Whether to include Metadata or not",
+ defaultValue = "true",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean includeMetadata;
- @Schema(description = "Whether to allow duplicates or not", example = "true")
+ @Schema(
+ description = "Whether to allow duplicates or not",
+ defaultValue = "true",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean allowDuplicates;
- @Schema(description = "Maximum bookmark level required", example = "2")
+ @Schema(
+ description = "Maximum bookmark level required",
+ minimum = "0",
+ defaultValue = "2",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private Integer bookmarkLevel;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/SplitPdfBySectionsRequest.java b/src/main/java/stirling/software/SPDF/model/api/SplitPdfBySectionsRequest.java
index e8557c692..ca8aad091 100644
--- a/src/main/java/stirling/software/SPDF/model/api/SplitPdfBySectionsRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/SplitPdfBySectionsRequest.java
@@ -8,12 +8,23 @@ import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class SplitPdfBySectionsRequest extends PDFFile {
- @Schema(description = "Number of horizontal divisions for each PDF page", example = "2")
+ @Schema(
+ description = "Number of horizontal divisions for each PDF page",
+ defaultValue = "0",
+ minimum = "0",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private int horizontalDivisions;
- @Schema(description = "Number of vertical divisions for each PDF page", example = "2")
+ @Schema(
+ description = "Number of vertical divisions for each PDF page",
+ defaultValue = "1",
+ minimum = "0",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private int verticalDivisions;
- @Schema(description = "Merge the split documents into a single PDF", example = "true")
- private boolean merge;
+ @Schema(
+ description = "Merge the split documents into a single PDF",
+ defaultValue = "true",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private Boolean merge;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertPDFToMarkdown.java b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertPDFToMarkdown.java
index f1d04adc2..5481423ac 100644
--- a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertPDFToMarkdown.java
+++ b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertPDFToMarkdown.java
@@ -23,9 +23,9 @@ public class ConvertPDFToMarkdown {
summary = "Convert PDF to Markdown",
description =
"This endpoint converts a PDF file to Markdown format. Input:PDF Output:Markdown Type:SISO")
- public ResponseEntity processPdfToMarkdown(@ModelAttribute PDFFile request)
+ public ResponseEntity processPdfToMarkdown(@ModelAttribute PDFFile file)
throws Exception {
- MultipartFile inputFile = request.getFileInput();
+ MultipartFile inputFile = file.getFileInput();
PDFToFile pdfToFile = new PDFToFile();
return pdfToFile.processPdfToMarkdown(inputFile);
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java
index 5116f19c7..149676946 100644
--- a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java
@@ -5,33 +5,38 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
-import stirling.software.SPDF.model.api.PDFFile;
+import stirling.software.SPDF.model.api.PDFWithPageNums;
@Data
@EqualsAndHashCode(callSuper = true)
-public class ConvertToImageRequest extends PDFFile {
+public class ConvertToImageRequest extends PDFWithPageNums {
@Schema(
description = "The output image format",
- allowableValues = {"png", "jpeg", "jpg", "gif", "webp"})
+ defaultValue = "png",
+ allowableValues = {"png", "jpeg", "jpg", "gif", "webp"},
+ requiredMode = Schema.RequiredMode.REQUIRED)
private String imageFormat;
@Schema(
description =
- "Choose between a single image containing all pages or separate images for each page",
- allowableValues = {"single", "multiple"})
+ "Choose between a single image containing all pages or separate images for each"
+ + " page",
+ defaultValue = "multiple",
+ allowableValues = {"single", "multiple"},
+ requiredMode = Schema.RequiredMode.REQUIRED)
private String singleOrMultiple;
- @Schema(
- description =
- "The pages to select, Supports ranges (e.g., '1,3,5-9'), or 'all' or functions in the format 'an+b' where 'a' is the multiplier of the page number 'n', and 'b' is a constant (e.g., '2n+1', '3n', '6n-5')\"")
- private String pageNumbers;
-
@Schema(
description = "The color type of the output image(s)",
- allowableValues = {"color", "greyscale", "blackwhite"})
+ defaultValue = "color",
+ allowableValues = {"color", "greyscale", "blackwhite"},
+ requiredMode = Schema.RequiredMode.REQUIRED)
private String colorType;
- @Schema(description = "The DPI (dots per inch) for the output image(s)")
- private String dpi;
+ @Schema(
+ description = "The DPI (dots per inch) for the output image(s)",
+ defaultValue = "300",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private Integer dpi;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToPdfRequest.java
index 7630f746a..c3b059fe0 100644
--- a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToPdfRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToPdfRequest.java
@@ -11,21 +11,28 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class ConvertToPdfRequest {
- @Schema(description = "The input images to be converted to a PDF file")
+ @Schema(
+ description = "The input images to be converted to a PDF file",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private MultipartFile[] fileInput;
@Schema(
description = "Option to determine how the image will fit onto the page",
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "fillPage",
allowableValues = {"fillPage", "fitDocumentToImage", "maintainAspectRatio"})
private String fitOption;
@Schema(
description = "The color type of the output image(s)",
+ defaultValue = "color",
+ requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"color", "greyscale", "blackwhite"})
private String colorType;
@Schema(
description = "Whether to automatically rotate the images to better fit the PDF page",
- example = "true")
- private boolean autoRotate;
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "false")
+ private Boolean autoRotate;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/HTMLToPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/HTMLToPdfRequest.java
index 4bd328566..822c5f898 100644
--- a/src/main/java/stirling/software/SPDF/model/api/converters/HTMLToPdfRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/converters/HTMLToPdfRequest.java
@@ -13,6 +13,7 @@ public class HTMLToPdfRequest extends PDFFile {
@Schema(
description = "Zoom level for displaying the website. Default is '1'.",
+ requiredMode = Schema.RequiredMode.REQUIRED,
defaultValue = "1")
private float zoom;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java
index 0d518e572..ab48ce2df 100644
--- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java
@@ -13,6 +13,7 @@ public class PdfToBookRequest extends PDFFile {
@Schema(
description = "The output Ebook format",
+ requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {
"epub", "mobi", "azw3", "docx", "rtf", "txt", "html", "lit", "fb2", "pdb", "lrf"
})
diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPdfARequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPdfARequest.java
index c48e53268..0ce91a337 100644
--- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPdfARequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPdfARequest.java
@@ -13,6 +13,7 @@ public class PdfToPdfARequest extends PDFFile {
@Schema(
description = "The output PDF/A type",
+ requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"pdfa", "pdfa-1"})
private String outputFormat;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java
index 68c14a1f0..aa23eb533 100644
--- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java
@@ -13,6 +13,7 @@ public class PdfToPresentationRequest extends PDFFile {
@Schema(
description = "The output Presentation format",
+ requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"ppt", "pptx", "odp"})
private String outputFormat;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java
index 5d3ab2ab2..7d4f9f098 100644
--- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java
@@ -13,6 +13,7 @@ public class PdfToTextOrRTFRequest extends PDFFile {
@Schema(
description = "The output Text or RTF format",
+ requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"rtf", "txt"})
private String outputFormat;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java
index c0bed0637..f2613e339 100644
--- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java
@@ -13,6 +13,7 @@ public class PdfToWordRequest extends PDFFile {
@Schema(
description = "The output Word document format",
+ requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"doc", "docx", "odt"})
private String outputFormat;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java
index 147badc37..0435e5835 100644
--- a/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java
@@ -11,6 +11,9 @@ import stirling.software.SPDF.model.api.PDFWithPageNums;
@EqualsAndHashCode(callSuper = true)
public class ContainsTextRequest extends PDFWithPageNums {
- @Schema(description = "The text to check for", requiredMode = Schema.RequiredMode.REQUIRED)
+ @Schema(
+ description = "The text to check for",
+ defaultValue = "text",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private String text;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java
index 957951395..a3c57077d 100644
--- a/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java
@@ -11,6 +11,9 @@ import stirling.software.SPDF.model.api.PDFComparison;
@EqualsAndHashCode(callSuper = true)
public class FileSizeRequest extends PDFComparison {
- @Schema(description = "File Size", requiredMode = Schema.RequiredMode.REQUIRED)
- private String fileSize;
+ @Schema(
+ description = "Size of the file in bytes",
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "0")
+ private long fileSize;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java
index 2a183deb7..05fd10c31 100644
--- a/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java
@@ -11,6 +11,9 @@ import stirling.software.SPDF.model.api.PDFComparison;
@EqualsAndHashCode(callSuper = true)
public class PageRotationRequest extends PDFComparison {
- @Schema(description = "Rotation in degrees", requiredMode = Schema.RequiredMode.REQUIRED)
+ @Schema(
+ description = "Rotation in degrees",
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "0")
private int rotation;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java
index 1d89ef296..2fa74f040 100644
--- a/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java
@@ -11,6 +11,10 @@ import stirling.software.SPDF.model.api.PDFComparison;
@EqualsAndHashCode(callSuper = true)
public class PageSizeRequest extends PDFComparison {
- @Schema(description = "Standard Page Size", requiredMode = Schema.RequiredMode.REQUIRED)
+ @Schema(
+ description = "Standard Page Size",
+ allowableValues = {"A0", "A1", "A2", "A3", "A4", "A5", "A6", "LETTER", "LEGAL"},
+ defaultValue = "A4",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private String standardPageSize;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java
index b8beb9ff0..4bd41e400 100644
--- a/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java
@@ -13,10 +13,12 @@ public class MergeMultiplePagesRequest extends PDFFile {
@Schema(
description = "The number of pages to fit onto a single sheet in the output PDF.",
- type = "integer",
+ type = "number",
+ defaultValue = "2",
+ requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"2", "3", "4", "9", "16"})
private int pagesPerSheet;
@Schema(description = "Boolean for if you wish to add border around the pages")
- private boolean addBorder;
+ private Boolean addBorder;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java
index 9b97d88dd..0ed4fcfa7 100644
--- a/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java
@@ -20,12 +20,16 @@ public class MergePdfsRequest extends MultiplePDFFiles {
"byDateCreated",
"byPDFTitle"
},
+ requiredMode = Schema.RequiredMode.REQUIRED,
defaultValue = "orderProvided")
private String sortType = "orderProvided";
@Schema(
description =
- "Flag indicating whether to remove certification signatures from the merged PDF. If true, all certification signatures will be removed from the final merged document.",
- example = "true")
- private boolean isRemoveCertSign;
+ "Flag indicating whether to remove certification signatures from the merged"
+ + " PDF. If true, all certification signatures will be removed from the"
+ + " final merged document.",
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "true")
+ private Boolean removeCertSign;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java
index 1bad80425..528e57844 100644
--- a/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java
@@ -15,21 +15,32 @@ public class OverlayPdfsRequest extends PDFFile {
@Schema(
description =
- "An array of PDF files to be used as overlays on the base PDF. The order in these files is applied based on the selected mode.")
+ "An array of PDF files to be used as overlays on the base PDF. The order in"
+ + " these files is applied based on the selected mode.",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private MultipartFile[] overlayFiles;
@Schema(
description =
- "The mode of overlaying: 'SequentialOverlay' for sequential application, 'InterleavedOverlay' for round-robin application, 'FixedRepeatOverlay' for fixed repetition based on provided counts",
+ "The mode of overlaying: 'SequentialOverlay' for sequential application,"
+ + " 'InterleavedOverlay' for round-robin application, 'FixedRepeatOverlay'"
+ + " for fixed repetition based on provided counts",
+ allowableValues = {"SequentialOverlay", "InterleavedOverlay", "FixedRepeatOverlay"},
requiredMode = Schema.RequiredMode.REQUIRED)
private String overlayMode;
@Schema(
description =
- "An array of integers specifying the number of times each corresponding overlay file should be applied in the 'FixedRepeatOverlay' mode. This should match the length of the overlayFiles array.",
+ "An array of integers specifying the number of times each corresponding overlay"
+ + " file should be applied in the 'FixedRepeatOverlay' mode. This should"
+ + " match the length of the overlayFiles array.",
requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private int[] counts;
- @Schema(description = "Overlay position 0 is Foregound, 1 is Background")
+ @Schema(
+ description = "Overlay position 0 is Foregound, 1 is Background",
+ allowableValues = {"0", "1"},
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ type = "number")
private int overlayPosition;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java
index ac13e4bf4..fae64edb6 100644
--- a/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java
@@ -14,6 +14,8 @@ public class RotatePDFRequest extends PDFFile {
@Schema(
description =
"The angle by which to rotate the PDF file. This should be a multiple of 90.",
- example = "90")
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ allowableValues = {"0", "90", "180", "270"},
+ defaultValue = "90")
private Integer angle;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java
index bba2141ca..653697f4e 100644
--- a/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java
@@ -12,7 +12,11 @@ import stirling.software.SPDF.model.api.PDFWithPageSize;
public class ScalePagesRequest extends PDFWithPageSize {
@Schema(
+ minimum = "0",
+ defaultValue = "1",
+ requiredMode = Schema.RequiredMode.REQUIRED,
description =
- "The scale of the content on the pages of the output PDF. Acceptable values are floats.")
+ "The scale of the content on the pages of the output PDF. Acceptable values are"
+ + " floats.")
private float scaleFactor;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java
index b67d76531..5f0f71695 100644
--- a/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java
@@ -22,6 +22,7 @@ public class AddPageNumbersRequest extends PDFWithPageNums {
@Schema(
description = "Font size for page numbers",
minimum = "1",
+ defaultValue = "12",
requiredMode = RequiredMode.REQUIRED)
private float fontSize;
@@ -33,15 +34,18 @@ public class AddPageNumbersRequest extends PDFWithPageNums {
@Schema(
description =
- "Position: 1-9 representing positions on the page (1=top-left, 5=center, 9=bottom-right)",
- minimum = "1",
- maximum = "9",
+ "Position: 1-9 representing positions on the page (1=top-left, 2=top-center,"
+ + " 3=top-right, 4=middle-left, 5=middle-center, 6=middle-right,"
+ + " 7=bottom-left, 8=bottom-center, 9=bottom-right)",
+ allowableValues = {"1", "2", "3", "4", "5", "6", "7", "8", "9"},
+ defaultValue = "8",
requiredMode = RequiredMode.REQUIRED)
private int position;
@Schema(
description = "Starting number for page numbering",
minimum = "1",
+ defaultValue = "1",
requiredMode = RequiredMode.REQUIRED)
private int startingNumber;
@@ -53,7 +57,8 @@ public class AddPageNumbersRequest extends PDFWithPageNums {
@Schema(
description =
- "Custom text pattern. Available variables: {n}=current page number, {total}=total pages, {filename}=original filename",
+ "Custom text pattern. Available variables: {n}=current page number,"
+ + " {total}=total pages, {filename}=original filename",
example = "Page {n} of {total}",
defaultValue = "{n}",
requiredMode = RequiredMode.NOT_REQUIRED)
diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java
index b320b7151..48d470a5a 100644
--- a/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java
@@ -19,51 +19,69 @@ public class AddStampRequest extends PDFWithPageNums {
requiredMode = Schema.RequiredMode.REQUIRED)
private String stampType;
- @Schema(description = "The stamp text")
+ @Schema(description = "The stamp text", defaultValue = "Stirling Software")
private String stampText;
@Schema(description = "The stamp image")
private MultipartFile stampImage;
@Schema(
- description = "The selected alphabet",
+ description = "The selected alphabet of the stamp text",
allowableValues = {"roman", "arabic", "japanese", "korean", "chinese"},
defaultValue = "roman")
private String alphabet = "roman";
- @Schema(description = "The font size of the stamp text", example = "30")
- private float fontSize = 30;
+ @Schema(
+ description = "The font size of the stamp text and image",
+ defaultValue = "30",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private float fontSize;
- @Schema(description = "The rotation of the stamp in degrees", example = "0")
- private float rotation = 0;
+ @Schema(
+ description = "The rotation of the stamp in degrees",
+ defaultValue = "0",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private float rotation;
- @Schema(description = "The opacity of the stamp (0.0 - 1.0)", example = "0.5")
+ @Schema(
+ description = "The opacity of the stamp (0.0 - 1.0)",
+ defaultValue = "0.5",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private float opacity;
@Schema(
description =
- "Position for stamp placement based on a 1-9 grid (1: bottom-left, 2: bottom-center, ..., 9: top-right)",
- example = "1")
+ "Position for stamp placement based on a 1-9 grid (1: bottom-left, 2: bottom-center,"
+ + " 3: bottom-right, 4: middle-left, 5: middle-center, 6: middle-right,"
+ + " 7: top-left, 8: top-center, 9: top-right)",
+ allowableValues = {"1", "2", "3", "4", "5", "6", "7", "8", "9"},
+ defaultValue = "5",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private int position;
@Schema(
description =
- "Override X coordinate for stamp placement. If set, it will override the position-based calculation. Negative value means no override.",
- example = "-1")
- private float overrideX = -1; // Default to -1 indicating no override
+ "Override X coordinate for stamp placement. If set, it will override the"
+ + " position-based calculation. Negative value means no override.",
+ defaultValue = "-1",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private float overrideX; // Default to -1 indicating no override
@Schema(
description =
- "Override Y coordinate for stamp placement. If set, it will override the position-based calculation. Negative value means no override.",
- example = "-1")
- private float overrideY = -1; // Default to -1 indicating no override
+ "Override Y coordinate for stamp placement. If set, it will override the"
+ + " position-based calculation. Negative value means no override.",
+ defaultValue = "-1",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private float overrideY; // Default to -1 indicating no override
@Schema(
description = "Specifies the margin size for the stamp.",
allowableValues = {"small", "medium", "large", "x-large"},
- defaultValue = "medium")
- private String customMargin = "medium";
+ defaultValue = "medium",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private String customMargin;
- @Schema(description = "The color for stamp", defaultValue = "#d3d3d3")
- private String customColor = "#d3d3d3";
+ @Schema(description = "The color of the stamp text", defaultValue = "#d3d3d3")
+ private String customColor;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java
index bc4a0f5c8..ff13c4038 100644
--- a/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java
@@ -16,5 +16,5 @@ public class AutoSplitPdfRequest extends PDFFile {
"Flag indicating if the duplex mode is active, where the page after the divider also gets removed.",
requiredMode = Schema.RequiredMode.NOT_REQUIRED,
defaultValue = "false")
- private boolean duplexMode;
+ private Boolean duplexMode;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java
index 3f886fcdc..641833b77 100644
--- a/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java
@@ -16,5 +16,5 @@ public class ExtractHeaderRequest extends PDFFile {
"Flag indicating whether to use the first text as a fallback if no suitable title is found. Defaults to false.",
requiredMode = Schema.RequiredMode.NOT_REQUIRED,
defaultValue = "false")
- private boolean useFirstTextAsFallback;
+ private Boolean useFirstTextAsFallback;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ExtractImageScansRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ExtractImageScansRequest.java
index 9fda7b6fa..6345d4489 100644
--- a/src/main/java/stirling/software/SPDF/model/api/misc/ExtractImageScansRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/misc/ExtractImageScansRequest.java
@@ -12,36 +12,37 @@ import lombok.EqualsAndHashCode;
public class ExtractImageScansRequest {
@Schema(
description = "The input file containing image scans",
- requiredMode = Schema.RequiredMode.REQUIRED)
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ format = "binary")
private MultipartFile fileInput;
@Schema(
description = "The angle threshold for the image scan extraction",
- defaultValue = "5",
- example = "5")
- private int angleThreshold = 5;
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "5")
+ private int angleThreshold;
@Schema(
description = "The tolerance for the image scan extraction",
- defaultValue = "20",
- example = "20")
- private int tolerance = 20;
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "20")
+ private int tolerance;
@Schema(
description = "The minimum area for the image scan extraction",
- defaultValue = "8000",
- example = "8000")
- private int minArea = 8000;
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "8000")
+ private int minArea;
@Schema(
description = "The minimum contour area for the image scan extraction",
- defaultValue = "500",
- example = "500")
- private int minContourArea = 500;
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "500")
+ private int minContourArea;
@Schema(
description = "The border size for the image scan extraction",
- defaultValue = "1",
- example = "1")
- private int borderSize = 1;
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "1")
+ private int borderSize;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java
index 364d3129f..37be18444 100644
--- a/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java
@@ -13,6 +13,9 @@ public class FlattenRequest extends PDFFile {
@Schema(
description =
- "True to flatten only the forms, false to flatten full PDF (Convert page to image)")
+ "True to flatten only the forms, false to flatten full PDF (Convert page to"
+ + " image)",
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "false")
private Boolean flattenOnlyForms;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java
index fb326e79e..0238e9607 100644
--- a/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java
@@ -13,38 +13,72 @@ import stirling.software.SPDF.model.api.PDFFile;
@EqualsAndHashCode(callSuper = true)
public class MetadataRequest extends PDFFile {
- @Schema(description = "Delete all metadata if set to true")
- private boolean deleteAll;
+ @Schema(
+ description = "Delete all metadata if set to true",
+ defaultValue = "false",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private Boolean deleteAll;
- @Schema(description = "The author of the document")
+ @Schema(
+ description = "The author of the document",
+ defaultValue = "author",
+ requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String author;
- @Schema(description = "The creation date of the document (format: yyyy/MM/dd HH:mm:ss)")
+ @Schema(
+ description = "The creation date of the document (format: yyyy/MM/dd HH:mm:ss)",
+ pattern = "yyyy/MM/dd HH:mm:ss",
+ defaultValue = "2023/10/01 12:00:00",
+ requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String creationDate;
- @Schema(description = "The creator of the document")
+ @Schema(
+ description = "The creator of the document",
+ defaultValue = "creator",
+ requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String creator;
- @Schema(description = "The keywords for the document")
+ @Schema(
+ description = "The keywords for the document",
+ defaultValue = "keywords",
+ requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String keywords;
- @Schema(description = "The modification date of the document (format: yyyy/MM/dd HH:mm:ss)")
+ @Schema(
+ description = "The modification date of the document (format: yyyy/MM/dd HH:mm:ss)",
+ pattern = "yyyy/MM/dd HH:mm:ss",
+ defaultValue = "2023/10/01 12:00:00",
+ requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String modificationDate;
- @Schema(description = "The producer of the document")
+ @Schema(
+ description = "The producer of the document",
+ defaultValue = "producer",
+ requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String producer;
- @Schema(description = "The subject of the document")
+ @Schema(
+ description = "The subject of the document",
+ defaultValue = "subject",
+ requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String subject;
- @Schema(description = "The title of the document")
+ @Schema(
+ description = "The title of the document",
+ defaultValue = "title",
+ requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String title;
- @Schema(description = "The trapped status of the document")
+ @Schema(
+ description = "The trapped status of the document",
+ defaultValue = "False",
+ allowableValues = {"True", "False", "Unknown"},
+ requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String trapped;
@Schema(
description =
- "Map list of key and value of custom parameters. Note these must start with customKey and customValue if they are non-standard")
+ "Map list of key and value of custom parameters. Note these must start with"
+ + " customKey and customValue if they are non-standard")
private Map allRequestParams;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java
index 147d163e8..dc426e965 100644
--- a/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java
@@ -13,30 +13,36 @@ public class OptimizePdfRequest extends PDFFile {
@Schema(
description =
- "The level of optimization to apply to the PDF file. Higher values indicate greater compression but may reduce quality.",
+ "The level of optimization to apply to the PDF file. Higher values indicate"
+ + " greater compression but may reduce quality.",
+ defaultValue = "5",
+ requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"1", "2", "3", "4", "5", "6", "7", "8", "9"})
private Integer optimizeLevel;
- @Schema(description = "The expected output size, e.g. '100MB', '25KB', etc.")
+ @Schema(
+ description = "The expected output size, e.g. '100MB', '25KB', etc.",
+ defaultValue = "25KB",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private String expectedOutputSize;
@Schema(
description = "Whether to linearize the PDF for faster web viewing. Default is false.",
+ requiredMode = Schema.RequiredMode.REQUIRED,
defaultValue = "false")
private Boolean linearize = false;
@Schema(
description =
- "Whether to normalize the PDF content for better compatibility. Default is false.",
+ "Whether to normalize the PDF content for better compatibility. Default is"
+ + " false.",
+ requiredMode = Schema.RequiredMode.REQUIRED,
defaultValue = "false")
private Boolean normalize = false;
@Schema(
description = "Whether to convert the PDF to grayscale. Default is false.",
+ requiredMode = Schema.RequiredMode.REQUIRED,
defaultValue = "false")
private Boolean grayscale = false;
-
- public Boolean getGrayscale() {
- return grayscale;
- }
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java
index 49a3185dc..65bf4ce90 100644
--- a/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java
@@ -13,21 +13,27 @@ import stirling.software.SPDF.model.api.PDFFile;
@EqualsAndHashCode(callSuper = true)
public class OverlayImageRequest extends PDFFile {
- @Schema(description = "The image file to be overlaid onto the PDF.")
+ @Schema(
+ description = "The image file to be overlaid onto the PDF.",
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ format = "binary")
private MultipartFile imageFile;
@Schema(
description = "The x-coordinate at which to place the top-left corner of the image.",
- example = "0")
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "0")
private float x;
@Schema(
description = "The y-coordinate at which to place the top-left corner of the image.",
- example = "0")
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "0")
private float y;
@Schema(
description = "Whether to overlay the image onto every page of the PDF.",
- example = "false")
- private boolean everyPage;
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "false")
+ private Boolean everyPage;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java
index 3415fbf90..7eb254b3f 100644
--- a/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java
@@ -13,16 +13,21 @@ import stirling.software.SPDF.model.api.PDFFile;
@EqualsAndHashCode(callSuper = true)
public class ProcessPdfWithOcrRequest extends PDFFile {
- @Schema(description = "List of languages to use in OCR processing")
+ @Schema(
+ description = "List of languages to use in OCR processing, e.g., 'eng', 'deu'",
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "[\"eng\"]")
private List languages;
@Schema(
description = "Specify the OCR type, e.g., 'skip-text', 'force-ocr', or 'Normal'",
+ requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"skip-text", "force-ocr", "Normal"})
private String ocrType;
@Schema(
description = "Specify the OCR render type, either 'hocr' or 'sandwich'",
+ requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"hocr", "sandwich"},
defaultValue = "hocr")
private String ocrRenderType = "hocr";
diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java
index 85bf7d1e0..dd018dea3 100644
--- a/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java
@@ -13,13 +13,17 @@ public class RemoveBlankPagesRequest extends PDFFile {
@Schema(
description = "The threshold value to determine blank pages",
- example = "10",
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ minimum = "0",
+ maximum = "255",
defaultValue = "10")
- private int threshold = 10;
+ private int threshold;
@Schema(
description = "The percentage of white color on a page to consider it as blank",
- example = "99.9",
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ minimum = "0.1",
+ maximum = "100",
defaultValue = "99.9")
- private float whitePercent = 99.9f;
+ private float whitePercent;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ReplaceAndInvertColorRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ReplaceAndInvertColorRequest.java
index 7c1a620d6..c6f948f7c 100644
--- a/src/main/java/stirling/software/SPDF/model/api/misc/ReplaceAndInvertColorRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/misc/ReplaceAndInvertColorRequest.java
@@ -13,12 +13,16 @@ public class ReplaceAndInvertColorRequest extends PDFFile {
@Schema(
description = "Replace and Invert color options of a pdf.",
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "HIGH_CONTRAST_COLOR",
allowableValues = {"HIGH_CONTRAST_COLOR", "CUSTOM_COLOR", "FULL_INVERSION"})
private ReplaceAndInvert replaceAndInvertOption;
@Schema(
description =
"If HIGH_CONTRAST_COLOR option selected, then pick the default color option for text and background.",
+ requiredMode = Schema.RequiredMode.REQUIRED,
+ defaultValue = "WHITE_TEXT_ON_BLACK",
allowableValues = {
"WHITE_TEXT_ON_BLACK",
"BLACK_TEXT_ON_WHITE",
diff --git a/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java
index ef85dfead..8dfa4e54f 100644
--- a/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java
@@ -13,47 +13,50 @@ public class AddPasswordRequest extends PDFFile {
@Schema(
description =
- "The owner password to be added to the PDF file (Restricts what can be done with the document once it is opened)",
- defaultValue = "")
+ "The owner password to be added to the PDF file (Restricts what can be done"
+ + " with the document once it is opened)",
+ format = "password")
private String ownerPassword;
@Schema(
description =
- "The password to be added to the PDF file (Restricts the opening of the document itself.)",
- defaultValue = "")
+ "The password to be added to the PDF file (Restricts the opening of the"
+ + " document itself.)",
+ format = "password")
private String password;
@Schema(
description = "The length of the encryption key",
allowableValues = {"40", "128", "256"},
- defaultValue = "256")
+ defaultValue = "256",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private int keyLength = 256;
- @Schema(description = "Whether the document assembly is allowed", example = "false")
- private boolean canAssembleDocument;
+ @Schema(description = "Whether document assembly is prevented", defaultValue = "false")
+ private Boolean preventAssembly;
+
+ @Schema(description = "Whether content extraction is prevented", defaultValue = "false")
+ private Boolean preventExtractContent;
@Schema(
- description = "Whether content extraction for accessibility is allowed",
- example = "false")
- private boolean canExtractContent;
+ description = "Whether content extraction for accessibility is prevented",
+ defaultValue = "false")
+ private Boolean preventExtractForAccessibility;
+
+ @Schema(description = "Whether form filling is prevented", defaultValue = "false")
+ private Boolean preventFillInForm;
+
+ @Schema(description = "Whether document modification is prevented", defaultValue = "false")
+ private Boolean preventModify;
@Schema(
- description = "Whether content extraction for accessibility is allowed",
- example = "false")
- private boolean canExtractForAccessibility;
+ description = "Whether modification of annotations is prevented",
+ defaultValue = "false")
+ private Boolean preventModifyAnnotations;
- @Schema(description = "Whether form filling is allowed", example = "false")
- private boolean canFillInForm;
+ @Schema(description = "Whether printing of the document is prevented", defaultValue = "false")
+ private Boolean preventPrinting;
- @Schema(description = "Whether the document modification is allowed", example = "false")
- private boolean canModify;
-
- @Schema(description = "Whether modification of annotations is allowed", example = "false")
- private boolean canModifyAnnotations;
-
- @Schema(description = "Whether printing of the document is allowed", example = "false")
- private boolean canPrint;
-
- @Schema(description = "Whether faithful printing is allowed", example = "false")
- private boolean canPrintFaithful;
+ @Schema(description = "Whether faithful printing is prevented", defaultValue = "false")
+ private Boolean preventPrintingFaithful;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java
index f4ebada01..0a8a2559e 100644
--- a/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java
@@ -19,7 +19,7 @@ public class AddWatermarkRequest extends PDFFile {
requiredMode = Schema.RequiredMode.REQUIRED)
private String watermarkType;
- @Schema(description = "The watermark text")
+ @Schema(description = "The watermark text", defaultValue = "Stirling Software")
private String watermarkText;
@Schema(description = "The watermark image")
@@ -29,26 +29,29 @@ public class AddWatermarkRequest extends PDFFile {
description = "The selected alphabet",
allowableValues = {"roman", "arabic", "japanese", "korean", "chinese"},
defaultValue = "roman")
- private String alphabet = "roman";
+ private String alphabet;
- @Schema(description = "The font size of the watermark text", example = "30")
- private float fontSize = 30;
+ @Schema(description = "The font size of the watermark text", defaultValue = "30")
+ private float fontSize;
- @Schema(description = "The rotation of the watermark in degrees", example = "0")
- private float rotation = 0;
+ @Schema(description = "The rotation of the watermark in degrees", defaultValue = "0")
+ private float rotation;
- @Schema(description = "The opacity of the watermark (0.0 - 1.0)", example = "0.5")
+ @Schema(description = "The opacity of the watermark (0.0 - 1.0)", defaultValue = "0.5")
private float opacity;
- @Schema(description = "The width spacer between watermark elements", example = "50")
+ @Schema(description = "The width spacer between watermark elements", defaultValue = "50")
private int widthSpacer;
- @Schema(description = "The height spacer between watermark elements", example = "50")
+ @Schema(description = "The height spacer between watermark elements", defaultValue = "50")
private int heightSpacer;
@Schema(description = "The color for watermark", defaultValue = "#d3d3d3")
- private String customColor = "#d3d3d3";
+ private String customColor;
- @Schema(description = "Convert the redacted PDF to an image", defaultValue = "false")
- private boolean convertPDFToImage;
+ @Schema(
+ description = "Convert the redacted PDF to an image",
+ defaultValue = "false",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private Boolean convertPDFToImage;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/security/ManualRedactPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/ManualRedactPdfRequest.java
index 2d431b7ef..bcc715d16 100644
--- a/src/main/java/stirling/software/SPDF/model/api/security/ManualRedactPdfRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/security/ManualRedactPdfRequest.java
@@ -12,12 +12,20 @@ import stirling.software.SPDF.model.api.PDFWithPageNums;
@Data
@EqualsAndHashCode(callSuper = true)
public class ManualRedactPdfRequest extends PDFWithPageNums {
- @Schema(description = "A list of areas that should be redacted")
+ @Schema(
+ description = "A list of areas that should be redacted",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private List redactions;
- @Schema(description = "Convert the redacted PDF to an image", defaultValue = "false")
- private boolean convertPDFToImage;
+ @Schema(
+ description = "Convert the redacted PDF to an image",
+ defaultValue = "false",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private Boolean convertPDFToImage;
- @Schema(description = "The color used to fully redact certain pages")
+ @Schema(
+ description = "The color used to fully redact certain pages",
+ defaultValue = "#000000",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private String pageRedactionColor;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java
index 2ee29757a..0353fe3e7 100644
--- a/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java
@@ -13,6 +13,7 @@ public class PDFPasswordRequest extends PDFFile {
@Schema(
description = "The password of the PDF file",
- requiredMode = Schema.RequiredMode.REQUIRED)
+ format = "password",
+ requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String password;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java
index 54c6a0aad..0ec6ca20a 100644
--- a/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java
@@ -13,22 +13,37 @@ public class RedactPdfRequest extends PDFFile {
@Schema(
description = "List of text to redact from the PDF",
- type = "string",
+ defaultValue = "text,text2",
requiredMode = Schema.RequiredMode.REQUIRED)
private String listOfText;
- @Schema(description = "Whether to use regex for the listOfText", defaultValue = "false")
- private boolean useRegex;
+ @Schema(
+ description = "Whether to use regex for the listOfText",
+ defaultValue = "false",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private Boolean useRegex;
- @Schema(description = "Whether to use whole word search", defaultValue = "false")
- private boolean wholeWordSearch;
+ @Schema(
+ description = "Whether to use whole word search",
+ defaultValue = "false",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private Boolean wholeWordSearch;
- @Schema(description = "The color for redaction", defaultValue = "#000000")
- private String redactColor = "#000000";
+ @Schema(
+ description = "The color for redaction",
+ defaultValue = "#000000",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private String redactColor;
- @Schema(description = "Custom padding for redaction", type = "number")
+ @Schema(
+ description = "Custom padding for redaction",
+ type = "number",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private float customPadding;
- @Schema(description = "Convert the redacted PDF to an image", defaultValue = "false")
- private boolean convertPDFToImage;
+ @Schema(
+ description = "Convert the redacted PDF to an image",
+ defaultValue = "false",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private Boolean convertPDFToImage;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/security/RedactionArea.java b/src/main/java/stirling/software/SPDF/model/api/security/RedactionArea.java
index a8d2a61ad..9b44835f9 100644
--- a/src/main/java/stirling/software/SPDF/model/api/security/RedactionArea.java
+++ b/src/main/java/stirling/software/SPDF/model/api/security/RedactionArea.java
@@ -3,8 +3,10 @@ package stirling.software.SPDF.model.api.security;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
+import lombok.EqualsAndHashCode;
@Data
+@EqualsAndHashCode
public class RedactionArea {
@Schema(description = "The left edge point of the area to be redacted.")
private Double x;
diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java
index 7be655f76..dc38b9fc8 100644
--- a/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java
@@ -11,21 +11,39 @@ import stirling.software.SPDF.model.api.PDFFile;
@EqualsAndHashCode(callSuper = true)
public class SanitizePdfRequest extends PDFFile {
- @Schema(description = "Remove JavaScript actions from the PDF", defaultValue = "false")
- private boolean removeJavaScript;
+ @Schema(
+ description = "Remove JavaScript actions from the PDF",
+ defaultValue = "true",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private Boolean removeJavaScript;
- @Schema(description = "Remove embedded files from the PDF", defaultValue = "false")
- private boolean removeEmbeddedFiles;
+ @Schema(
+ description = "Remove embedded files from the PDF",
+ defaultValue = "true",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private Boolean removeEmbeddedFiles;
- @Schema(description = "Remove XMP metadata from the PDF", defaultValue = "false")
- private boolean removeXMPMetadata;
+ @Schema(
+ description = "Remove XMP metadata from the PDF",
+ defaultValue = "false",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private Boolean removeXMPMetadata;
- @Schema(description = "Remove document info metadata from the PDF", defaultValue = "false")
- private boolean removeMetadata;
+ @Schema(
+ description = "Remove document info metadata from the PDF",
+ defaultValue = "false",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private Boolean removeMetadata;
- @Schema(description = "Remove links from the PDF", defaultValue = "false")
- private boolean removeLinks;
+ @Schema(
+ description = "Remove links from the PDF",
+ defaultValue = "false",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private Boolean removeLinks;
- @Schema(description = "Remove fonts from the PDF", defaultValue = "false")
- private boolean removeFonts;
+ @Schema(
+ description = "Remove fonts from the PDF",
+ defaultValue = "false",
+ requiredMode = Schema.RequiredMode.REQUIRED)
+ private Boolean removeFonts;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java
index d9fe92def..20356af08 100644
--- a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java
@@ -15,7 +15,8 @@ public class SignPDFWithCertRequest extends PDFFile {
@Schema(
description = "The type of the digital certificate",
- allowableValues = {"PEM", "PKCS12", "JKS"})
+ allowableValues = {"PEM", "PKCS12", "JKS"},
+ requiredMode = Schema.RequiredMode.REQUIRED)
private String certType;
@Schema(
@@ -36,24 +37,31 @@ public class SignPDFWithCertRequest extends PDFFile {
@Schema(description = "The password for the keystore or the private key", format = "password")
private String password;
- @Schema(description = "Whether to visually show the signature in the PDF file")
+ @Schema(
+ description = "Whether to visually show the signature in the PDF file",
+ defaultValue = "false",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean showSignature;
- @Schema(description = "The reason for signing the PDF")
+ @Schema(description = "The reason for signing the PDF", defaultValue = "Signed by SPDF")
private String reason;
- @Schema(description = "The location where the PDF is signed")
+ @Schema(description = "The location where the PDF is signed", defaultValue = "SPDF")
private String location;
- @Schema(description = "The name of the signer")
+ @Schema(description = "The name of the signer", defaultValue = "SPDF")
private String name;
@Schema(
description =
"The page number where the signature should be visible. This is required if"
- + " showSignature is set to true")
+ + " showSignature is set to true",
+ defaultValue = "1")
private Integer pageNumber;
- @Schema(description = "Whether to visually show a signature logo along with the signature")
+ @Schema(
+ description = "Whether to visually show a signature logo along with the signature",
+ defaultValue = "true",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean showLogo;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SignatureValidationRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SignatureValidationRequest.java
index 7bb9324fe..39e96b955 100644
--- a/src/main/java/stirling/software/SPDF/model/api/security/SignatureValidationRequest.java
+++ b/src/main/java/stirling/software/SPDF/model/api/security/SignatureValidationRequest.java
@@ -13,6 +13,8 @@ import stirling.software.SPDF.model.api.PDFFile;
@EqualsAndHashCode(callSuper = true)
public class SignatureValidationRequest extends PDFFile {
- @Schema(description = "(Optional) file to compare PDF cert signatures against x.509 format")
+ @Schema(
+ description = "(Optional) file to compare PDF cert signatures against x.509 format",
+ requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private MultipartFile certFile;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java
index 80dd2d14e..f69e4c658 100644
--- a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java
+++ b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java
@@ -9,6 +9,9 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
public class UpdateUserDetails extends UpdateUserUsername {
- @Schema(description = "new password for user")
+ @Schema(
+ description = "new password for user",
+ format = "password",
+ requiredMode = Schema.RequiredMode.REQUIRED)
private String newPassword;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java
index c0c14fc08..b4b0105f3 100644
--- a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java
+++ b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java
@@ -9,6 +9,6 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
public class UpdateUserUsername extends UsernameAndPass {
- @Schema(description = "new password for user")
+ @Schema(description = "new username for user")
private String newUsername;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/user/Username.java b/src/main/java/stirling/software/SPDF/model/api/user/Username.java
index d29a544b7..5c8d8a482 100644
--- a/src/main/java/stirling/software/SPDF/model/api/user/Username.java
+++ b/src/main/java/stirling/software/SPDF/model/api/user/Username.java
@@ -9,6 +9,6 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class Username {
- @Schema(description = "username of user")
+ @Schema(description = "username of user", requiredMode = Schema.RequiredMode.REQUIRED)
private String username;
}
diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java b/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java
index ec8f5c08a..e9a205c0d 100644
--- a/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java
+++ b/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java
@@ -9,6 +9,6 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
public class UsernameAndPass extends Username {
- @Schema(description = "password of user")
+ @Schema(description = "password of user", format = "password")
private String password;
}
diff --git a/src/main/java/stirling/software/SPDF/service/LanguageService.java b/src/main/java/stirling/software/SPDF/service/LanguageService.java
index e38105c59..805717f3b 100644
--- a/src/main/java/stirling/software/SPDF/service/LanguageService.java
+++ b/src/main/java/stirling/software/SPDF/service/LanguageService.java
@@ -28,8 +28,7 @@ public class LanguageService {
public Set getSupportedLanguages() {
try {
- Resource[] resources =
- resourcePatternResolver.getResources("classpath*:messages_*.properties");
+ Resource[] resources = getResourcesFromPattern("classpath*:messages_*.properties");
return Arrays.stream(resources)
.map(Resource::getFilename)
@@ -54,4 +53,9 @@ public class LanguageService {
return new HashSet<>();
}
}
+
+ // Protected method to allow overriding in tests
+ protected Resource[] getResourcesFromPattern(String pattern) throws IOException {
+ return resourcePatternResolver.getResources(pattern);
+ }
}
diff --git a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java
index ef2c5b9cf..268a92172 100644
--- a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java
+++ b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java
@@ -25,11 +25,13 @@ import com.vladsch.flexmark.util.data.MutableDataSet;
import io.github.pixee.security.Filenames;
+import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
@Slf4j
+@NoArgsConstructor
public class PDFToFile {
public ResponseEntity processPdfToMarkdown(MultipartFile inputFile)
diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties
index 363fd8e45..600944bd6 100644
--- a/src/main/resources/messages_de_DE.properties
+++ b/src/main/resources/messages_de_DE.properties
@@ -364,9 +364,9 @@ home.compressPdfs.title=Komprimieren
home.compressPdfs.desc=PDF komprimieren um die Dateigröße zu reduzieren
compressPdfs.tags=komprimieren,verkleinern,minimieren
-home.unlockPDFForms.title=Unlock PDF Forms
-home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document.
-unlockPDFForms.tags=remove,delete,form,field,readonly
+home.unlockPDFForms.title=Schreibgeschützte PDF-Formfelder entfernen
+home.unlockPDFForms.desc=Entfernen Sie die schreibgeschützte Eigenschaft von Formularfeldern in einem PDF-Dokument.
+unlockPDFForms.tags=entfernen,löschen,form,feld,schreibgeschützt
home.changeMetadata.title=Metadaten ändern
home.changeMetadata.desc=Ändern/Entfernen/Hinzufügen von Metadaten aus einem PDF-Dokument
@@ -1197,9 +1197,9 @@ changeMetadata.selectText.5=Benutzerdefinierten Metadateneintrag hinzufügen
changeMetadata.submit=Ändern
#unlockPDFForms
-unlockPDFForms.title=Remove Read-Only from Form Fields
-unlockPDFForms.header=Unlock PDF Forms
-unlockPDFForms.submit=Remove
+unlockPDFForms.title=Entfernen Sie schreibgeschützte Formfelder
+unlockPDFForms.header=Schreibgeschützte PDF-Formfelder entfernen
+unlockPDFForms.submit=Entfernen
#pdfToPDFA
pdfToPDFA.title=PDF zu PDF/A
diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties
index 9442e3d8f..03435143b 100644
--- a/src/main/resources/messages_es_ES.properties
+++ b/src/main/resources/messages_es_ES.properties
@@ -124,7 +124,7 @@ pipelineOptions.validateButton=Validar
# ENTERPRISE EDITION #
########################
enterpriseEdition.button=Actualiza a Pro
-enterpriseEdition.warning=Esta característica está únicamente disponible para usuarios Pro.
+enterpriseEdition.warning=Esta característica está disponible solamente para usuarios Pro.
enterpriseEdition.yamlAdvert=Stirling PDF Pro soporta configuración de ficheros YAML y otras características SSO.
enterpriseEdition.ssoAdvert=¿Busca más funciones de administración de usuarios? Consulte Stirling PDF Pro
@@ -364,9 +364,9 @@ home.compressPdfs.title=Comprimir
home.compressPdfs.desc=Comprimir PDFs para reducir el tamaño del archivo
compressPdfs.tags=aplastar,pequeño,diminuto
-home.unlockPDFForms.title=Unlock PDF Forms
-home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document.
-unlockPDFForms.tags=remove,delete,form,field,readonly
+home.unlockPDFForms.title=Desbloquear formularios PDF
+home.unlockPDFForms.desc=Eliminar la propiedad de solo-lectura de los campos de formulario en un documento PDF.
+unlockPDFForms.tags=quitar,eliminar,formulario,campo,solo-lectura
home.changeMetadata.title=Cambiar metadatos
home.changeMetadata.desc=Cambiar/Eliminar/Añadir metadatos al documento PDF
@@ -609,7 +609,7 @@ login.userIsDisabled=El usuario está desactivado, actualmente el acceso está b
login.alreadyLoggedIn=Ya ha iniciado sesión en
login.alreadyLoggedIn2=dispositivos. Cierre sesión en los dispositivos y vuelva a intentarlo.
login.toManySessions=Tiene demasiadas sesiones activas
-login.logoutMessage=You have been logged out.
+login.logoutMessage=Se ha cerrado su sesión.
#auto-redact
autoRedact.title=Auto Censurar Texto
@@ -1023,7 +1023,7 @@ multiTool.deleteSelected=Borrar selecionado(s)
multiTool.downloadAll=Exportar
multiTool.downloadSelected=Exportar selecionado(s)
-multiTool.insertPageBreak=Insertar salto página
+multiTool.insertPageBreak=Insertar salto de página
multiTool.addFile=Agregar Archivo
multiTool.rotateLeft=Rotar a la izquierda
multiTool.rotateRight=Rotar a la derecha
@@ -1061,10 +1061,10 @@ pageRemover.placeholder=(por ejemplo 1,2,6 o 1-10,15-30)
#rotate
-rotate.title=Rotar PDF
-rotate.header=Rotar PDF
-rotate.selectAngle=Seleccionar ángulo de rotación (en múltiplos de 90 grados):
-rotate.submit=Rotar
+rotate.title=Girar PDF
+rotate.header=Girar PDF
+rotate.selectAngle=Seleccionar ángulo de giro (en múltiplos de 90 grados):
+rotate.submit=Girar
#split-pdfs
@@ -1197,9 +1197,9 @@ changeMetadata.selectText.5=Agregar entrada de metadatos personalizados
changeMetadata.submit=Cambiar
#unlockPDFForms
-unlockPDFForms.title=Remove Read-Only from Form Fields
-unlockPDFForms.header=Unlock PDF Forms
-unlockPDFForms.submit=Remove
+unlockPDFForms.title=Eliminar solo-lectura de los campos de formulario
+unlockPDFForms.header=Desbloquear los formularios PDF
+unlockPDFForms.submit=Eliminar
#pdfToPDFA
pdfToPDFA.title=PDF a PDF/A
diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties
index 83510d6f0..1944cd20d 100644
--- a/src/main/resources/messages_fr_FR.properties
+++ b/src/main/resources/messages_fr_FR.properties
@@ -517,13 +517,13 @@ home.showJS.title=Afficher le JavaScript
home.showJS.desc=Recherche et affiche tout JavaScript injecté dans un PDF.
showJS.tags=JS
-home.autoRedact.title=Censure automatique
-home.autoRedact.desc=Censurer automatiquement les informations sensibles d'un PDF.
-autoRedact.tags=caviarder,rédiger,censurer,redact,auto
+home.autoRedact.title=Caviardage automatique
+home.autoRedact.desc=Caviardez automatiquement les informations sensibles d'un PDF.
+autoRedact.tags=caviarder,redact,auto,Masquer,noircir,noir,marqueur,caché,rédiger,censurer
-home.redact.title=Censure manuelle
-home.redact.desc=Censurer un PDF en fonction de texte sélectionné, formes dessinées et/ou des pages sélectionnées.
-redact.tags=Redact,Hide,black out,black,marker,hidden,manual,caviarder,rédiger,censurer
+home.redact.title=Caviardage manuel
+home.redact.desc=Caviarder un PDF en fonction de texte sélectionné, formes dessinées et/ou des pages sélectionnées.
+redact.tags=Caviarder,Redact,Masquer,noircir,noir,marqueur,caché,rédiger,censurer
home.tableExtraxt.title=PDF en CSV
home.tableExtraxt.desc=Extrait les tableaux d'un PDF et les transforme en CSV.
@@ -624,31 +624,31 @@ autoRedact.convertPDFToImageLabel=Convertir un PDF en PDF-Image (utilisé pour s
autoRedact.submitButton=Caviarder
#redact
-redact.title=Rédaction manuelle
-redact.header=Rédaction manuelle
-redact.submit=Rédiger
-redact.textBasedRedaction=Rédaction en fonction de texte
-redact.pageBasedRedaction=Rédaction en fonction de pages
+redact.title=Caviardage manuel
+redact.header=Caviardage manuel
+redact.submit=Caviarder
+redact.textBasedRedaction=Caviarder du texte
+redact.pageBasedRedaction=Caviarder des pages
redact.convertPDFToImageLabel=Convertir en PDF-Image (pour supprimer le texte derrière le rectangle)
redact.pageRedactionNumbers.title=Pages
redact.pageRedactionNumbers.placeholder=(ex: 1,2,8 ou 4,7,12-16 ou 2n-1)
redact.redactionColor.title=Couleur
redact.export=Exporter
redact.upload=Téléverser
-redact.boxRedaction=Dessiner le rectangle à rédiger
+redact.boxRedaction=Tracer le rectangle à caviarder
redact.zoom=Zoom
redact.zoomIn=Zoom avant
redact.zoomOut=Zoom arrière
redact.nextPage=Page suivante
redact.previousPage=Page précédente
-redact.toggleSidebar=Toggle Sidebar
+redact.toggleSidebar=Montrer la barre latérale
redact.showThumbnails=Afficher les miniatures
redact.showDocumentOutline=Montrer les contours du document (double-click pour agrandir/réduire tous les éléments)
redact.showAttatchments=Montrer les éléments attachés
redact.showLayers=Montrer les calques (double-click pour réinitialiser tous les calques à l'état par défaut)
redact.colourPicker=Sélection de couleur
redact.findCurrentOutlineItem=Trouver l'élément de contour courrant
-redact.applyChanges=Apply Changes
+redact.applyChanges=Appliquer les changements
#showJS
showJS.title=Afficher le JavaScript
diff --git a/src/main/resources/messages_ml_ML.properties b/src/main/resources/messages_ml_ML.properties
new file mode 100644
index 000000000..aa6c31a6b
--- /dev/null
+++ b/src/main/resources/messages_ml_ML.properties
@@ -0,0 +1,1439 @@
+###########
+# Generic #
+###########
+# the direction that the language is written (ltr = left to right, rtl = right to left)
+language.direction=ltr
+addPageNumbers.fontSize=അക്ഷര വലുപ്പം
+addPageNumbers.fontName=അക്ഷരത്തിന്റെ പേര്
+pdfPrompt=PDF(കൾ) തിരഞ്ഞെടുക്കുക
+multiPdfPrompt=PDF-കൾ തിരഞ്ഞെടുക്കുക (2+)
+multiPdfDropPrompt=നിങ്ങൾക്ക് ആവശ്യമുള്ള എല്ലാ PDF-കളും തിരഞ്ഞെടുക്കുക (അല്ലെങ്കിൽ വലിച്ചിടുക)
+imgPrompt=ചിത്രം(ങ്ങൾ) തിരഞ്ഞെടുക്കുക
+genericSubmit=സമർപ്പിക്കുക
+uploadLimit=പരമാവധി ഫയൽ വലുപ്പം:
+uploadLimitExceededSingular=വളരെ വലുതാണ്. അനുവദനീയമായ പരമാവധി വലുപ്പം
+uploadLimitExceededPlural=വളരെ വലുതാണ്. അനുവദനീയമായ പരമാവധി വലുപ്പം
+processTimeWarning=മുന്നറിയിപ്പ്: ഫയൽ വലുപ്പത്തിനനുസരിച്ച് ഈ പ്രക്രിയ ഒരു മിനിറ്റ് വരെ എടുത്തേക്കാം
+pageOrderPrompt=ഇഷ്ടാനുസൃത പേജ് ക്രമം (പേജ് നമ്പറുകളുടെ കോമയാൽ വേർതിരിച്ച ലിസ്റ്റ് അല്ലെങ്കിൽ 2n+1 പോലുള്ള ഫംഗ്ഷനുകൾ നൽകുക) :
+pageSelectionPrompt=ഇഷ്ടാനുസൃത പേജ് തിരഞ്ഞെടുക്കൽ (പേജ് നമ്പറുകളുടെ കോമയാൽ വേർതിരിച്ച ലിസ്റ്റ് 1,5,6 അല്ലെങ്കിൽ 2n+1 പോലുള്ള ഫംഗ്ഷനുകൾ നൽകുക) :
+goToPage=പോകുക
+true=ശരി
+false=തെറ്റ്
+unknown=അജ്ഞാതം
+save=സേവ് ചെയ്യുക
+saveToBrowser=ബ്രൗസറിൽ സേവ് ചെയ്യുക
+close=അടയ്ക്കുക
+filesSelected=ഫയലുകൾ തിരഞ്ഞെടുത്തു
+noFavourites=പ്രിയപ്പെട്ടവ ചേർത്തിട്ടില്ല
+downloadComplete=ഡൗൺലോഡ് പൂർത്തിയായി
+bored=കാത്തിരുന്ന് മുഷിഞ്ഞോ?
+alphabet=അക്ഷരമാല
+downloadPdf=PDF ഡൗൺലോഡ് ചെയ്യുക
+text=ടെക്സ്റ്റ്
+font=അക്ഷരം
+selectFillter=-- തിരഞ്ഞെടുക്കുക --
+pageNum=പേജ് നമ്പർ
+sizes.small=ചെറുത്
+sizes.medium=ഇടത്തരം
+sizes.large=വലുത്
+sizes.x-large=കൂടുതൽ വലുത്
+error.pdfPassword=PDF ഡോക്യുമെന്റ് പാസ്വേഡ് ഉപയോഗിച്ച് സംരക്ഷിച്ചിരിക്കുന്നു, പാസ്വേഡ് നൽകിയിട്ടില്ല അല്ലെങ്കിൽ തെറ്റായിരുന്നു
+delete=മായ്ക്കുക
+username=ഉപയോക്തൃനാമം
+password=പാസ്വേഡ്
+welcome=സ്വാഗതം
+property=പ്രോപ്പർട്ടി
+black=കറുപ്പ്
+white=വെള്ള
+red=ചുവപ്പ്
+green=പച്ച
+blue=നീല
+custom=ഇഷ്ടാനുസൃതം...
+WorkInProgess=നിർമ്മാണത്തിലിരിക്കുന്നു, ശരിയായി പ്രവർത്തിച്ചേക്കില്ല അല്ലെങ്കിൽ ബഗ്ഗുകൾ ഉണ്ടാകാം, ദയവായി പ്രശ്നങ്ങൾ അറിയിക്കുക!
+poweredBy=സഹായത്തോടെ
+yes=അതെ
+no=ഇല്ല
+changedCredsMessage=വിവരങ്ങൾ മാറ്റി!
+notAuthenticatedMessage=ഉപയോക്താവിനെ സ്ഥിരീകരിച്ചിട്ടില്ല.
+userNotFoundMessage=ഉപയോക്താവിനെ കണ്ടെത്തിയില്ല.
+incorrectPasswordMessage=നിലവിലെ പാസ്വേഡ് തെറ്റാണ്.
+usernameExistsMessage=പുതിയ ഉപയോക്തൃനാമം ഇതിനകം നിലവിലുണ്ട്.
+invalidUsernameMessage=അസാധുവായ ഉപയോക്തൃനാമം, ഉപയോക്തൃനാമത്തിൽ അക്ഷരങ്ങൾ, അക്കങ്ങൾ, താഴെ പറയുന്ന പ്രത്യേക പ്രതീകങ്ങൾ @._+- എന്നിവ മാത്രമേ ഉണ്ടാകാവൂ അല്ലെങ്കിൽ സാധുവായ ഒരു ഇമെയിൽ വിലാസം ആയിരിക്കണം.
+invalidPasswordMessage=പാസ്വേഡ് ശൂന്യമായിരിക്കരുത്, തുടക്കത്തിലോ അവസാനത്തിലോ സ്പേസുകൾ ഉണ്ടാകരുത്.
+confirmPasswordErrorMessage=പുതിയ പാസ്വേഡും പുതിയ പാസ്വേഡ് സ്ഥിരീകരണവും പൊരുത്തപ്പെടണം.
+deleteCurrentUserMessage=നിലവിൽ ലോഗിൻ ചെയ്തിട്ടുള്ള ഉപയോക്താവിനെ ഇല്ലാതാക്കാൻ കഴിയില്ല.
+deleteUsernameExistsMessage=ഉപയോക്തൃനാമം നിലവിലില്ല, ഇല്ലാതാക്കാൻ കഴിയില്ല.
+downgradeCurrentUserMessage=നിലവിലെ ഉപയോക്താവിന്റെ റോൾ താഴ്ത്താൻ കഴിയില്ല
+disabledCurrentUserMessage=നിലവിലെ ഉപയോക്താവിനെ പ്രവർത്തനരഹിതമാക്കാൻ കഴിയില്ല
+downgradeCurrentUserLongMessage=നിലവിലെ ഉപയോക്താവിന്റെ റോൾ താഴ്ത്താൻ കഴിയില്ല. അതിനാൽ, നിലവിലെ ഉപയോക്താവിനെ കാണിക്കില്ല.
+userAlreadyExistsOAuthMessage=ഈ ഉപയോക്താവ് ഇതിനകം ഒരു OAuth2 ഉപയോക്താവായി നിലവിലുണ്ട്.
+userAlreadyExistsWebMessage=ഈ ഉപയോക്താവ് ഇതിനകം ഒരു വെബ് ഉപയോക്താവായി നിലവിലുണ്ട്.
+error=പിശക്
+oops=അയ്യോ!
+help=സഹായം
+goHomepage=ഹോംപേജിലേക്ക് പോകുക
+joinDiscord=ഞങ്ങളുടെ ഡിസ്കോർഡ് സെർവറിൽ ചേരുക
+seeDockerHub=ഡോക്കർ ഹബ് കാണുക
+visitGithub=ഗിറ്റ്ഹബ് റിപ്പോസിറ്ററി സന്ദർശിക്കുക
+donate=സംഭാവന ചെയ്യുക
+color=നിറം
+sponsor=സ്പോൺസർ ചെയ്യുക
+info=വിവരം
+pro=പ്രോ
+page=പേജ്
+pages=പേജുകൾ
+loading=ലോഡ് ചെയ്യുന്നു...
+addToDoc=പ്രമാണത്തിലേക്ക് ചേർക്കുക
+reset=പുനഃസജ്ജമാക്കുക
+apply=പ്രയോഗിക്കുക
+noFileSelected=ഫയലൊന്നും തിരഞ്ഞെടുത്തിട്ടില്ല. ദയവായി ഒരെണ്ണം അപ്ലോഡ് ചെയ്യുക.
+
+legal.privacy=സ്വകാര്യതാ നയം
+legal.terms=നിബന്ധനകളും വ്യവസ്ഥകളും
+legal.accessibility=ലഭ്യത
+legal.cookie=കുക്കി നയം
+legal.impressum=ഇംപ്രെസ്സം
+legal.showCookieBanner=കുക്കി മുൻഗണനകൾ
+
+###############
+# Pipeline #
+###############
+pipeline.header=പൈപ്പ്ലൈൻ മെനു (ബീറ്റ)
+pipeline.uploadButton=ഇഷ്ടാനുസൃതം അപ്ലോഡ് ചെയ്യുക
+pipeline.configureButton=ക്രമീകരിക്കുക
+pipeline.defaultOption=ഇഷ്ടാനുസൃതം
+pipeline.submitButton=സമർപ്പിക്കുക
+pipeline.help=പൈപ്പ്ലൈൻ സഹായം
+pipeline.scanHelp=ഫോൾഡർ സ്കാനിംഗ് സഹായം
+pipeline.deletePrompt=പൈപ്പ്ലൈൻ ഇല്ലാതാക്കാൻ നിങ്ങൾക്ക് ഉറപ്പാണോ
+
+######################
+# Pipeline Options #
+######################
+pipelineOptions.header=പൈപ്പ്ലൈൻ കോൺഫിഗറേഷൻ
+pipelineOptions.pipelineNameLabel=പൈപ്പ്ലൈൻ പേര്
+pipelineOptions.saveSettings=പ്രവർത്തന ക്രമീകരണങ്ങൾ സംരക്ഷിക്കുക
+pipelineOptions.pipelineNamePrompt=പൈപ്പ്ലൈൻ പേര് ഇവിടെ നൽകുക
+pipelineOptions.selectOperation=പ്രവർത്തനം തിരഞ്ഞെടുക്കുക
+pipelineOptions.addOperationButton=പ്രവർത്തനം ചേർക്കുക
+pipelineOptions.pipelineHeader=പൈപ്പ്ലൈൻ:
+pipelineOptions.saveButton=ഡൗൺലോഡ് ചെയ്യുക
+pipelineOptions.validateButton=സ്ഥിരീകരിക്കുക
+
+########################
+# ENTERPRISE EDITION #
+########################
+enterpriseEdition.button=പ്രോയിലേക്ക് അപ്ഗ്രേഡ് ചെയ്യുക
+enterpriseEdition.warning=ഈ ഫീച്ചർ പ്രോ ഉപയോക്താക്കൾക്ക് മാത്രമേ ലഭ്യമാകൂ.
+enterpriseEdition.yamlAdvert=സ്റ്റെർലിംഗ് PDF പ്രോ YAML കോൺഫിഗറേഷൻ ഫയലുകളെയും മറ്റ് SSO സവിശേഷതകളെയും പിന്തുണയ്ക്കുന്നു.
+enterpriseEdition.ssoAdvert=കൂടുതൽ ഉപയോക്തൃ മാനേജുമെന്റ് സവിശേഷതകൾക്കായി തിരയുകയാണോ? സ്റ്റെർലിംഗ് PDF പ്രോ പരിശോധിക്കുക
+
+
+#################
+# Analytics #
+#################
+analytics.title=സ്റ്റെർലിംഗ് PDF മികച്ചതാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?
+analytics.paragraph1=ഉൽപ്പന്നം മെച്ചപ്പെടുത്താൻ ഞങ്ങളെ സഹായിക്കുന്നതിന് സ്റ്റെർലിംഗ് PDF-ൽ ഓപ്റ്റ്-ഇൻ അനലിറ്റിക്സ് ഉണ്ട്. ഞങ്ങൾ വ്യക്തിഗത വിവരങ്ങളോ ഫയൽ ഉള്ളടക്കങ്ങളോ ട്രാക്ക് ചെയ്യുന്നില്ല.
+analytics.paragraph2=സ്റ്റെർലിംഗ്-PDF വളരാനും ഞങ്ങളുടെ ഉപയോക്താക്കളെ നന്നായി മനസ്സിലാക്കാനും അനലിറ്റിക്സ് പ്രവർത്തനക്ഷമമാക്കുന്നത് പരിഗണിക്കുക.
+analytics.enable=അനലിറ്റിക്സ് പ്രവർത്തനക്ഷമമാക്കുക
+analytics.disable=അനലിറ്റിക്സ് പ്രവർത്തനരഹിതമാക്കുക
+analytics.settings=config/settings.yml ഫയലിൽ നിങ്ങൾക്ക് അനലിറ്റിക്സിനായുള്ള ക്രമീകരണങ്ങൾ മാറ്റാൻ കഴിയും
+
+
+#############
+# NAVBAR #
+#############
+navbar.favorite=പ്രിയപ്പെട്ടവ
+navbar.recent=പുതിയതും അടുത്തിടെ അപ്ഡേറ്റ് ചെയ്തതും
+navbar.darkmode=ഡാർക്ക് മോഡ്
+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=ജനപ്രിയം
+
+#############
+# SETTINGS #
+#############
+settings.title=ക്രമീകരണങ്ങൾ
+settings.update=അപ്ഡേറ്റ് ലഭ്യമാണ്
+settings.updateAvailable={0} നിലവിൽ ഇൻസ്റ്റാൾ ചെയ്ത പതിപ്പാണ്. ഒരു പുതിയ പതിപ്പ് ({1}) ലഭ്യമാണ്.
+settings.appVersion=ആപ്പ് പതിപ്പ്:
+settings.downloadOption.title=ഡൗൺലോഡ് ഓപ്ഷൻ തിരഞ്ഞെടുക്കുക (സിംഗിൾ ഫയൽ നോൺ-സിപ്പ് ഡൗൺലോഡുകൾക്ക്):
+settings.downloadOption.1=ഒരേ വിൻഡോയിൽ തുറക്കുക
+settings.downloadOption.2=പുതിയ വിൻഡോയിൽ തുറക്കുക
+settings.downloadOption.3=ഫയൽ ഡൗൺലോഡ് ചെയ്യുക
+settings.zipThreshold=ഡൗൺലോഡ് ചെയ്ത ഫയലുകളുടെ എണ്ണം കവിയുമ്പോൾ ഫയലുകൾ സിപ്പ് ചെയ്യുക
+settings.signOut=സൈൻ ഔട്ട് ചെയ്യുക
+settings.accountSettings=അക്കൗണ്ട് ക്രമീകരണങ്ങൾ
+settings.bored.help=ഈസ്റ്റർ എഗ് ഗെയിം പ്രവർത്തനക്ഷമമാക്കുന്നു
+settings.cacheInputs.name=ഫോം ഇൻപുട്ടുകൾ സംരക്ഷിക്കുക
+settings.cacheInputs.help=ഭാവിയിലെ ഉപയോഗത്തിനായി മുമ്പ് ഉപയോഗിച്ച ഇൻപുട്ടുകൾ സംഭരിക്കാൻ പ്രവർത്തനക്ഷമമാക്കുക
+
+changeCreds.title=വിവരങ്ങൾ മാറ്റുക
+changeCreds.header=നിങ്ങളുടെ അക്കൗണ്ട് വിവരങ്ങൾ അപ്ഡേറ്റ് ചെയ്യുക
+changeCreds.changePassword=നിങ്ങൾ സ്ഥിര ലോഗിൻ വിവരങ്ങളാണ് ഉപയോഗിക്കുന്നത്. ദയവായി ഒരു പുതിയ പാസ്വേഡ് നൽകുക
+changeCreds.newUsername=പുതിയ ഉപയോക്തൃനാമം
+changeCreds.oldPassword=നിലവിലെ പാസ്വേഡ്
+changeCreds.newPassword=പുതിയ പാസ്വേഡ്
+changeCreds.confirmNewPassword=പുതിയ പാസ്വേഡ് സ്ഥിരീകരിക്കുക
+changeCreds.submit=മാറ്റങ്ങൾ സമർപ്പിക്കുക
+
+
+
+account.title=അക്കൗണ്ട് ക്രമീകരണങ്ങൾ
+account.accountSettings=അക്കൗണ്ട് ക്രമീകരണങ്ങൾ
+account.adminSettings=അഡ്മിൻ ക്രമീകരണങ്ങൾ - ഉപയോക്താക്കളെ കാണുക, ചേർക്കുക
+account.userControlSettings=ഉപയോക്തൃ നിയന്ത്രണ ക്രമീകരണങ്ങൾ
+account.changeUsername=ഉപയോക്തൃനാമം മാറ്റുക
+account.newUsername=പുതിയ ഉപയോക്തൃനാമം
+account.password=സ്ഥിരീകരണ പാസ്വേഡ്
+account.oldPassword=പഴയ പാസ്വേഡ്
+account.newPassword=പുതിയ പാസ്വേഡ്
+account.changePassword=പാസ്വേഡ് മാറ്റുക
+account.confirmNewPassword=പുതിയ പാസ്വേഡ് സ്ഥിരീകരിക്കുക
+account.signOut=സൈൻ ഔട്ട് ചെയ്യുക
+account.yourApiKey=നിങ്ങളുടെ API കീ
+account.syncTitle=ബ്രൗസർ ക്രമീകരണങ്ങൾ അക്കൗണ്ടുമായി സമന്വയിപ്പിക്കുക
+account.settingsCompare=ക്രമീകരണ താരതമ്യം:
+account.property=പ്രോപ്പർട്ടി
+account.webBrowserSettings=വെബ് ബ്രൗസർ ക്രമീകരണം
+account.syncToBrowser=അക്കൗണ്ട് സമന്വയിപ്പിക്കുക -> ബ്രൗസർ
+account.syncToAccount=അക്കൗണ്ട് സമന്വയിപ്പിക്കുക <- ബ്രൗസർ
+
+
+adminUserSettings.title=ഉപയോക്തൃ നിയന്ത്രണ ക്രമീകരണങ്ങൾ
+adminUserSettings.header=അഡ്മിൻ ഉപയോക്തൃ നിയന്ത്രണ ക്രമീകരണങ്ങൾ
+adminUserSettings.admin=അഡ്മിൻ
+adminUserSettings.user=ഉപയോക്താവ്
+adminUserSettings.addUser=പുതിയ ഉപയോക്താവിനെ ചേർക്കുക
+adminUserSettings.deleteUser=ഉപയോക്താവിനെ ഇല്ലാതാക്കുക
+adminUserSettings.confirmDeleteUser=ഉപയോക്താവിനെ ഇല്ലാതാക്കണോ?
+adminUserSettings.confirmChangeUserStatus=ഉപയോക്താവിനെ പ്രവർത്തനരഹിതമാക്കുകയോ/പ്രവർത്തനക്ഷമമാക്കുകയോ ചെയ്യണോ?
+adminUserSettings.usernameInfo=ഉപയോക്തൃനാമത്തിൽ അക്ഷരങ്ങൾ, അക്കങ്ങൾ, താഴെ പറയുന്ന പ്രത്യേക പ്രതീകങ്ങൾ @._+- എന്നിവ മാത്രമേ ഉണ്ടാകാവൂ അല്ലെങ്കിൽ സാധുവായ ഒരു ഇമെയിൽ വിലാസം ആയിരിക്കണം.
+adminUserSettings.roles=റോളുകൾ
+adminUserSettings.role=റോൾ
+adminUserSettings.actions=പ്രവർത്തനങ്ങൾ
+adminUserSettings.apiUser=പരിമിതമായ API ഉപയോക്താവ്
+adminUserSettings.extraApiUser=അധിക പരിമിതമായ API ഉപയോക്താവ്
+adminUserSettings.webOnlyUser=വെബ് മാത്രം ഉപയോക്താവ്
+adminUserSettings.demoUser=ഡെമോ ഉപയോക്താവ് (ഇഷ്ടാനുസൃത ക്രമീകരണങ്ങളില്ല)
+adminUserSettings.internalApiUser=ആന്തരിക API ഉപയോക്താവ്
+adminUserSettings.forceChange=ലോഗിൻ ചെയ്യുമ്പോൾ പാസ്വേഡ് മാറ്റാൻ ഉപയോക്താവിനെ നിർബന്ധിക്കുക
+adminUserSettings.submit=ഉപയോക്താവിനെ സംരക്ഷിക്കുക
+adminUserSettings.changeUserRole=ഉപയോക്താവിന്റെ റോൾ മാറ്റുക
+adminUserSettings.authenticated=സ്ഥിരീകരിച്ചു
+adminUserSettings.editOwnProfil=സ്വന്തം പ്രൊഫൈൽ തിരുത്തുക
+adminUserSettings.enabledUser=പ്രവർത്തനക്ഷമമാക്കിയ ഉപയോക്താവ്
+adminUserSettings.disabledUser=പ്രവർത്തനരഹിതമാക്കിയ ഉപയോക്താവ്
+adminUserSettings.activeUsers=സജീവ ഉപയോക്താക്കൾ:
+adminUserSettings.disabledUsers=പ്രവർത്തനരഹിതമാക്കിയ ഉപയോക്താക്കൾ:
+adminUserSettings.totalUsers=ആകെ ഉപയോക്താക്കൾ:
+adminUserSettings.lastRequest=അവസാന അഭ്യർത്ഥന
+adminUserSettings.usage=ഉപയോഗം കാണുക
+
+endpointStatistics.title=എൻഡ്പോയിന്റ് സ്ഥിതിവിവരക്കണക്കുകൾ
+endpointStatistics.header=എൻഡ്പോയിന്റ് സ്ഥിതിവിവരക്കണക്കുകൾ
+endpointStatistics.top10=മികച്ച 10
+endpointStatistics.top20=മികച്ച 20
+endpointStatistics.all=എല്ലാം
+endpointStatistics.refresh=പുതുക്കുക
+endpointStatistics.includeHomepage=ഹോംപേജ് ഉൾപ്പെടുത്തുക ('/')
+endpointStatistics.includeLoginPage=ലോഗിൻ പേജ് ഉൾപ്പെടുത്തുക ('/login')
+endpointStatistics.totalEndpoints=ആകെ എൻഡ്പോയിന്റുകൾ
+endpointStatistics.totalVisits=ആകെ സന്ദർശനങ്ങൾ
+endpointStatistics.showing=കാണിക്കുന്നു
+endpointStatistics.selectedVisits=തിരഞ്ഞെടുത്ത സന്ദർശനങ്ങൾ
+endpointStatistics.endpoint=എൻഡ്പോയിന്റ്
+endpointStatistics.visits=സന്ദർശനങ്ങൾ
+endpointStatistics.percentage=ശതമാനം
+endpointStatistics.loading=ലോഡ് ചെയ്യുന്നു...
+endpointStatistics.failedToLoad=എൻഡ്പോയിന്റ് ഡാറ്റ ലോഡ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു. ദയവായി പുതുക്കാൻ ശ്രമിക്കുക.
+endpointStatistics.home=ഹോം
+endpointStatistics.login=ലോഗിൻ
+endpointStatistics.top=മികച്ച
+endpointStatistics.numberOfVisits=സന്ദർശനങ്ങളുടെ എണ്ണം
+endpointStatistics.visitsTooltip=സന്ദർശനങ്ങൾ: {0} (ആകെയുള്ളതിന്റെ {1}%)
+endpointStatistics.retry=വീണ്ടും ശ്രമിക്കുക
+
+database.title=ഡാറ്റാബേസ് ഇറക്കുമതി/കയറ്റുമതി
+database.header=ഡാറ്റാബേസ് ഇറക്കുമതി/കയറ്റുമതി
+database.fileName=ഫയലിന്റെ പേര്
+database.creationDate=സൃഷ്ടിച്ച തീയതി
+database.fileSize=ഫയൽ വലുപ്പം
+database.deleteBackupFile=ബാക്കപ്പ് ഫയൽ ഇല്ലാതാക്കുക
+database.importBackupFile=ബാക്കപ്പ് ഫയൽ ഇറക്കുമതി ചെയ്യുക
+database.createBackupFile=ബാക്കപ്പ് ഫയൽ സൃഷ്ടിക്കുക
+database.downloadBackupFile=ബാക്കപ്പ് ഫയൽ ഡൗൺലോഡ് ചെയ്യുക
+database.info_1=ഡാറ്റ ഇറക്കുമതി ചെയ്യുമ്പോൾ, ശരിയായ ഘടന ഉറപ്പാക്കേണ്ടത് പ്രധാനമാണ്. നിങ്ങൾ എന്താണ് ചെയ്യുന്നതെന്ന് നിങ്ങൾക്ക് ഉറപ്പില്ലെങ്കിൽ, ഒരു പ്രൊഫഷണലിൽ നിന്ന് ഉപദേശവും പിന്തുണയും തേടുക. ഘടനയിലെ ഒരു പിശക് ആപ്ലിക്കേഷൻ തകരാറുകൾക്ക് കാരണമാകും, ആപ്ലിക്കേഷൻ പ്രവർത്തിപ്പിക്കാൻ കഴിയാത്ത അവസ്ഥ വരെ.
+database.info_2=അപ്ലോഡ് ചെയ്യുമ്പോൾ ഫയലിന്റെ പേര് പ്രശ്നമല്ല. സ്ഥിരമായ നാമകരണ കൺവെൻഷൻ ഉറപ്പാക്കുന്നതിന്, backup_user_yyyyMMddHHmm.sql എന്ന ഫോർമാറ്റ് പിന്തുടരാൻ ഇത് പിന്നീട് പുനർനാമകരണം ചെയ്യപ്പെടും.
+database.submit=ബാക്കപ്പ് ഇറക്കുമതി ചെയ്യുക
+database.importIntoDatabaseSuccessed=ഡാറ്റാബേസിലേക്കുള്ള ഇറക്കുമതി വിജയിച്ചു
+database.backupCreated=ഡാറ്റാബേസ് ബാക്കപ്പ് വിജയകരം
+database.fileNotFound=ഫയൽ കണ്ടെത്തിയില്ല
+database.fileNullOrEmpty=ഫയൽ ശൂന്യമായിരിക്കരുത്
+database.failedImportFile=ഇറക്കുമതി ഫയൽ പരാജയപ്പെട്ടു
+database.notSupported=നിങ്ങളുടെ ഡാറ്റാബേസ് കണക്ഷനായി ഈ പ്രവർത്തനം ലഭ്യമല്ല.
+
+session.expired=നിങ്ങളുടെ സെഷൻ കാലഹരണപ്പെട്ടു. ദയവായി പേജ് പുതുക്കി വീണ്ടും ശ്രമിക്കുക.
+session.refreshPage=പേജ് പുതുക്കുക
+
+#############
+# HOME-PAGE #
+#############
+home.desc=നിങ്ങളുടെ എല്ലാ PDF ആവശ്യങ്ങൾക്കുമുള്ള നിങ്ങളുടെ പ്രാദേശികമായി ഹോസ്റ്റ് ചെയ്ത ഏകജാലക ഷോപ്പ്.
+home.searchBar=സവിശേഷതകൾക്കായി തിരയുക...
+
+
+home.viewPdf.title=PDF കാണുക/തിരുത്തുക
+home.viewPdf.desc=കാണുക, വ്യാഖ്യാനിക്കുക, വരയ്ക്കുക, ടെക്സ്റ്റ് അല്ലെങ്കിൽ ചിത്രങ്ങൾ ചേർക്കുക
+viewPdf.tags=കാണുക,വായിക്കുക,വ്യാഖ്യാനിക്കുക,ടെക്സ്റ്റ്,ചിത്രം,ഹൈലൈറ്റ്,തിരുത്തുക
+
+home.setFavorites=പ്രിയപ്പെട്ടവ സജ്ജമാക്കുക
+home.hideFavorites=പ്രിയപ്പെട്ടവ മറയ്ക്കുക
+home.showFavorites=പ്രിയപ്പെട്ടവ കാണിക്കുക
+home.legacyHomepage=പഴയ ഹോംപേജ്
+home.newHomePage=ഞങ്ങളുടെ പുതിയ ഹോംപേജ് പരീക്ഷിക്കുക!
+home.alphabetical=അക്ഷരമാലാക്രമത്തിൽ
+home.globalPopularity=ആഗോള ജനപ്രീതി
+home.sortBy=ഇതനുസരിച്ച് അടുക്കുക:
+
+home.multiTool.title=PDF മൾട്ടി ടൂൾ
+home.multiTool.desc=പേജുകൾ ലയിപ്പിക്കുക, തിരിക്കുക, പുനഃക്രമീകരിക്കുക, വിഭജിക്കുക, നീക്കം ചെയ്യുക
+multiTool.tags=മൾട്ടി ടൂൾ,മൾട്ടി ഓപ്പറേഷൻ,യുഐ,ക്ലിക്ക് ഡ്രാഗ്,ഫ്രണ്ട് എൻഡ്,ക്ലയിന്റ് സൈഡ്,ഇന്ററാക്ടീവ്,അനങ്ങാത്ത,നീക്കുക,ഇല്ലാതാക്കുക,കൈമാറുക,വിഭജിക്കുക
+
+home.merge.title=ലയിപ്പിക്കുക
+home.merge.desc=ഒന്നിലധികം PDF-കൾ എളുപ്പത്തിൽ ഒന്നിലേക്ക് ലയിപ്പിക്കുക.
+merge.tags=ലയിപ്പിക്കുക,പേജ് പ്രവർത്തനങ്ങൾ,ബാക്ക് എൻഡ്,സെർവർ സൈഡ്
+
+home.split.title=വിഭജിക്കുക
+home.split.desc=PDF-കൾ ഒന്നിലധികം പ്രമാണങ്ങളായി വിഭജിക്കുക
+split.tags=പേജ് പ്രവർത്തനങ്ങൾ,വിഭജിക്കുക,മൾട്ടി പേജ്,മുറിക്കുക,സെർവർ സൈഡ്
+
+home.rotate.title=തിരിക്കുക
+home.rotate.desc=നിങ്ങളുടെ PDF-കൾ എളുപ്പത്തിൽ തിരിക്കുക.
+rotate.tags=സെർവർ സൈഡ്
+
+
+home.imageToPdf.title=ചിത്രം PDF-ലേക്ക്
+home.imageToPdf.desc=ഒരു ചിത്രം (PNG, JPEG, GIF) PDF-ലേക്ക് മാറ്റുക.
+imageToPdf.tags=പരിവർത്തനം,img,jpg,ചിത്രം,ഫോട്ടോ
+
+home.pdfToImage.title=PDF ചിത്രത്തിലേക്ക്
+home.pdfToImage.desc=ഒരു PDF ചിത്രത്തിലേക്ക് മാറ്റുക. (PNG, JPEG, GIF)
+pdfToImage.tags=പരിവർത്തനം,img,jpg,ചിത്രം,ഫോട്ടോ
+
+home.pdfOrganiser.title=ക്രമീകരിക്കുക
+home.pdfOrganiser.desc=ഏത് ക്രമത്തിലും പേജുകൾ നീക്കം ചെയ്യുക/പുനഃക്രമീകരിക്കുക
+pdfOrganiser.tags=ഡ്യൂപ്ലെക്സ്,ഇരട്ട,ഒറ്റ,അടുക്കുക,നീക്കുക
+
+
+home.addImage.title=ചിത്രം ചേർക്കുക
+home.addImage.desc=PDF-ൽ ഒരു നിശ്ചിത സ്ഥാനത്ത് ഒരു ചിത്രം ചേർക്കുന്നു
+addImage.tags=img,jpg,ചിത്രം,ഫോട്ടോ
+
+home.watermark.title=വാട്ടർമാർക്ക് ചേർക്കുക
+home.watermark.desc=നിങ്ങളുടെ PDF പ്രമാണത്തിലേക്ക് ഒരു ഇഷ്ടാനുസൃത വാട്ടർമാർക്ക് ചേർക്കുക.
+watermark.tags=ടെക്സ്റ്റ്,ആവർത്തിക്കുന്ന,ലേബൽ,സ്വന്തം,പകർപ്പവകാശം,വ്യാപാരമുദ്ര,img,jpg,ചിത്രം,ഫോട്ടോ
+
+home.permissions.title=അനുമതികൾ മാറ്റുക
+home.permissions.desc=നിങ്ങളുടെ PDF പ്രമാണത്തിന്റെ അനുമതികൾ മാറ്റുക
+permissions.tags=വായിക്കുക,എഴുതുക,തിരുത്തുക,അച്ചടിക്കുക
+
+
+home.removePages.title=നീക്കം ചെയ്യുക
+home.removePages.desc=നിങ്ങളുടെ PDF പ്രമാണത്തിൽ നിന്ന് ആവശ്യമില്ലാത്ത പേജുകൾ ഇല്ലാതാക്കുക.
+removePages.tags=പേജുകൾ നീക്കം ചെയ്യുക,പേജുകൾ ഇല്ലാതാക്കുക
+
+home.addPassword.title=പാസ്വേഡ് ചേർക്കുക
+home.addPassword.desc=നിങ്ങളുടെ PDF പ്രമാണം ഒരു പാസ്വേഡ് ഉപയോഗിച്ച് എൻക്രിപ്റ്റ് ചെയ്യുക.
+addPassword.tags=സുരക്ഷിതം,സുരക്ഷ
+
+home.removePassword.title=പാസ്വേഡ് നീക്കം ചെയ്യുക
+home.removePassword.desc=നിങ്ങളുടെ PDF പ്രമാണത്തിൽ നിന്ന് പാസ്വേഡ് സംരക്ഷണം നീക്കം ചെയ്യുക.
+removePassword.tags=സുരക്ഷിതം,ഡീക്രിപ്റ്റ്,സുരക്ഷ,പാസ്വേഡ് ഇല്ലാതാക്കുക,പാസ്വേഡ് നീക്കം ചെയ്യുക
+
+home.compressPdfs.title=കംപ്രസ് ചെയ്യുക
+home.compressPdfs.desc=ഫയൽ വലുപ്പം കുറയ്ക്കുന്നതിന് PDF-കൾ കംപ്രസ് ചെയ്യുക.
+compressPdfs.tags=ചുരുക്കുക,ചെറുത്,വളരെ ചെറുത്
+
+home.unlockPDFForms.title=PDF ഫോമുകൾ അൺലോക്ക് ചെയ്യുക
+home.unlockPDFForms.desc=ഒരു PDF പ്രമാണത്തിലെ ഫോം ഫീൽഡുകളുടെ റീഡ്-ഒൺലി പ്രോപ്പർട്ടി നീക്കം ചെയ്യുക.
+unlockPDFForms.tags=നീക്കം ചെയ്യുക,ഇല്ലാതാക്കുക,ഫോം,ഫീൽഡ്,റീഡ്-ഒൺലി
+
+home.changeMetadata.title=മെറ്റാഡാറ്റ മാറ്റുക
+home.changeMetadata.desc=ഒരു PDF പ്രമാണത്തിൽ നിന്ന് മെറ്റാഡാറ്റ മാറ്റുക/നീക്കം ചെയ്യുക/ചേർക്കുക
+changeMetadata.tags=തലക്കെട്ട്,രചയിതാവ്,തീയതി,സൃഷ്ടി,സമയം,പ്രസാധകൻ,നിർമ്മാതാവ്,സ്ഥിതിവിവരക്കണക്കുകൾ
+
+home.fileToPDF.title=ഫയൽ PDF-ലേക്ക് മാറ്റുക
+home.fileToPDF.desc=ഏകദേശം ഏത് ഫയലും PDF-ലേക്ക് മാറ്റുക (DOCX, PNG, XLS, PPT, TXT എന്നിവയും അതിൽ കൂടുതലും)
+fileToPDF.tags=രൂപാന്തരം,ഫോർമാറ്റ്,പ്രമാണം,ചിത്രം,സ്ലൈഡ്,ടെക്സ്റ്റ്,പരിവർത്തനം,ഓഫീസ്,ഡോക്സ്,വേഡ്,എക്സൽ,പവർപോയിന്റ്
+
+home.ocr.title=OCR / സ്കാനുകൾ വൃത്തിയാക്കുക
+home.ocr.desc=സ്കാനുകൾ വൃത്തിയാക്കുകയും ഒരു PDF-നുള്ളിലെ ചിത്രങ്ങളിൽ നിന്ന് ടെക്സ്റ്റ് കണ്ടെത്തുകയും അത് ടെക്സ്റ്റായി വീണ്ടും ചേർക്കുകയും ചെയ്യുന്നു.
+ocr.tags=തിരിച്ചറിയൽ,ടെക്സ്റ്റ്,ചിത്രം,സ്കാൻ,വായിക്കുക,തിരിച്ചറിയുക,കണ്ടെത്തൽ,തിരുത്താവുന്നത്
+
+home.extractImages.title=ചിത്രങ്ങൾ വേർതിരിച്ചെടുക്കുക
+home.extractImages.desc=ഒരു PDF-ൽ നിന്ന് എല്ലാ ചിത്രങ്ങളും വേർതിരിച്ചെടുത്ത് സിപ്പിലേക്ക് സംരക്ഷിക്കുന്നു
+extractImages.tags=ചിത്രം,ഫോട്ടോ,സംരക്ഷിക്കുക,ആർക്കൈവ്,സിപ്പ്,പിടിച്ചെടുക്കുക,നേടുക
+
+home.pdfToPDFA.title=PDF PDF/A-ലേക്ക്
+home.pdfToPDFA.desc=ദീർഘകാല സംഭരണത്തിനായി PDF PDF/A-ലേക്ക് മാറ്റുക
+pdfToPDFA.tags=ആർക്കൈവ്,ദീർഘകാല,മാനദണ്ഡം,പരിവർത്തനം,സംഭരണം,സംരക്ഷണം
+
+home.PDFToWord.title=PDF വേഡിലേക്ക്
+home.PDFToWord.desc=PDF വേഡ് ഫോർമാറ്റുകളിലേക്ക് (DOC, DOCX, ODT) മാറ്റുക
+PDFToWord.tags=doc,docx,odt,വേഡ്,രൂപാന്തരം,ഫോർമാറ്റ്,പരിവർത്തനം,ഓഫീസ്,മൈക്രോസോഫ്റ്റ്,ഡോക്ഫയൽ
+
+home.PDFToPresentation.title=PDF പ്രസന്റേഷനിലേക്ക്
+home.PDFToPresentation.desc=PDF പ്രസന്റേഷൻ ഫോർമാറ്റുകളിലേക്ക് (PPT, PPTX, ODP) മാറ്റുക
+PDFToPresentation.tags=സ്ലൈഡുകൾ,ഷോ,ഓഫീസ്,മൈക്രോസോഫ്റ്റ്
+
+home.PDFToText.title=PDF RTF-ലേക്ക് (ടെക്സ്റ്റ്)
+home.PDFToText.desc=PDF ടെക്സ്റ്റ് അല്ലെങ്കിൽ RTF ഫോർമാറ്റിലേക്ക് മാറ്റുക
+PDFToText.tags=റിച്ച്ഫോർമാറ്റ്,റിച്ച്ടെക്സ്റ്റ്ഫോർമാറ്റ്,റിച്ച് ടെക്സ്റ്റ് ഫോർമാറ്റ്
+
+home.PDFToHTML.title=PDF HTML-ലേക്ക്
+home.PDFToHTML.desc=PDF HTML ഫോർമാറ്റിലേക്ക് മാറ്റുക
+PDFToHTML.tags=വെബ് ഉള്ളടക്കം,ബ്രൗസർ സൗഹൃദം
+
+
+home.PDFToXML.title=PDF XML-ലേക്ക്
+home.PDFToXML.desc=PDF XML ഫോർമാറ്റിലേക്ക് മാറ്റുക
+PDFToXML.tags=ഡാറ്റ-എക്സ്ട്രാക്ഷൻ,ഘടനയുള്ള-ഉള്ളടക്കം,ഇന്ററോപ്പ്,രൂപാന്തരം,പരിവർത്തനം ചെയ്യുക
+
+home.ScannerImageSplit.title=സ്കാൻ ചെയ്ത ഫോട്ടോകൾ കണ്ടെത്തുക/വിഭജിക്കുക
+home.ScannerImageSplit.desc=ഒരു ഫോട്ടോ/PDF-നുള്ളിൽ നിന്ന് ഒന്നിലധികം ഫോട്ടോകൾ വിഭജിക്കുന്നു
+ScannerImageSplit.tags=വേർതിരിക്കുക,സ്വയം-കണ്ടെത്തുക,സ്കാനുകൾ,മൾട്ടി-ഫോട്ടോ,ക്രമീകരിക്കുക
+
+home.sign.title=ഒപ്പിടുക
+home.sign.desc=വരച്ചോ, ടെക്സ്റ്റ് ഉപയോഗിച്ചോ, ചിത്രം ഉപയോഗിച്ചോ PDF-ൽ ഒപ്പ് ചേർക്കുന്നു
+sign.tags=അംഗീകരിക്കുക,ആദ്യാക്ഷരങ്ങൾ,വരച്ച-ഒപ്പ്,ടെക്സ്റ്റ്-ഒപ്പ്,ചിത്ര-ഒപ്പ്
+
+home.flatten.title=പരത്തുക
+home.flatten.desc=ഒരു PDF-ൽ നിന്ന് എല്ലാ ഇന്ററാക്ടീവ് ഘടകങ്ങളും ഫോമുകളും നീക്കം ചെയ്യുക
+flatten.tags=സ്ഥിരം,പ്രവർത്തനരഹിതമാക്കുക,നോൺ-ഇന്ററാക്ടീവ്,ലഘൂകരിക്കുക
+
+home.repair.title=നന്നാക്കുക
+home.repair.desc=കേടായ/തകർന്ന PDF നന്നാക്കാൻ ശ്രമിക്കുന്നു
+repair.tags=പരിഹരിക്കുക,പുനഃസ്ഥാപിക്കുക,തിരുത്തൽ,വീണ്ടെടുക്കുക
+
+home.removeBlanks.title=ശൂന്യമായ പേജുകൾ നീക്കം ചെയ്യുക
+home.removeBlanks.desc=ഒരു പ്രമാണത്തിൽ നിന്ന് ശൂന്യമായ പേജുകൾ കണ്ടെത്തുകയും നീക്കം ചെയ്യുകയും ചെയ്യുന്നു
+removeBlanks.tags=വൃത്തിയാക്കൽ,ലഘൂകരിക്കുക,ഉള്ളടക്കമില്ലാത്ത,ക്രമീകരിക്കുക
+
+home.removeAnnotations.title=വ്യാഖ്യാനങ്ങൾ നീക്കം ചെയ്യുക
+home.removeAnnotations.desc=ഒരു PDF-ൽ നിന്ന് എല്ലാ അഭിപ്രായങ്ങളും/വ്യാഖ്യാനങ്ങളും നീക്കം ചെയ്യുന്നു
+removeAnnotations.tags=അഭിപ്രായങ്ങൾ,ഹൈലൈറ്റ്,കുറിപ്പുകൾ,മാർക്ക്അപ്പ്,നീക്കം ചെയ്യുക
+
+home.compare.title=താരതമ്യം ചെയ്യുക
+home.compare.desc=2 PDF പ്രമാണങ്ങൾ തമ്മിലുള്ള വ്യത്യാസങ്ങൾ താരതമ്യം ചെയ്യുകയും കാണിക്കുകയും ചെയ്യുന്നു
+compare.tags=വേർതിരിക്കുക,വ്യത്യാസം,മാറ്റങ്ങൾ,വിശകലനം
+
+home.certSign.title=സർട്ടിഫിക്കറ്റ് ഉപയോഗിച്ച് ഒപ്പിടുക
+home.certSign.desc=ഒരു സർട്ടിഫിക്കറ്റ്/കീ (PEM/P12) ഉപയോഗിച്ച് ഒരു PDF ഒപ്പിടുന്നു
+certSign.tags=സ്ഥിരീകരിക്കുക,PEM,P12,ഔദ്യോഗികം,എൻക്രിപ്റ്റ് ചെയ്യുക
+
+home.removeCertSign.title=സർട്ടിഫിക്കറ്റ് ഒപ്പ് നീക്കം ചെയ്യുക
+home.removeCertSign.desc=PDF-ൽ നിന്ന് സർട്ടിഫിക്കറ്റ് ഒപ്പ് നീക്കം ചെയ്യുക
+removeCertSign.tags=സ്ഥിരീകരിക്കുക,PEM,P12,ഔദ്യോഗികം,ഡീക്രിപ്റ്റ് ചെയ്യുക
+
+home.pageLayout.title=മൾട്ടി-പേജ് ലേഔട്ട്
+home.pageLayout.desc=ഒരു PDF പ്രമാണത്തിന്റെ ഒന്നിലധികം പേജുകൾ ഒരൊറ്റ പേജിലേക്ക് ലയിപ്പിക്കുക
+pageLayout.tags=ലയിപ്പിക്കുക,സംയോജിപ്പിക്കുക,ഒറ്റ-കാഴ്ച,ക്രമീകരിക്കുക
+
+home.scalePages.title=പേജ് വലുപ്പം/സ്കെയിൽ ക്രമീകരിക്കുക
+home.scalePages.desc=ഒരു പേജിന്റെയും/അല്ലെങ്കിൽ അതിന്റെ ഉള്ളടക്കങ്ങളുടെയും വലുപ്പം/സ്കെയിൽ മാറ്റുക.
+scalePages.tags=വലുപ്പം മാറ്റുക,പരിഷ്ക്കരിക്കുക,അളവ്,അനുയോജ്യമാക്കുക
+
+home.pipeline.title=പൈപ്പ്ലൈൻ
+home.pipeline.desc=പൈപ്പ്ലൈൻ സ്ക്രിപ്റ്റുകൾ നിർവചിച്ചുകൊണ്ട് PDF-കളിൽ ഒന്നിലധികം പ്രവർത്തനങ്ങൾ നടത്തുക
+pipeline.tags=ഓട്ടോമേറ്റ് ചെയ്യുക,ക്രമീകരിക്കുക,സ്ക്രിപ്റ്റ് ചെയ്ത,ബാച്ച്-പ്രോസസ്സ്
+
+home.add-page-numbers.title=പേജ് നമ്പറുകൾ ചേർക്കുക
+home.add-page-numbers.desc=ഒരു പ്രമാണത്തിലുടനീളം ഒരു നിശ്ചിത സ്ഥാനത്ത് പേജ് നമ്പറുകൾ ചേർക്കുക
+add-page-numbers.tags=പേജ് നമ്പർ നൽകുക,ലേബൽ,ക്രമീകരിക്കുക,സൂചിക
+
+home.auto-rename.title=PDF ഫയൽ സ്വയം പുനർനാമകരണം ചെയ്യുക
+home.auto-rename.desc=കണ്ടെത്തിയ തലക്കെട്ടിനെ അടിസ്ഥാനമാക്കി ഒരു PDF ഫയൽ സ്വയം പുനർനാമകരണം ചെയ്യുന്നു
+auto-rename.tags=സ്വയം-കണ്ടെത്തുക,തലക്കെട്ട്-അടിസ്ഥാനമാക്കിയുള്ള,ക്രമീകരിക്കുക,പുനർലേബൽ ചെയ്യുക
+
+home.adjust-contrast.title=നിറങ്ങൾ/കോൺട്രാസ്റ്റ് ക്രമീകരിക്കുക
+home.adjust-contrast.desc=ഒരു PDF-ന്റെ കോൺട്രാസ്റ്റ്, സാച്ചുറേഷൻ, തെളിച്ചം എന്നിവ ക്രമീകരിക്കുക
+adjust-contrast.tags=നിറം-തിരുത്തൽ,ട്യൂൺ ചെയ്യുക,പരിഷ്ക്കരിക്കുക,മെച്ചപ്പെടുത്തുക
+
+home.crop.title=PDF ക്രോപ്പ് ചെയ്യുക
+home.crop.desc=വലുപ്പം കുറയ്ക്കാൻ ഒരു PDF ക്രോപ്പ് ചെയ്യുക (ടെക്സ്റ്റ് നിലനിർത്തുന്നു!)
+crop.tags=മുറിക്കുക,ചുരുക്കുക,തിരുത്തുക,രൂപം
+
+home.autoSplitPDF.title=പേജുകൾ സ്വയം വിഭജിക്കുക
+home.autoSplitPDF.desc=ഭൗതികമായി സ്കാൻ ചെയ്ത പേജ് സ്പ്ലിറ്റർ QR കോഡ് ഉപയോഗിച്ച് സ്കാൻ ചെയ്ത PDF സ്വയം വിഭജിക്കുക
+autoSplitPDF.tags=QR-അടിസ്ഥാനമാക്കിയുള്ള,വേർതിരിക്കുക,സ്കാൻ-സെഗ്മെന്റ്,ക്രമീകരിക്കുക
+
+home.sanitizePdf.title=ശുദ്ധീകരിക്കുക
+home.sanitizePdf.desc=PDF ഫയലുകളിൽ നിന്ന് സ്ക്രിപ്റ്റുകളും മറ്റ് ഘടകങ്ങളും നീക്കം ചെയ്യുക
+sanitizePdf.tags=വൃത്തിയാക്കുക,സുരക്ഷിതമാക്കുക,സുരക്ഷിതം,ഭീഷണികൾ-നീക്കം ചെയ്യുക
+
+home.URLToPDF.title=URL/വെബ്സൈറ്റ് PDF-ലേക്ക്
+home.URLToPDF.desc=ഏത് http(s)URL-നെയും PDF-ലേക്ക് മാറ്റുന്നു
+URLToPDF.tags=വെബ്-ക്യാപ്ചർ,പേജ്-സംരക്ഷിക്കുക,വെബ്-ടു-ഡോക്,ആർക്കൈവ്
+
+home.HTMLToPDF.title=HTML PDF-ലേക്ക്
+home.HTMLToPDF.desc=ഏത് HTML ഫയലിനെയും അല്ലെങ്കിൽ സിപ്പിനെയും PDF-ലേക്ക് മാറ്റുന്നു
+HTMLToPDF.tags=മാർക്ക്അപ്പ്,വെബ്-ഉള്ളടക്കം,രൂപാന്തരം,പരിവർത്തനം ചെയ്യുക
+
+
+home.MarkdownToPDF.title=മാർക്ക്ഡൗൺ PDF-ലേക്ക്
+home.MarkdownToPDF.desc=ഏത് മാർക്ക്ഡൗൺ ഫയലിനെയും PDF-ലേക്ക് മാറ്റുന്നു
+MarkdownToPDF.tags=മാർക്ക്അപ്പ്,വെബ്-ഉള്ളടക്കം,രൂപാന്തരം,പരിവർത്തനം ചെയ്യുക,md
+
+home.PDFToMarkdown.title=PDF മാർക്ക്ഡൗണിലേക്ക്
+home.PDFToMarkdown.desc=ഏത് PDF-നെയും മാർക്ക്ഡൗണിലേക്ക് മാറ്റുന്നു
+PDFToMarkdown.tags=മാർക്ക്അപ്പ്,വെബ്-ഉള്ളടക്കം,രൂപാന്തരം,പരിവർത്തനം ചെയ്യുക,md
+
+home.getPdfInfo.title=PDF-നെക്കുറിച്ചുള്ള എല്ലാ വിവരങ്ങളും നേടുക
+home.getPdfInfo.desc=PDF-കളെക്കുറിച്ചുള്ള സാധ്യമായ എല്ലാ വിവരങ്ങളും നേടുന്നു
+getPdfInfo.tags=വിവരം,ഡാറ്റ,സ്ഥിതിവിവരക്കണക്കുകൾ,സ്ഥിതിവിവരക്കണക്കുകൾ
+
+
+home.extractPage.title=പേജ്(കൾ) വേർതിരിച്ചെടുക്കുക
+home.extractPage.desc=PDF-ൽ നിന്ന് തിരഞ്ഞെടുത്ത പേജുകൾ വേർതിരിച്ചെടുക്കുന്നു
+extractPage.tags=വേർതിരിച്ചെടുക്കുക
+
+
+home.PdfToSinglePage.title=ഒരൊറ്റ വലിയ പേജ്
+home.PdfToSinglePage.desc=എല്ലാ PDF പേജുകളും ഒരൊറ്റ വലിയ പേജിലേക്ക് ലയിപ്പിക്കുന്നു
+PdfToSinglePage.tags=ഒറ്റ പേജ്
+
+
+home.showJS.title=ജാവാസ്ക്രിപ്റ്റ് കാണിക്കുക
+home.showJS.desc=ഒരു PDF-ൽ കുത്തിവച്ച ഏതെങ്കിലും JS തിരയുകയും പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്നു
+showJS.tags=JS
+
+home.autoRedact.title=സ്വയം റെഡാക്റ്റ് ചെയ്യുക
+home.autoRedact.desc=ഇൻപുട്ട് ടെക്സ്റ്റിനെ അടിസ്ഥാനമാക്കി ഒരു PDF-ലെ ടെക്സ്റ്റ് സ്വയം റെഡാക്റ്റ് (കറുപ്പിക്കുന്നു) ചെയ്യുന്നു
+autoRedact.tags=റെഡാക്റ്റ്,മറയ്ക്കുക,കറുപ്പിക്കുക,കറുപ്പ്,മാർക്കർ,മറഞ്ഞിരിക്കുന്ന
+
+home.redact.title=സ്വയം റെഡാക്ഷൻ
+home.redact.desc=തിരഞ്ഞെടുത്ത ടെക്സ്റ്റ്, വരച്ച രൂപങ്ങൾ കൂടാതെ/അല്ലെങ്കിൽ തിരഞ്ഞെടുത്ത പേജ്(കൾ) അടിസ്ഥാനമാക്കി ഒരു PDF റെഡാക്റ്റ് ചെയ്യുന്നു
+redact.tags=റെഡാക്റ്റ്,മറയ്ക്കുക,കറുപ്പിക്കുക,കറുപ്പ്,മാർക്കർ,മറഞ്ഞിരിക്കുന്ന,സ്വയം
+
+home.tableExtraxt.title=PDF CSV-ലേക്ക്
+home.tableExtraxt.desc=ഒരു PDF-ൽ നിന്ന് പട്ടികകൾ വേർതിരിച്ചെടുത്ത് CSV-ലേക്ക് മാറ്റുന്നു
+tableExtraxt.tags=CSV,പട്ടിക വേർതിരിച്ചെടുക്കൽ,വേർതിരിച്ചെടുക്കുക,പരിവർത്തനം ചെയ്യുക
+
+
+home.autoSizeSplitPDF.title=വലുപ്പം/എണ്ണം അനുസരിച്ച് സ്വയം വിഭജിക്കുക
+home.autoSizeSplitPDF.desc=വലുപ്പം, പേജ് എണ്ണം, അല്ലെങ്കിൽ പ്രമാണങ്ങളുടെ എണ്ണം എന്നിവ അടിസ്ഥാനമാക്കി ഒരൊറ്റ PDF ഒന്നിലധികം പ്രമാണങ്ങളായി വിഭജിക്കുക
+autoSizeSplitPDF.tags=pdf,വിഭജിക്കുക,പ്രമാണം,സംഘടന
+
+
+home.overlay-pdfs.title=PDF-കൾ ഓവർലേ ചെയ്യുക
+home.overlay-pdfs.desc=മറ്റൊരു PDF-ന് മുകളിൽ PDF-കൾ ഓവർലേ ചെയ്യുന്നു
+overlay-pdfs.tags=ഓവർലേ
+
+home.split-by-sections.title=വിഭാഗങ്ങൾ അനുസരിച്ച് PDF വിഭജിക്കുക
+home.split-by-sections.desc=ഒരു PDF-ന്റെ ഓരോ പേജും ചെറിയ തിരശ്ചീനവും ലംബവുമായ വിഭാഗങ്ങളായി വിഭജിക്കുക
+split-by-sections.tags=വിഭാഗം വിഭജനം, വിഭജിക്കുക, ഇഷ്ടാനുസൃതമാക്കുക
+
+home.AddStampRequest.title=PDF-ൽ സ്റ്റാമ്പ് ചേർക്കുക
+home.AddStampRequest.desc=നിശ്ചിത സ്ഥാനങ്ങളിൽ ടെക്സ്റ്റ് അല്ലെങ്കിൽ ഇമേജ് സ്റ്റാമ്പുകൾ ചേർക്കുക
+AddStampRequest.tags=സ്റ്റാമ്പ്, ചിത്രം ചേർക്കുക, ചിത്രം മധ്യത്തിലാക്കുക, വാട്ടർമാർക്ക്, PDF, ഉൾപ്പെടുത്തുക, ഇഷ്ടാനുസൃതമാക്കുക
+
+
+home.removeImagePdf.title=ചിത്രം നീക്കം ചെയ്യുക
+home.removeImagePdf.desc=ഫയൽ വലുപ്പം കുറയ്ക്കാൻ PDF-ൽ നിന്ന് ചിത്രം നീക്കം ചെയ്യുക
+removeImagePdf.tags=ചിത്രം നീക്കം ചെയ്യുക,പേജ് പ്രവർത്തനങ്ങൾ,ബാക്ക് എൻഡ്,സെർവർ സൈഡ്
+
+
+home.splitPdfByChapters.title=അധ്യായങ്ങൾ അനുസരിച്ച് PDF വിഭജിക്കുക
+home.splitPdfByChapters.desc=അതിന്റെ അധ്യായ ഘടനയെ അടിസ്ഥാനമാക്കി ഒരു PDF ഒന്നിലധികം ഫയലുകളായി വിഭജിക്കുക.
+splitPdfByChapters.tags=വിഭജിക്കുക,അധ്യായങ്ങൾ,ബുക്ക്മാർക്കുകൾ,ക്രമീകരിക്കുക
+
+home.validateSignature.title=PDF ഒപ്പ് സാധൂകരിക്കുക
+home.validateSignature.desc=PDF പ്രമാണങ്ങളിലെ ഡിജിറ്റൽ ഒപ്പുകളും സർട്ടിഫിക്കറ്റുകളും പരിശോധിക്കുക
+validateSignature.tags=ഒപ്പ്,പരിശോധിക്കുക,സാധൂകരിക്കുക,pdf,സർട്ടിഫിക്കറ്റ്,ഡിജിറ്റൽ ഒപ്പ്,ഒപ്പ് സാധൂകരിക്കുക,സർട്ടിഫിക്കറ്റ് സാധൂകരിക്കുക
+
+#replace-invert-color
+replace-color.title=നിറം-മാറ്റുക-വിപരീതമാക്കുക
+replace-color.header=PDF-ലെ നിറം മാറ്റുക-വിപരീതമാക്കുക
+home.replaceColorPdf.title=നിറം മാറ്റുകയും വിപരീതമാക്കുകയും ചെയ്യുക
+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=ഉയർന്ന കോൺട്രാസ്റ്റ് വർണ്ണ ഓപ്ഷനുകൾ
+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=മാറ്റുക
+
+
+
+###########################
+# #
+# WEB PAGES #
+# #
+###########################
+#login
+login.title=സൈൻ ഇൻ ചെയ്യുക
+login.header=സൈൻ ഇൻ ചെയ്യുക
+login.signin=സൈൻ ഇൻ ചെയ്യുക
+login.rememberme=എന്നെ ഓർക്കുക
+login.invalid=അസാധുവായ ഉപയോക്തൃനാമം അല്ലെങ്കിൽ പാസ്വേഡ്.
+login.locked=നിങ്ങളുടെ അക്കൗണ്ട് ലോക്ക് ചെയ്തിരിക്കുന്നു.
+login.signinTitle=ദയവായി സൈൻ ഇൻ ചെയ്യുക
+login.ssoSignIn=സിംഗിൾ സൈൻ-ഓൺ വഴി ലോഗിൻ ചെയ്യുക
+login.oAuth2AutoCreateDisabled=OAUTH2 ഓട്ടോ-ക്രിയേറ്റ് യൂസർ പ്രവർത്തനരഹിതമാക്കി
+login.oAuth2AdminBlockedUser=രജിസ്റ്റർ ചെയ്യാത്ത ഉപയോക്താക്കളുടെ രജിസ്ട്രേഷനോ ലോഗിൻ ചെയ്യുന്നതോ നിലവിൽ തടഞ്ഞിരിക്കുന്നു. ദയവായി അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടുക.
+login.oauth2RequestNotFound=അംഗീകാര അഭ്യർത്ഥന കണ്ടെത്തിയില്ല
+login.oauth2InvalidUserInfoResponse=അസാധുവായ ഉപയോക്തൃ വിവര പ്രതികരണം
+login.oauth2invalidRequest=അസാധുവായ അഭ്യർത്ഥന
+login.oauth2AccessDenied=പ്രവേശനം നിഷേധിച്ചു
+login.oauth2InvalidTokenResponse=അസാധുവായ ടോക്കൺ പ്രതികരണം
+login.oauth2InvalidIdToken=അസാധുവായ ഐഡി ടോക്കൺ
+login.relyingPartyRegistrationNotFound=റിലയിംഗ് പാർട്ടി രജിസ്ട്രേഷൻ കണ്ടെത്തിയില്ല
+login.userIsDisabled=ഉപയോക്താവ് പ്രവർത്തനരഹിതമാക്കി, ഈ ഉപയോക്തൃനാമം ഉപയോഗിച്ചുള്ള ലോഗിൻ നിലവിൽ തടഞ്ഞിരിക്കുന്നു. ദയവായി അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടുക.
+login.alreadyLoggedIn=നിങ്ങൾ ഇതിനകം ലോഗിൻ ചെയ്തിട്ടുണ്ട്
+login.alreadyLoggedIn2=ഉപകരണങ്ങളിൽ. ദയവായി ഉപകരണങ്ങളിൽ നിന്ന് ലോഗ് ഔട്ട് ചെയ്ത് വീണ്ടും ശ്രമിക്കുക.
+login.toManySessions=നിങ്ങൾക്ക് വളരെയധികം സജീവ സെഷനുകൾ ഉണ്ട്
+login.logoutMessage=നിങ്ങൾ ലോഗ് ഔട്ട് ചെയ്തു.
+
+#auto-redact
+autoRedact.title=സ്വയം റെഡാക്റ്റ് ചെയ്യുക
+autoRedact.header=സ്വയം റെഡാക്റ്റ് ചെയ്യുക
+autoRedact.colorLabel=നിറം
+autoRedact.textsToRedactLabel=റെഡാക്റ്റ് ചെയ്യേണ്ട ടെക്സ്റ്റ് (വരികളാൽ വേർതിരിച്ചത്)
+autoRedact.textsToRedactPlaceholder=ഉദാ. \nരഹസ്യം \nഅതീവ-രഹസ്യം
+autoRedact.useRegexLabel=റെഗുലർ എക്സ്പ്രഷൻ ഉപയോഗിക്കുക
+autoRedact.wholeWordSearchLabel=മുഴുവൻ വാക്ക് തിരയൽ
+autoRedact.customPaddingLabel=ഇഷ്ടാനുസൃത അധിക പാഡിംഗ്
+autoRedact.convertPDFToImageLabel=PDF-നെ PDF-ചിത്രത്തിലേക്ക് മാറ്റുക (ബോക്സിന് പിന്നിലെ ടെക്സ്റ്റ് നീക്കം ചെയ്യാൻ ഉപയോഗിക്കുന്നു)
+autoRedact.submitButton=സമർപ്പിക്കുക
+
+#redact
+redact.title=സ്വയം റെഡാക്ഷൻ
+redact.header=സ്വയം റെഡാക്ഷൻ
+redact.submit=റെഡാക്റ്റ് ചെയ്യുക
+redact.textBasedRedaction=ടെക്സ്റ്റ് അടിസ്ഥാനമാക്കിയുള്ള റെഡാക്ഷൻ
+redact.pageBasedRedaction=പേജ് അടിസ്ഥാനമാക്കിയുള്ള റെഡാക്ഷൻ
+redact.convertPDFToImageLabel=PDF-നെ PDF-ചിത്രത്തിലേക്ക് മാറ്റുക (ബോക്സിന് പിന്നിലെ ടെക്സ്റ്റ് നീക്കം ചെയ്യാൻ ഉപയോഗിക്കുന്നു)
+redact.pageRedactionNumbers.title=പേജുകൾ
+redact.pageRedactionNumbers.placeholder=(ഉദാ. 1,2,8 അല്ലെങ്കിൽ 4,7,12-16 അല്ലെങ്കിൽ 2n-1)
+redact.redactionColor.title=റെഡാക്ഷൻ നിറം
+redact.export=കയറ്റുമതി ചെയ്യുക
+redact.upload=അപ്ലോഡ് ചെയ്യുക
+redact.boxRedaction=ബോക്സ് വരച്ച് റെഡാക്ഷൻ
+redact.zoom=സൂം
+redact.zoomIn=സൂം ഇൻ
+redact.zoomOut=സൂം ഔട്ട്
+redact.nextPage=അടുത്ത പേജ്
+redact.previousPage=മുമ്പത്തെ പേജ്
+redact.toggleSidebar=സൈഡ്ബാർ ടോഗിൾ ചെയ്യുക
+redact.showThumbnails=ലഘുചിത്രങ്ങൾ കാണിക്കുക
+redact.showDocumentOutline=പ്രമാണ രൂപരേഖ കാണിക്കുക (എല്ലാ ഇനങ്ങളും വികസിപ്പിക്കാനും/ചുരുക്കാനും ഇരട്ട-ക്ലിക്ക് ചെയ്യുക)
+redact.showAttatchments=അറ്റാച്ച്മെന്റുകൾ കാണിക്കുക
+redact.showLayers=പാളികൾ കാണിക്കുക (എല്ലാ പാളികളും സ്ഥിരസ്ഥിതിയിലേക്ക് പുനഃസജ്ജമാക്കാൻ ഇരട്ട-ക്ലിക്ക് ചെയ്യുക)
+redact.colourPicker=നിറം തിരഞ്ഞെടുക്കാനുള്ള ഉപകരണം
+redact.findCurrentOutlineItem=നിലവിലെ രൂപരേഖാ ഇനം കണ്ടെത്തുക
+redact.applyChanges=മാറ്റങ്ങൾ പ്രയോഗിക്കുക
+
+#showJS
+showJS.title=ജാവാസ്ക്രിപ്റ്റ് കാണിക്കുക
+showJS.header=ജാവാസ്ക്രിപ്റ്റ് കാണിക്കുക
+showJS.downloadJS=ജാവാസ്ക്രിപ്റ്റ് ഡൗൺലോഡ് ചെയ്യുക
+showJS.submit=കാണിക്കുക
+
+
+#pdfToSinglePage
+pdfToSinglePage.title=PDF ഒരൊറ്റ പേജിലേക്ക്
+pdfToSinglePage.header=PDF ഒരൊറ്റ പേജിലേക്ക്
+pdfToSinglePage.submit=ഒരൊറ്റ പേജിലേക്ക് മാറ്റുക
+
+
+#pageExtracter
+pageExtracter.title=പേജുകൾ വേർതിരിച്ചെടുക്കുക
+pageExtracter.header=പേജുകൾ വേർതിരിച്ചെടുക്കുക
+pageExtracter.submit=വേർതിരിച്ചെടുക്കുക
+pageExtracter.placeholder=(ഉദാ. 1,2,8 അല്ലെങ്കിൽ 4,7,12-16 അല്ലെങ്കിൽ 2n-1)
+
+
+#getPdfInfo
+getPdfInfo.title=PDF-നെക്കുറിച്ചുള്ള വിവരങ്ങൾ നേടുക
+getPdfInfo.header=PDF-നെക്കുറിച്ചുള്ള വിവരങ്ങൾ നേടുക
+getPdfInfo.submit=വിവരങ്ങൾ നേടുക
+getPdfInfo.downloadJson=JSON ഡൗൺലോഡ് ചെയ്യുക
+
+
+#markdown-to-pdf
+MarkdownToPDF.title=മാർക്ക്ഡൗൺ PDF-ലേക്ക്
+MarkdownToPDF.header=മാർക്ക്ഡൗൺ PDF-ലേക്ക്
+MarkdownToPDF.submit=പരിവർത്തനം ചെയ്യുക
+MarkdownToPDF.help=നിർമ്മാണത്തിലിരിക്കുന്നു
+MarkdownToPDF.credit=WeasyPrint ഉപയോഗിക്കുന്നു
+
+
+#pdf-to-markdown
+PDFToMarkdown.title=PDF മാർക്ക്ഡൗണിലേക്ക്
+PDFToMarkdown.header=PDF മാർക്ക്ഡൗണിലേക്ക്
+PDFToMarkdown.submit=പരിവർത്തനം ചെയ്യുക
+
+
+#url-to-pdf
+URLToPDF.title=URL PDF-ലേക്ക്
+URLToPDF.header=URL PDF-ലേക്ക്
+URLToPDF.submit=പരിവർത്തനം ചെയ്യുക
+URLToPDF.credit=WeasyPrint ഉപയോഗിക്കുന്നു
+
+
+#html-to-pdf
+HTMLToPDF.title=HTML PDF-ലേക്ക്
+HTMLToPDF.header=HTML PDF-ലേക്ക്
+HTMLToPDF.help=HTML ഫയലുകളും html/css/ചിത്രങ്ങൾ തുടങ്ങിയവ അടങ്ങിയ ZIP-കളും സ്വീകരിക്കുന്നു
+HTMLToPDF.submit=പരിവർത്തനം ചെയ്യുക
+HTMLToPDF.credit=WeasyPrint ഉപയോഗിക്കുന്നു
+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=PDF സ്റ്റാമ്പ് ചെയ്യുക
+AddStampRequest.title=PDF സ്റ്റാമ്പ് ചെയ്യുക
+AddStampRequest.stampType=സ്റ്റാമ്പ് തരം
+AddStampRequest.stampText=സ്റ്റാമ്പ് ടെക്സ്റ്റ്
+AddStampRequest.stampImage=സ്റ്റാമ്പ് ചിത്രം
+AddStampRequest.alphabet=അക്ഷരമാല
+AddStampRequest.fontSize=അക്ഷര/ചിത്ര വലുപ്പം
+AddStampRequest.rotation=തിരിക്കൽ
+AddStampRequest.opacity=അതാര്യത
+AddStampRequest.position=സ്ഥാനം
+AddStampRequest.overrideX=X കോർഡിനേറ്റ് മാറ്റിയെഴുതുക
+AddStampRequest.overrideY=Y കോർഡിനേറ്റ് മാറ്റിയെഴുതുക
+AddStampRequest.customMargin=ഇഷ്ടാനുസൃത മാർജിൻ
+AddStampRequest.customColor=ഇഷ്ടാനുസൃത ടെക്സ്റ്റ് നിറം
+AddStampRequest.submit=സമർപ്പിക്കുക
+
+
+#sanitizePDF
+sanitizePDF.title=PDF ശുദ്ധീകരിക്കുക
+sanitizePDF.header=ഒരു PDF ഫയൽ ശുദ്ധീകരിക്കുക
+sanitizePDF.selectText.1=ജാവാസ്ക്രിപ്റ്റ് പ്രവർത്തനങ്ങൾ നീക്കം ചെയ്യുക
+sanitizePDF.selectText.2=ഉൾച്ചേർത്ത ഫയലുകൾ നീക്കം ചെയ്യുക
+sanitizePDF.selectText.3=XMP മെറ്റാഡാറ്റ നീക്കം ചെയ്യുക
+sanitizePDF.selectText.4=ലിങ്കുകൾ നീക്കം ചെയ്യുക
+sanitizePDF.selectText.5=അക്ഷരങ്ങൾ നീക്കം ചെയ്യുക
+sanitizePDF.selectText.6=പ്രമാണ വിവര മെറ്റാഡാറ്റ നീക്കം ചെയ്യുക
+sanitizePDF.submit=PDF ശുദ്ധീകരിക്കുക
+
+
+#addPageNumbers
+addPageNumbers.title=പേജ് നമ്പറുകൾ ചേർക്കുക
+addPageNumbers.header=പേജ് നമ്പറുകൾ ചേർക്കുക
+addPageNumbers.selectText.1=PDF ഫയൽ തിരഞ്ഞെടുക്കുക:
+addPageNumbers.selectText.2=മാർജിൻ വലുപ്പം
+addPageNumbers.selectText.3=സ്ഥാനം
+addPageNumbers.selectText.4=ആരംഭിക്കുന്ന നമ്പർ
+addPageNumbers.selectText.5=നമ്പർ ചെയ്യേണ്ട പേജുകൾ
+addPageNumbers.selectText.6=ഇഷ്ടാനുസൃത ടെക്സ്റ്റ്
+addPageNumbers.customTextDesc=ഇഷ്ടാനുസൃത ടെക്സ്റ്റ്
+addPageNumbers.numberPagesDesc=ഏത് പേജുകളാണ് നമ്പർ ചെയ്യേണ്ടത്, സ്ഥിരസ്ഥിതി 'എല്ലാം', 1-5 അല്ലെങ്കിൽ 2,5,9 തുടങ്ങിയവയും സ്വീകരിക്കുന്നു
+addPageNumbers.customNumberDesc=സ്ഥിരസ്ഥിതിയായി {n}, 'പേജ് {n} / {total}', 'ടെക്സ്റ്റ്-{n}', '{filename}-{n}' എന്നിവയും സ്വീകരിക്കുന്നു
+addPageNumbers.submit=പേജ് നമ്പറുകൾ ചേർക്കുക
+
+
+#auto-rename
+auto-rename.title=സ്വയം പുനർനാമകരണം ചെയ്യുക
+auto-rename.header=PDF സ്വയം പുനർനാമകരണം ചെയ്യുക
+auto-rename.submit=സ്വയം പുനർനാമകരണം ചെയ്യുക
+
+
+#adjustContrast
+adjustContrast.title=കോൺട്രാസ്റ്റ് ക്രമീകരിക്കുക
+adjustContrast.header=കോൺട്രാസ്റ്റ് ക്രമീകരിക്കുക
+adjustContrast.contrast=കോൺട്രാസ്റ്റ്:
+adjustContrast.brightness=തെളിച്ചം:
+adjustContrast.saturation=സാച്ചുറേഷൻ:
+adjustContrast.download=ഡൗൺലോഡ് ചെയ്യുക
+
+
+#crop
+crop.title=ക്രോപ്പ് ചെയ്യുക
+crop.header=PDF ക്രോപ്പ് ചെയ്യുക
+crop.submit=സമർപ്പിക്കുക
+
+
+#autoSplitPDF
+autoSplitPDF.title=PDF സ്വയം വിഭജിക്കുക
+autoSplitPDF.header=PDF സ്വയം വിഭജിക്കുക
+autoSplitPDF.description=അച്ചടിക്കുക, തിരുകുക, സ്കാൻ ചെയ്യുക, അപ്ലോഡ് ചെയ്യുക, നിങ്ങളുടെ പ്രമാണങ്ങൾ ഞങ്ങൾ സ്വയം വേർതിരിക്കട്ടെ. സ്വയം അടുക്കേണ്ട ആവശ്യമില്ല.
+autoSplitPDF.selectText.1=താഴെ നിന്ന് കുറച്ച് വിഭജന ഷീറ്റുകൾ അച്ചടിക്കുക (കറുപ്പും വെളുപ്പും മതി).
+autoSplitPDF.selectText.2=അവയ്ക്കിടയിൽ വിഭജന ഷീറ്റ് തിരുകി നിങ്ങളുടെ എല്ലാ പ്രമാണങ്ങളും ഒരേസമയം സ്കാൻ ചെയ്യുക.
+autoSplitPDF.selectText.3=ഒരൊറ്റ വലിയ സ്കാൻ ചെയ്ത PDF ഫയൽ അപ്ലോഡ് ചെയ്യുക, ബാക്കിയുള്ളവ സ്റ്റെർലിംഗ് PDF കൈകാര്യം ചെയ്യട്ടെ.
+autoSplitPDF.selectText.4=വിഭജന പേജുകൾ സ്വയം കണ്ടെത്തുകയും നീക്കം ചെയ്യുകയും ചെയ്യുന്നു, ഇത് വൃത്തിയുള്ള അന്തിമ പ്രമാണം ഉറപ്പാക്കുന്നു.
+autoSplitPDF.formPrompt=സ്റ്റെർലിംഗ്-PDF പേജ് വിഭജനങ്ങൾ അടങ്ങിയ PDF സമർപ്പിക്കുക:
+autoSplitPDF.duplexMode=ഡ്യൂപ്ലെക്സ് മോഡ് (മുന്നിലും പിന്നിലും സ്കാനിംഗ്)
+autoSplitPDF.dividerDownload2='ഓട്ടോ സ്പ്ലിറ്റർ ഡിവൈഡർ (നിർദ്ദേശങ്ങളോടുകൂടി).pdf' ഡൗൺലോഡ് ചെയ്യുക
+autoSplitPDF.submit=സമർപ്പിക്കുക
+
+
+#pipeline
+pipeline.title=പൈപ്പ്ലൈൻ
+
+
+#pageLayout
+pageLayout.title=മൾട്ടി പേജ് ലേഔട്ട്
+pageLayout.header=മൾട്ടി പേജ് ലേഔട്ട്
+pageLayout.pagesPerSheet=ഓരോ ഷീറ്റിലെയും പേജുകൾ:
+pageLayout.addBorder=അതിരുകൾ ചേർക്കുക
+pageLayout.submit=സമർപ്പിക്കുക
+
+
+#scalePages
+scalePages.title=പേജ്-സ്കെയിൽ ക്രമീകരിക്കുക
+scalePages.header=പേജ്-സ്കെയിൽ ക്രമീകരിക്കുക
+scalePages.pageSize=പ്രമാണത്തിലെ ഒരു പേജിന്റെ വലുപ്പം.
+scalePages.keepPageSize=യഥാർത്ഥ വലുപ്പം
+scalePages.scaleFactor=ഒരു പേജിന്റെ സൂം നില (ക്രോപ്പ്).
+scalePages.submit=സമർപ്പിക്കുക
+
+
+#certSign
+certSign.title=സർട്ടിഫിക്കറ്റ് ഒപ്പിടൽ
+certSign.header=നിങ്ങളുടെ സർട്ടിഫിക്കറ്റ് ഉപയോഗിച്ച് ഒരു PDF ഒപ്പിടുക (നിർമ്മാണത്തിലിരിക്കുന്നു)
+certSign.selectPDF=ഒപ്പിടുന്നതിനായി ഒരു PDF ഫയൽ തിരഞ്ഞെടുക്കുക:
+certSign.jksNote=ശ്രദ്ധിക്കുക: നിങ്ങളുടെ സർട്ടിഫിക്കറ്റ് തരം താഴെ ലിസ്റ്റ് ചെയ്തിട്ടില്ലെങ്കിൽ, ദയവായി കീടൂൾ കമാൻഡ് ലൈൻ ടൂൾ ഉപയോഗിച്ച് അതിനെ ഒരു ജാവ കീസ്റ്റോർ (.jks) ഫയലിലേക്ക് മാറ്റുക. തുടർന്ന്, താഴെയുള്ള .jks ഫയൽ ഓപ്ഷൻ തിരഞ്ഞെടുക്കുക.
+certSign.selectKey=നിങ്ങളുടെ സ്വകാര്യ കീ ഫയൽ തിരഞ്ഞെടുക്കുക (PKCS#8 ഫോർമാറ്റ്, .pem അല്ലെങ്കിൽ .der ആകാം):
+certSign.selectCert=നിങ്ങളുടെ സർട്ടിഫിക്കറ്റ് ഫയൽ തിരഞ്ഞെടുക്കുക (X.509 ഫോർമാറ്റ്, .pem അല്ലെങ്കിൽ .der ആകാം):
+certSign.selectP12=നിങ്ങളുടെ PKCS#12 കീസ്റ്റോർ ഫയൽ (.p12 അല്ലെങ്കിൽ .pfx) തിരഞ്ഞെടുക്കുക (ഓപ്ഷണൽ, നൽകിയിട്ടുണ്ടെങ്കിൽ, അതിൽ നിങ്ങളുടെ സ്വകാര്യ കീയും സർട്ടിഫിക്കറ്റും അടങ്ങിയിരിക്കണം):
+certSign.selectJKS=നിങ്ങളുടെ ജാവ കീസ്റ്റോർ ഫയൽ (.jks അല്ലെങ്കിൽ .keystore) തിരഞ്ഞെടുക്കുക:
+certSign.certType=സർട്ടിഫിക്കറ്റ് തരം
+certSign.password=നിങ്ങളുടെ കീസ്റ്റോർ അല്ലെങ്കിൽ സ്വകാര്യ കീ പാസ്വേഡ് നൽകുക (ഉണ്ടെങ്കിൽ):
+certSign.showSig=ഒപ്പ് കാണിക്കുക
+certSign.reason=കാരണം
+certSign.location=സ്ഥലം
+certSign.name=പേര്
+certSign.showLogo=ലോഗോ കാണിക്കുക
+certSign.submit=PDF ഒപ്പിടുക
+
+
+#removeCertSign
+removeCertSign.title=സർട്ടിഫിക്കറ്റ് ഒപ്പ് നീക്കം ചെയ്യുക
+removeCertSign.header=PDF-ൽ നിന്ന് ഡിജിറ്റൽ സർട്ടിഫിക്കറ്റ് നീക്കം ചെയ്യുക
+removeCertSign.selectPDF=ഒരു PDF ഫയൽ തിരഞ്ഞെടുക്കുക:
+removeCertSign.submit=ഒപ്പ് നീക്കം ചെയ്യുക
+
+
+#removeBlanks
+removeBlanks.title=ശൂന്യമായവ നീക്കം ചെയ്യുക
+removeBlanks.header=ശൂന്യമായ പേജുകൾ നീക്കം ചെയ്യുക
+removeBlanks.threshold=പിക്സൽ വെളുപ്പ് പരിധി:
+removeBlanks.thresholdDesc='വെള്ള' എന്ന് തരംതിരിക്കാൻ ഒരു വെളുത്ത പിക്സൽ എത്ര വെളുത്തതായിരിക്കണം എന്ന് നിർണ്ണയിക്കുന്നതിനുള്ള പരിധി. 0 = കറുപ്പ്, 255 ശുദ്ധമായ വെളുപ്പ്.
+removeBlanks.whitePercent=വെളുപ്പ് ശതമാനം (%):
+removeBlanks.whitePercentDesc=നീക്കം ചെയ്യേണ്ട 'വെളുത്ത' പിക്സലുകൾ അടങ്ങിയ പേജിന്റെ ശതമാനം
+removeBlanks.submit=ശൂന്യമായവ നീക്കം ചെയ്യുക
+
+
+#removeAnnotations
+removeAnnotations.title=വ്യാഖ്യാനങ്ങൾ നീക്കം ചെയ്യുക
+removeAnnotations.header=വ്യാഖ്യാനങ്ങൾ നീക്കം ചെയ്യുക
+removeAnnotations.submit=നീക്കം ചെയ്യുക
+
+
+#compare
+compare.title=താരതമ്യം ചെയ്യുക
+compare.header=PDF-കൾ താരതമ്യം ചെയ്യുക
+compare.highlightColor.1=ഹൈലൈറ്റ് നിറം 1:
+compare.highlightColor.2=ഹൈലൈറ്റ് നിറം 2:
+compare.document.1=പ്രമാണം 1
+compare.document.2=പ്രമാണം 2
+compare.submit=താരതമ്യം ചെയ്യുക
+compare.complex.message=നൽകിയിട്ടുള്ള ഒന്നോ രണ്ടോ പ്രമാണങ്ങൾ വലിയ ഫയലുകളാണ്, താരതമ്യത്തിന്റെ കൃത്യത കുറഞ്ഞേക്കാം
+compare.large.file.message=നൽകിയിട്ടുള്ള ഒന്നോ രണ്ടോ പ്രമാണങ്ങൾ പ്രോസസ്സ് ചെയ്യാൻ കഴിയാത്തത്ര വലുതാണ്
+compare.no.text.message=തിരഞ്ഞെടുത്ത ഒന്നോ രണ്ടോ PDF-കളിൽ ടെക്സ്റ്റ് ഉള്ളടക്കമില്ല. താരതമ്യത്തിനായി ടെക്സ്റ്റ് ഉള്ള PDF-കൾ തിരഞ്ഞെടുക്കുക.
+
+#sign
+sign.title=ഒപ്പിടുക
+sign.header=PDF-കൾ ഒപ്പിടുക
+sign.upload=ചിത്രം അപ്ലോഡ് ചെയ്യുക
+sign.draw=ഒപ്പ് വരയ്ക്കുക
+sign.text=ടെക്സ്റ്റ് ഇൻപുട്ട്
+sign.clear=മായ്ക്കുക
+sign.add=ചേർക്കുക
+sign.saved=സംരക്ഷിച്ച ഒപ്പുകൾ
+sign.save=ഒപ്പ് സംരക്ഷിക്കുക
+sign.personalSigs=വ്യക്തിഗത ഒപ്പുകൾ
+sign.sharedSigs=പങ്കിട്ട ഒപ്പുകൾ
+sign.noSavedSigs=സംരക്ഷിച്ച ഒപ്പുകളൊന്നും കണ്ടെത്തിയില്ല
+sign.addToAll=എല്ലാ പേജുകളിലേക്കും ചേർക്കുക
+sign.delete=മായ്ക്കുക
+sign.first=ആദ്യ പേജ്
+sign.last=അവസാന പേജ്
+sign.next=അടുത്ത പേജ്
+sign.previous=മുമ്പത്തെ പേജ്
+sign.maintainRatio=വീക്ഷണാനുപാതം നിലനിർത്തുക ടോഗിൾ ചെയ്യുക
+sign.undo=പഴയപടി ആക്കുക
+sign.redo=വീണ്ടും ചെയ്യുക
+
+#repair
+repair.title=നന്നാക്കുക
+repair.header=PDF-കൾ നന്നാക്കുക
+repair.submit=നന്നാക്കുക
+
+
+#flatten
+flatten.title=പരത്തുക
+flatten.header=PDF-കൾ പരത്തുക
+flatten.flattenOnlyForms=ഫോമുകൾ മാത്രം പരത്തുക
+flatten.submit=പരത്തുക
+
+
+#ScannerImageSplit
+ScannerImageSplit.selectText.1=കോൺ പരിധി:
+ScannerImageSplit.selectText.2=ചിത്രം തിരിക്കുന്നതിന് ആവശ്യമായ ഏറ്റവും കുറഞ്ഞ കേവല കോൺ സജ്ജമാക്കുന്നു (സ്ഥിരസ്ഥിതി: 10).
+ScannerImageSplit.selectText.3=സഹിഷ്ണുത:
+ScannerImageSplit.selectText.4=കണക്കാക്കിയ പശ്ചാത്തല നിറത്തിന് ചുറ്റുമുള്ള വർണ്ണ വ്യതിയാനത്തിന്റെ പരിധി നിർണ്ണയിക്കുന്നു (സ്ഥിരസ്ഥിതി: 30).
+ScannerImageSplit.selectText.5=കുറഞ്ഞ വിസ്തീർണ്ണം:
+ScannerImageSplit.selectText.6=ഒരു ഫോട്ടോയ്ക്കുള്ള കുറഞ്ഞ വിസ്തീർണ്ണ പരിധി സജ്ജമാക്കുന്നു (സ്ഥിരസ്ഥിതി: 10000).
+ScannerImageSplit.selectText.7=കുറഞ്ഞ കോണ്ടൂർ വിസ്തീർണ്ണം:
+ScannerImageSplit.selectText.8=ഒരു ഫോട്ടോയ്ക്കുള്ള കുറഞ്ഞ കോണ്ടൂർ വിസ്തീർണ്ണ പരിധി സജ്ജമാക്കുന്നു
+ScannerImageSplit.selectText.9=അതിർത്തി വലുപ്പം:
+ScannerImageSplit.selectText.10=ഔട്ട്പുട്ടിൽ വെളുത്ത അതിരുകൾ ഉണ്ടാകുന്നത് തടയാൻ ചേർത്തതും നീക്കം ചെയ്തതുമായ അതിർത്തിയുടെ വലുപ്പം സജ്ജമാക്കുന്നു (സ്ഥിരസ്ഥിതി: 1).
+ScannerImageSplit.info=പൈത്തൺ ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല. ഇത് പ്രവർത്തിപ്പിക്കാൻ ആവശ്യമാണ്.
+
+
+#OCR
+ocr.title=OCR / സ്കാൻ വൃത്തിയാക്കൽ
+ocr.header=സ്കാനുകൾ വൃത്തിയാക്കുക / OCR (ഒപ്റ്റിക്കൽ ക്യാരക്ടർ റെക്കഗ്നിഷൻ)
+ocr.selectText.1=PDF-നുള്ളിൽ കണ്ടെത്തേണ്ട ഭാഷകൾ തിരഞ്ഞെടുക്കുക (ലിസ്റ്റ് ചെയ്തിട്ടുള്ളവ നിലവിൽ കണ്ടെത്തിയവയാണ്):
+ocr.selectText.2=OCR ചെയ്ത PDF-നോടൊപ്പം OCR ടെക്സ്റ്റ് അടങ്ങിയ ടെക്സ്റ്റ് ഫയൽ നിർമ്മിക്കുക
+ocr.selectText.3=ചരിഞ്ഞ കോണിൽ സ്കാൻ ചെയ്ത പേജുകൾ തിരികെ സ്ഥാനത്തേക്ക് തിരിച്ച് ശരിയാക്കുക
+ocr.selectText.4=പേജ് വൃത്തിയാക്കുക, അതുവഴി OCR പശ്ചാത്തല ശബ്ദത്തിൽ ടെക്സ്റ്റ് കണ്ടെത്താനുള്ള സാധ്യത കുറവാണ്. (ഔട്ട്പുട്ടിൽ മാറ്റമില്ല)
+ocr.selectText.5=പേജ് വൃത്തിയാക്കുക, അതുവഴി OCR പശ്ചാത്തല ശബ്ദത്തിൽ ടെക്സ്റ്റ് കണ്ടെത്താനുള്ള സാധ്യത കുറവാണ്, ഔട്ട്പുട്ടിൽ വൃത്തിയാക്കൽ നിലനിർത്തുന്നു.
+ocr.selectText.6=ഇന്ററാക്ടീവ് ടെക്സ്റ്റ് ഉള്ള പേജുകൾ അവഗണിക്കുന്നു, ചിത്രങ്ങളായ പേജുകൾ മാത്രം OCR ചെയ്യുന്നു
+ocr.selectText.7=OCR നിർബന്ധിക്കുക, എല്ലാ യഥാർത്ഥ ടെക്സ്റ്റ് ഘടകങ്ങളും നീക്കം ചെയ്തുകൊണ്ട് എല്ലാ പേജുകളും OCR ചെയ്യും
+ocr.selectText.8=സാധാരണ (PDF-ൽ ടെക്സ്റ്റ് ഉണ്ടെങ്കിൽ പിശക് സംഭവിക്കും)
+ocr.selectText.9=അധിക ക്രമീകരണങ്ങൾ
+ocr.selectText.10=OCR മോഡ്
+ocr.selectText.11=OCR-ന് ശേഷം ചിത്രങ്ങൾ നീക്കം ചെയ്യുക (എല്ലാ ചിത്രങ്ങളും നീക്കംചെയ്യുന്നു, പരിവർത്തന ഘട്ടത്തിന്റെ ഭാഗമാണെങ്കിൽ മാത്രം ഉപയോഗപ്രദം)
+ocr.selectText.12=റെൻഡർ തരം (വിപുലമായത്)
+ocr.help=മറ്റ് ഭാഷകൾക്കായി ഇത് എങ്ങനെ ഉപയോഗിക്കാമെന്നും കൂടാതെ/അല്ലെങ്കിൽ ഡോക്കറിൽ ഉപയോഗിക്കാതിരിക്കുന്നതിനെക്കുറിച്ചും ഈ ഡോക്യുമെന്റേഷൻ വായിക്കുക
+ocr.credit=ഈ സേവനം OCR-നായി qpdf, Tesseract എന്നിവ ഉപയോഗിക്കുന്നു.
+ocr.submit=OCR ഉപയോഗിച്ച് PDF പ്രോസസ്സ് ചെയ്യുക
+
+
+#extractImages
+extractImages.title=ചിത്രങ്ങൾ വേർതിരിച്ചെടുക്കുക
+extractImages.header=ചിത്രങ്ങൾ വേർതിരിച്ചെടുക്കുക
+extractImages.selectText=വേർതിരിച്ചെടുത്ത ചിത്രങ്ങൾ പരിവർത്തനം ചെയ്യേണ്ട ഇമേജ് ഫോർമാറ്റ് തിരഞ്ഞെടുക്കുക
+extractImages.allowDuplicates=തനിപ്പകർപ്പ് ചിത്രങ്ങൾ സംരക്ഷിക്കുക
+extractImages.submit=വേർതിരിച്ചെടുക്കുക
+
+
+#File to PDF
+fileToPDF.title=ഫയൽ PDF-ലേക്ക്
+fileToPDF.header=ഏത് ഫയലും PDF-ലേക്ക് മാറ്റുക
+fileToPDF.credit=ഈ സേവനം ഫയൽ പരിവർത്തനത്തിനായി LibreOffice, Unoconv എന്നിവ ഉപയോഗിക്കുന്നു.
+fileToPDF.supportedFileTypesInfo=പിന്തുണയ്ക്കുന്ന ഫയൽ തരങ്ങൾ
+fileToPDF.supportedFileTypes=പിന്തുണയ്ക്കുന്ന ഫയൽ തരങ്ങളിൽ താഴെ പറയുന്നവ ഉൾപ്പെടുത്തണം, എന്നിരുന്നാലും പിന്തുണയ്ക്കുന്ന ഫോർമാറ്റുകളുടെ പൂർണ്ണമായ അപ്ഡേറ്റ് ചെയ്ത ലിസ്റ്റിനായി, ദയവായി LibreOffice ഡോക്യുമെന്റേഷൻ പരിശോധിക്കുക
+fileToPDF.submit=PDF-ലേക്ക് മാറ്റുക
+
+
+#compress
+compress.title=കംപ്രസ് ചെയ്യുക
+compress.header=PDF കംപ്രസ് ചെയ്യുക
+compress.credit=ഈ സേവനം PDF കംപ്രസ്/ഒപ്റ്റിമൈസേഷനായി qpdf ഉപയോഗിക്കുന്നു.
+compress.grayscale.label=കംപ്രഷനായി ഗ്രേസ്കെയിൽ പ്രയോഗിക്കുക
+compress.selectText.1=കംപ്രഷൻ ക്രമീകരണങ്ങൾ
+compress.selectText.1.1=1-3 PDF കംപ്രഷൻ, 4-6 ലൈറ്റ് ഇമേജ് കംപ്രഷൻ, 7-9 തീവ്രമായ ഇമേജ് കംപ്രഷൻ ചിത്രത്തിന്റെ ഗുണനിലവാരം ഗണ്യമായി കുറയ്ക്കും
+compress.selectText.2=ഒപ്റ്റിമൈസേഷൻ നില:
+compress.selectText.4=ഓട്ടോ മോഡ് - PDF കൃത്യമായ വലുപ്പത്തിൽ ലഭിക്കുന്നതിന് ഗുണനിലവാരം സ്വയം ക്രമീകരിക്കുന്നു
+compress.selectText.5=പ്രതീക്ഷിക്കുന്ന PDF വലുപ്പം (ഉദാ. 25MB, 10.8MB, 25KB)
+compress.submit=കംപ്രസ് ചെയ്യുക
+
+
+#Add image
+addImage.title=ചിത്രം ചേർക്കുക
+addImage.header=PDF-ലേക്ക് ചിത്രം ചേർക്കുക
+addImage.everyPage=എല്ലാ പേജിലും?
+addImage.upload=ചിത്രം ചേർക്കുക
+addImage.submit=ചിത്രം ചേർക്കുക
+
+
+#merge
+merge.title=ലയിപ്പിക്കുക
+merge.header=ഒന്നിലധികം PDF-കൾ ലയിപ്പിക്കുക (2+)
+merge.sortByName=പേര് അനുസരിച്ച് അടുക്കുക
+merge.sortByDate=തീയതി അനുസരിച്ച് അടുക്കുക
+merge.removeCertSign=ലയിപ്പിച്ച ഫയലിലെ ഡിജിറ്റൽ ഒപ്പ് നീക്കം ചെയ്യണോ?
+merge.submit=ലയിപ്പിക്കുക
+
+
+#pdfOrganiser
+pdfOrganiser.title=പേജ് ഓർഗനൈസർ
+pdfOrganiser.header=PDF പേജ് ഓർഗനൈസർ
+pdfOrganiser.submit=പേജുകൾ പുനഃക്രമീകരിക്കുക
+pdfOrganiser.mode=മോഡ്
+pdfOrganiser.mode.1=ഇഷ്ടാനുസൃത പേജ് ക്രമം
+pdfOrganiser.mode.2=വിപരീത ക്രമം
+pdfOrganiser.mode.3=ഡ്യൂപ്ലെക്സ് അടുക്കൽ
+pdfOrganiser.mode.4=ലഘുലേഖ അടുക്കൽ
+pdfOrganiser.mode.5=സൈഡ് സ്റ്റിച്ച് ലഘുലേഖ അടുക്കൽ
+pdfOrganiser.mode.6=ഒറ്റ-ഇരട്ട വിഭജനം
+pdfOrganiser.mode.7=ആദ്യത്തേത് നീക്കം ചെയ്യുക
+pdfOrganiser.mode.8=അവസാനത്തേത് നീക്കം ചെയ്യുക
+pdfOrganiser.mode.9=ആദ്യത്തേതും അവസാനത്തേതും നീക്കം ചെയ്യുക
+pdfOrganiser.mode.10=ഒറ്റ-ഇരട്ട ലയനം
+pdfOrganiser.mode.11=എല്ലാ പേജുകളും തനിപ്പകർപ്പാക്കുക
+pdfOrganiser.placeholder=(ഉദാ. 1,3,2 അല്ലെങ്കിൽ 4-8,2,10-12 അല്ലെങ്കിൽ 2n-1)
+
+
+#multiTool
+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.undo=പഴയപടി ആക്കുക
+multiTool.redo=വീണ്ടും ചെയ്യുക
+
+#decrypt
+decrypt.passwordPrompt=ഈ ഫയൽ പാസ്വേഡ് ഉപയോഗിച്ച് സംരക്ഷിച്ചിരിക്കുന്നു. ദയവായി പാസ്വേഡ് നൽകുക:
+decrypt.cancelled=PDF-നായുള്ള പ്രവർത്തനം റദ്ദാക്കി: {0}
+decrypt.noPassword=എൻക്രിപ്റ്റ് ചെയ്ത PDF-നായി പാസ്വേഡ് നൽകിയിട്ടില്ല: {0}
+decrypt.invalidPassword=ദയവായി ശരിയായ പാസ്വേഡ് ഉപയോഗിച്ച് വീണ്ടും ശ്രമിക്കുക.
+decrypt.invalidPasswordHeader=PDF-നായി തെറ്റായ പാസ്വേഡ് അല്ലെങ്കിൽ പിന്തുണയ്ക്കാത്ത എൻക്രിപ്ഷൻ: {0}
+decrypt.unexpectedError=ഫയൽ പ്രോസസ്സ് ചെയ്യുന്നതിൽ ഒരു പിശക് സംഭവിച്ചു. ദയവായി വീണ്ടും ശ്രമിക്കുക.
+decrypt.serverError=ഡീക്രിപ്റ്റ് ചെയ്യുമ്പോൾ സെർവർ പിശക്: {0}
+decrypt.success=ഫയൽ വിജയകരമായി ഡീക്രിപ്റ്റ് ചെയ്തു.
+
+#multiTool-advert
+multiTool-advert.message=ഈ സവിശേഷത ഞങ്ങളുടെ മൾട്ടി-ടൂൾ പേജിലും ലഭ്യമാണ്. മെച്ചപ്പെടുത്തിയ പേജ്-ബൈ-പേജ് യുഐയ്ക്കും അധിക സവിശേഷതകൾക്കുമായി ഇത് പരിശോധിക്കുക!
+
+#view pdf
+viewPdf.title=PDF കാണുക/തിരുത്തുക
+viewPdf.header=PDF കാണുക
+
+#pageRemover
+pageRemover.title=പേജ് നീക്കംചെയ്യൽ ഉപകരണം
+pageRemover.header=PDF പേജ് നീക്കംചെയ്യൽ ഉപകരണം
+pageRemover.pagesToDelete=ഇല്ലാതാക്കേണ്ട പേജുകൾ (പേജ് നമ്പറുകളുടെ കോമയാൽ വേർതിരിച്ച ലിസ്റ്റ് നൽകുക) :
+pageRemover.submit=പേജുകൾ ഇല്ലാതാക്കുക
+pageRemover.placeholder=(ഉദാ. 1,2,6 അല്ലെങ്കിൽ 1-10,15-30)
+
+
+#rotate
+rotate.title=PDF തിരിക്കുക
+rotate.header=PDF തിരിക്കുക
+rotate.selectAngle=തിരിക്കേണ്ട കോൺ തിരഞ്ഞെടുക്കുക (90 ഡിഗ്രിയുടെ ഗുണിതങ്ങളിൽ):
+rotate.submit=തിരിക്കുക
+
+
+#split-pdfs
+split.title=PDF വിഭജിക്കുക
+split.header=PDF വിഭജിക്കുക
+split.desc.1=നിങ്ങൾ തിരഞ്ഞെടുക്കുന്ന നമ്പറുകൾ വിഭജിക്കാൻ ആഗ്രഹിക്കുന്ന പേജ് നമ്പറാണ്
+split.desc.2=അതുപോലെ 1,3,7-9 തിരഞ്ഞെടുക്കുന്നത് 10 പേജുള്ള ഒരു പ്രമാണത്തെ 6 വ്യത്യസ്ത PDF-കളായി വിഭജിക്കും:
+split.desc.3=പ്രമാണം #1: പേജ് 1
+split.desc.4=പ്രമാണം #2: പേജ് 2, 3
+split.desc.5=പ്രമാണം #3: പേജ് 4, 5, 6, 7
+split.desc.6=പ്രമാണം #4: പേജ് 8
+split.desc.7=പ്രമാണം #5: പേജ് 9
+split.desc.8=പ്രമാണം #6: പേജ് 10
+split.splitPages=വിഭജിക്കേണ്ട പേജുകൾ നൽകുക:
+split.submit=വിഭജിക്കുക
+
+
+#merge
+imageToPDF.title=ചിത്രം PDF-ലേക്ക്
+imageToPDF.header=ചിത്രം PDF-ലേക്ക്
+imageToPDF.submit=പരിവർത്തനം ചെയ്യുക
+imageToPDF.selectLabel=ചിത്രം ഫിറ്റ് ഓപ്ഷനുകൾ
+imageToPDF.fillPage=പേജ് നിറയ്ക്കുക
+imageToPDF.fitDocumentToImage=പേജ് ചിത്രത്തിലേക്ക് ഫിറ്റ് ചെയ്യുക
+imageToPDF.maintainAspectRatio=വീക്ഷണാനുപാതം നിലനിർത്തുക
+imageToPDF.selectText.2=PDF സ്വയം തിരിക്കുക
+imageToPDF.selectText.3=മൾട്ടി ഫയൽ ലോജിക് (ഒന്നിലധികം ചിത്രങ്ങളുമായി പ്രവർത്തിക്കുമ്പോൾ മാത്രം പ്രവർത്തനക്ഷമമാകും)
+imageToPDF.selectText.4=ഒരൊറ്റ PDF-ലേക്ക് ലയിപ്പിക്കുക
+imageToPDF.selectText.5=വേറിട്ട PDF-കളിലേക്ക് മാറ്റുക
+
+
+#pdfToImage
+pdfToImage.title=PDF ചിത്രത്തിലേക്ക്
+pdfToImage.header=PDF ചിത്രത്തിലേക്ക്
+pdfToImage.selectText=ചിത്ര ഫോർമാറ്റ്
+pdfToImage.singleOrMultiple=ചിത്ര ഫല തരം
+pdfToImage.single=ഒരൊറ്റ വലിയ ചിത്രം
+pdfToImage.multi=ഒന്നിലധികം ചിത്രങ്ങൾ
+pdfToImage.colorType=നിറ തരം
+pdfToImage.color=നിറം
+pdfToImage.grey=ഗ്രേസ്കെയിൽ
+pdfToImage.blackwhite=കറുപ്പും വെളുപ്പും (ഡാറ്റ നഷ്ടപ്പെട്ടേക്കാം!)
+pdfToImage.submit=പരിവർത്തനം ചെയ്യുക
+pdfToImage.info=പൈത്തൺ ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല. WebP പരിവർത്തനത്തിന് ആവശ്യമാണ്.
+pdfToImage.placeholder=(ഉദാ. 1,2,8 അല്ലെങ്കിൽ 4,7,12-16 അല്ലെങ്കിൽ 2n-1)
+
+
+#addPassword
+addPassword.title=പാസ്വേഡ് ചേർക്കുക
+addPassword.header=പാസ്വേഡ് ചേർക്കുക (എൻക്രിപ്റ്റ് ചെയ്യുക)
+addPassword.selectText.1=എൻക്രിപ്റ്റ് ചെയ്യേണ്ട PDF തിരഞ്ഞെടുക്കുക
+addPassword.selectText.2=ഉപയോക്തൃ പാസ്വേഡ്
+addPassword.selectText.3=എൻക്രിപ്ഷൻ കീ ദൈർഘ്യം
+addPassword.selectText.4=ഉയർന്ന മൂല്യങ്ങൾ കൂടുതൽ ശക്തമാണ്, എന്നാൽ താഴ്ന്ന മൂല്യങ്ങൾക്ക് മികച്ച അനുയോജ്യതയുണ്ട്.
+addPassword.selectText.5=സജ്ജമാക്കേണ്ട അനുമതികൾ (ഉടമയുടെ പാസ്വേഡിനൊപ്പം ഉപയോഗിക്കാൻ ശുപാർശ ചെയ്യുന്നു)
+addPassword.selectText.6=പ്രമാണം കൂട്ടിച്ചേർക്കുന്നത് തടയുക
+addPassword.selectText.7=ഉള്ളടക്കം വേർതിരിച്ചെടുക്കുന്നത് തടയുക
+addPassword.selectText.8=ലഭ്യതയ്ക്കായി വേർതിരിച്ചെടുക്കുന്നത് തടയുക
+addPassword.selectText.9=ഫോം പൂരിപ്പിക്കുന്നത് തടയുക
+addPassword.selectText.10=പരിഷ്ക്കരണം തടയുക
+addPassword.selectText.11=വ്യാഖ്യാന പരിഷ്ക്കരണം തടയുക
+addPassword.selectText.12=അച്ചടി തടയുക
+addPassword.selectText.13=വ്യത്യസ്ത ഫോർമാറ്റുകളിൽ അച്ചടിക്കുന്നത് തടയുക
+addPassword.selectText.14=ഉടമയുടെ പാസ്വേഡ്
+addPassword.selectText.15=പ്രമാണം തുറന്നുകഴിഞ്ഞാൽ എന്തുചെയ്യാൻ കഴിയുമെന്നത് നിയന്ത്രിക്കുന്നു (എല്ലാ റീഡറുകളും പിന്തുണയ്ക്കുന്നില്ല)
+addPassword.selectText.16=പ്രമാണം തന്നെ തുറക്കുന്നത് നിയന്ത്രിക്കുന്നു
+addPassword.submit=എൻക്രിപ്റ്റ് ചെയ്യുക
+
+
+#watermark
+watermark.title=വാട്ടർമാർക്ക് ചേർക്കുക
+watermark.header=വാട്ടർമാർക്ക് ചേർക്കുക
+watermark.customColor=ഇഷ്ടാനുസൃത ടെക്സ്റ്റ് നിറം
+watermark.selectText.1=വാട്ടർമാർക്ക് ചേർക്കേണ്ട PDF തിരഞ്ഞെടുക്കുക:
+watermark.selectText.2=വാട്ടർമാർക്ക് ടെക്സ്റ്റ്:
+watermark.selectText.3=അക്ഷര വലുപ്പം:
+watermark.selectText.4=തിരിക്കൽ (0-360):
+watermark.selectText.5=വീതി സ്പേസർ (ഓരോ വാട്ടർമാർക്കിനും ഇടയിലുള്ള തിരശ്ചീനമായ സ്ഥലം):
+watermark.selectText.6=ഉയരം സ്പേസർ (ഓരോ വാട്ടർമാർക്കിനും ഇടയിലുള്ള ലംബമായ സ്ഥലം):
+watermark.selectText.7=അതാര്യത (0% - 100%):
+watermark.selectText.8=വാട്ടർമാർക്ക് തരം:
+watermark.selectText.9=വാട്ടർമാർക്ക് ചിത്രം:
+watermark.selectText.10=PDF-നെ PDF-ചിത്രത്തിലേക്ക് മാറ്റുക
+watermark.submit=വാട്ടർമാർക്ക് ചേർക്കുക
+watermark.type.1=ടെക്സ്റ്റ്
+watermark.type.2=ചിത്രം
+
+
+#Change permissions
+permissions.title=അനുമതികൾ മാറ്റുക
+permissions.header=അനുമതികൾ മാറ്റുക
+permissions.warning=മുന്നറിയിപ്പ്: ഈ അനുമതികൾ മാറ്റാൻ കഴിയാത്തതാക്കാൻ, പാസ്വേഡ് ചേർക്കുക പേജ് വഴി ഒരു പാസ്വേഡ് ഉപയോഗിച്ച് അവ സജ്ജമാക്കാൻ ശുപാർശ ചെയ്യുന്നു
+permissions.selectText.1=അനുമതികൾ മാറ്റേണ്ട PDF തിരഞ്ഞെടുക്കുക
+permissions.selectText.2=സജ്ജമാക്കേണ്ട അനുമതികൾ
+permissions.selectText.3=പ്രമാണം കൂട്ടിച്ചേർക്കുന്നത് തടയുക
+permissions.selectText.4=ഉള്ളടക്കം വേർതിരിച്ചെടുക്കുന്നത് തടയുക
+permissions.selectText.5=ലഭ്യതയ്ക്കായി വേർതിരിച്ചെടുക്കുന്നത് തടയുക
+permissions.selectText.6=ഫോം പൂരിപ്പിക്കുന്നത് തടയുക
+permissions.selectText.7=പരിഷ്ക്കരണം തടയുക
+permissions.selectText.8=വ്യാഖ്യാന പരിഷ്ക്കരണം തടയുക
+permissions.selectText.9=അച്ചടി തടയുക
+permissions.selectText.10=വ്യത്യസ്ത ഫോർമാറ്റുകളിൽ അച്ചടിക്കുന്നത് തടയുക
+permissions.submit=മാറ്റുക
+
+
+#remove password
+removePassword.title=പാസ്വേഡ് നീക്കം ചെയ്യുക
+removePassword.header=പാസ്വേഡ് നീക്കം ചെയ്യുക (ഡീക്രിപ്റ്റ് ചെയ്യുക)
+removePassword.selectText.1=ഡീക്രിപ്റ്റ് ചെയ്യേണ്ട PDF തിരഞ്ഞെടുക്കുക
+removePassword.selectText.2=പാസ്വേഡ്
+removePassword.submit=നീക്കം ചെയ്യുക
+
+
+#changeMetadata
+changeMetadata.title=തലക്കെട്ട്:
+changeMetadata.header=മെറ്റാഡാറ്റ മാറ്റുക
+changeMetadata.selectText.1=ദയവായി നിങ്ങൾ മാറ്റാൻ ആഗ്രഹിക്കുന്ന വേരിയബിളുകൾ തിരുത്തുക
+changeMetadata.selectText.2=എല്ലാ മെറ്റാഡാറ്റയും ഇല്ലാതാക്കുക
+changeMetadata.selectText.3=ഇഷ്ടാനുസൃത മെറ്റാഡാറ്റ കാണിക്കുക:
+changeMetadata.author=രചയിതാവ്:
+changeMetadata.creationDate=സൃഷ്ടിച്ച തീയതി (yyyy/MM/dd HH:mm:ss):
+changeMetadata.creator=സ്രഷ്ടാവ്:
+changeMetadata.keywords=കീവേഡുകൾ:
+changeMetadata.modDate=പരിഷ്ക്കരിച്ച തീയതി (yyyy/MM/dd HH:mm:ss):
+changeMetadata.producer=നിർമ്മാതാവ്:
+changeMetadata.subject=വിഷയം:
+changeMetadata.trapped=ട്രാപ്പ്ഡ്:
+changeMetadata.selectText.4=മറ്റ് മെറ്റാഡാറ്റ:
+changeMetadata.selectText.5=ഇഷ്ടാനുസൃത മെറ്റാഡാറ്റ എൻട്രി ചേർക്കുക
+changeMetadata.submit=മാറ്റുക
+
+#unlockPDFForms
+unlockPDFForms.title=ഫോം ഫീൽഡുകളിൽ നിന്ന് റീഡ്-ഒൺലി നീക്കം ചെയ്യുക
+unlockPDFForms.header=PDF ഫോമുകൾ അൺലോക്ക് ചെയ്യുക
+unlockPDFForms.submit=നീക്കം ചെയ്യുക
+
+#pdfToPDFA
+pdfToPDFA.title=PDF PDF/A-ലേക്ക്
+pdfToPDFA.header=PDF PDF/A-ലേക്ക്
+pdfToPDFA.credit=ഈ സേവനം PDF/A പരിവർത്തനത്തിനായി libreoffice ഉപയോഗിക്കുന്നു
+pdfToPDFA.submit=പരിവർത്തനം ചെയ്യുക
+pdfToPDFA.tip=നിലവിൽ ഒരേസമയം ഒന്നിലധികം ഇൻപുട്ടുകൾക്കായി പ്രവർത്തിക്കുന്നില്ല
+pdfToPDFA.outputFormat=ഔട്ട്പുട്ട് ഫോർമാറ്റ്
+pdfToPDFA.pdfWithDigitalSignature=PDF-ൽ ഒരു ഡിജിറ്റൽ ഒപ്പ് അടങ്ങിയിരിക്കുന്നു. അടുത്ത ഘട്ടത്തിൽ ഇത് നീക്കം ചെയ്യപ്പെടും.
+
+
+#PDFToWord
+PDFToWord.title=PDF വേഡിലേക്ക്
+PDFToWord.header=PDF വേഡിലേക്ക്
+PDFToWord.selectText.1=ഔട്ട്പുട്ട് ഫയൽ ഫോർമാറ്റ്
+PDFToWord.credit=ഈ സേവനം ഫയൽ പരിവർത്തനത്തിനായി LibreOffice ഉപയോഗിക്കുന്നു.
+PDFToWord.submit=പരിവർത്തനം ചെയ്യുക
+
+
+#PDFToPresentation
+PDFToPresentation.title=PDF പ്രസന്റേഷനിലേക്ക്
+PDFToPresentation.header=PDF പ്രസന്റേഷനിലേക്ക്
+PDFToPresentation.selectText.1=ഔട്ട്പുട്ട് ഫയൽ ഫോർമാറ്റ്
+PDFToPresentation.credit=ഈ സേവനം ഫയൽ പരിവർത്തനത്തിനായി LibreOffice ഉപയോഗിക്കുന്നു.
+PDFToPresentation.submit=പരിവർത്തനം ചെയ്യുക
+
+
+#PDFToText
+PDFToText.title=PDF RTF-ലേക്ക് (ടെക്സ്റ്റ്)
+PDFToText.header=PDF RTF-ലേക്ക് (ടെക്സ്റ്റ്)
+PDFToText.selectText.1=ഔട്ട്പുട്ട് ഫയൽ ഫോർമാറ്റ്
+PDFToText.credit=ഈ സേവനം ഫയൽ പരിവർത്തനത്തിനായി LibreOffice ഉപയോഗിക്കുന്നു.
+PDFToText.submit=പരിവർത്തനം ചെയ്യുക
+
+
+#PDFToHTML
+PDFToHTML.title=PDF HTML-ലേക്ക്
+PDFToHTML.header=PDF HTML-ലേക്ക്
+PDFToHTML.credit=ഈ സേവനം ഫയൽ പരിവർത്തനത്തിനായി pdftohtml ഉപയോഗിക്കുന്നു.
+PDFToHTML.submit=പരിവർത്തനം ചെയ്യുക
+
+
+#PDFToXML
+PDFToXML.title=PDF XML-ലേക്ക്
+PDFToXML.header=PDF XML-ലേക്ക്
+PDFToXML.credit=ഈ സേവനം ഫയൽ പരിവർത്തനത്തിനായി LibreOffice ഉപയോഗിക്കുന്നു.
+PDFToXML.submit=പരിവർത്തനം ചെയ്യുക
+
+#PDFToCSV
+PDFToCSV.title=PDF CSV-ലേക്ക്
+PDFToCSV.header=PDF CSV-ലേക്ക്
+PDFToCSV.prompt=പട്ടിക വേർതിരിച്ചെടുക്കാൻ പേജ് തിരഞ്ഞെടുക്കുക
+PDFToCSV.submit=വേർതിരിച്ചെടുക്കുക
+
+#split-by-size-or-count
+split-by-size-or-count.title=വലുപ്പം അല്ലെങ്കിൽ എണ്ണം അനുസരിച്ച് PDF വിഭജിക്കുക
+split-by-size-or-count.header=വലുപ്പം അല്ലെങ്കിൽ എണ്ണം അനുസരിച്ച് PDF വിഭജിക്കുക
+split-by-size-or-count.type.label=വിഭജന തരം തിരഞ്ഞെടുക്കുക
+split-by-size-or-count.type.size=വലുപ്പം അനുസരിച്ച്
+split-by-size-or-count.type.pageCount=പേജ് എണ്ണം അനുസരിച്ച്
+split-by-size-or-count.type.docCount=പ്രമാണങ്ങളുടെ എണ്ണം അനുസരിച്ച്
+split-by-size-or-count.value.label=മൂല്യം നൽകുക
+split-by-size-or-count.value.placeholder=വലുപ്പം (ഉദാ., 2MB അല്ലെങ്കിൽ 3KB) അല്ലെങ്കിൽ എണ്ണം (ഉദാ., 5) നൽകുക
+split-by-size-or-count.submit=സമർപ്പിക്കുക
+
+
+#overlay-pdfs
+overlay-pdfs.header=PDF ഫയലുകൾ ഓവർലേ ചെയ്യുക
+overlay-pdfs.baseFile.label=അടിസ്ഥാന PDF ഫയൽ തിരഞ്ഞെടുക്കുക
+overlay-pdfs.overlayFiles.label=ഓവർലേ PDF ഫയലുകൾ തിരഞ്ഞെടുക്കുക
+overlay-pdfs.mode.label=ഓവർലേ മോഡ് തിരഞ്ഞെടുക്കുക
+overlay-pdfs.mode.sequential=ക്രമീകൃത ഓവർലേ
+overlay-pdfs.mode.interleaved=ഇടകലർന്ന ഓവർലേ
+overlay-pdfs.mode.fixedRepeat=നിശ്ചിത ആവർത്തന ഓവർലേ
+overlay-pdfs.counts.label=ഓവർലേ എണ്ണം (നിശ്ചിത ആവർത്തന മോഡിനായി)
+overlay-pdfs.counts.placeholder=കോമയാൽ വേർതിരിച്ച എണ്ണം നൽകുക (ഉദാ., 2,3,1)
+overlay-pdfs.position.label=ഓവർലേ സ്ഥാനം തിരഞ്ഞെടുക്കുക
+overlay-pdfs.position.foreground=മുൻഭാഗം
+overlay-pdfs.position.background=പശ്ചാത്തലം
+overlay-pdfs.submit=സമർപ്പിക്കുക
+
+
+#split-by-sections
+split-by-sections.title=വിഭാഗങ്ങൾ അനുസരിച്ച് PDF വിഭജിക്കുക
+split-by-sections.header=PDF വിഭാഗങ്ങളായി വിഭജിക്കുക
+split-by-sections.horizontal.label=തിരശ്ചീന വിഭജനങ്ങൾ
+split-by-sections.vertical.label=ലംബ വിഭജനങ്ങൾ
+split-by-sections.horizontal.placeholder=തിരശ്ചീന വിഭജനങ്ങളുടെ എണ്ണം നൽകുക
+split-by-sections.vertical.placeholder=ലംബ വിഭജനങ്ങളുടെ എണ്ണം നൽകുക
+split-by-sections.submit=PDF വിഭജിക്കുക
+split-by-sections.merge=ഒരൊറ്റ PDF-ലേക്ക് ലയിപ്പിക്കുക
+
+
+#printFile
+printFile.title=ഫയൽ അച്ചടിക്കുക
+printFile.header=പ്രിന്ററിലേക്ക് ഫയൽ അച്ചടിക്കുക
+printFile.selectText.1=അച്ചടിക്കേണ്ട ഫയൽ തിരഞ്ഞെടുക്കുക
+printFile.selectText.2=പ്രിന്റർ പേര് നൽകുക
+printFile.submit=അച്ചടിക്കുക
+
+
+#licenses
+licenses.nav=ലൈസൻസുകൾ
+licenses.title=മൂന്നാം കക്ഷി ലൈസൻസുകൾ
+licenses.header=മൂന്നാം കക്ഷി ലൈസൻസുകൾ
+licenses.module=ഘടകം
+licenses.version=പതിപ്പ്
+licenses.license=ലൈസൻസ്
+
+#survey
+survey.nav=സർവേ
+survey.title=സ്റ്റെർലിംഗ്-PDF സർവേ
+survey.description=സ്റ്റെർലിംഗ്-PDF-ന് ട്രാക്കിംഗ് ഇല്ല, അതിനാൽ സ്റ്റെർലിംഗ്-PDF മെച്ചപ്പെടുത്തുന്നതിന് ഞങ്ങളുടെ ഉപയോക്താക്കളിൽ നിന്ന് കേൾക്കാൻ ഞങ്ങൾ ആഗ്രഹിക്കുന്നു!
+survey.changes=അവസാന സർവേയ്ക്ക് ശേഷം സ്റ്റെർലിംഗ്-PDF മാറിയിരിക്കുന്നു! കൂടുതൽ വിവരങ്ങൾക്കായി ദയവായി ഞങ്ങളുടെ ബ്ലോഗ് പോസ്റ്റ് ഇവിടെ പരിശോധിക്കുക:
+survey.changes2=ഈ മാറ്റങ്ങളോടെ ഞങ്ങൾക്ക് പണമടച്ചുള്ള ബിസിനസ് പിന്തുണയും ഫണ്ടിംഗും ലഭിക്കുന്നു
+survey.please=ദയവായി ഞങ്ങളുടെ സർവേ എടുക്കുന്നത് പരിഗണിക്കുക!
+survey.disabled=(സർവേ പോപ്പ്അപ്പ് തുടർന്നുള്ള അപ്ഡേറ്റുകളിൽ പ്രവർത്തനരഹിതമാക്കും, എന്നാൽ പേജിന്റെ താഴെ ലഭ്യമാകും)
+survey.button=സർവേ എടുക്കുക
+survey.dontShowAgain=വീണ്ടും കാണിക്കരുത്
+survey.meeting.1=നിങ്ങൾ ജോലിസ്ഥലത്ത് സ്റ്റെർലിംഗ് PDF ഉപയോഗിക്കുകയാണെങ്കിൽ, നിങ്ങളുമായി സംസാരിക്കാൻ ഞങ്ങൾ ആഗ്രഹിക്കുന്നു. 15 മിനിറ്റ് ഉപയോക്തൃ കണ്ടെത്തൽ സെഷന് പകരമായി ഞങ്ങൾ സാങ്കേതിക പിന്തുണാ സെഷനുകൾ വാഗ്ദാനം ചെയ്യുന്നു.
+survey.meeting.2=ഇതൊരു അവസരമാണ്:
+survey.meeting.3=വിന്യാസം, സംയോജനം, അല്ലെങ്കിൽ ട്രബിൾഷൂട്ടിംഗ് എന്നിവയിൽ സഹായം നേടുക
+survey.meeting.4=പ്രകടനം, എഡ്ജ് കേസുകൾ, ഫീച്ചർ വിടവുകൾ എന്നിവയെക്കുറിച്ച് നേരിട്ടുള്ള ഫീഡ്ബാക്ക് നൽകുക
+survey.meeting.5=യഥാർത്ഥ ലോക എന്റർപ്രൈസ് ഉപയോഗത്തിനായി സ്റ്റെർലിംഗ് PDF പരിഷ്കരിക്കാൻ ഞങ്ങളെ സഹായിക്കുക
+survey.meeting.6=നിങ്ങൾക്ക് താൽപ്പര്യമുണ്ടെങ്കിൽ, ഞങ്ങളുടെ ടീമുമായി നേരിട്ട് സമയം ബുക്ക് ചെയ്യാം. (ഇംഗ്ലീഷ് സംസാരിക്കുന്നവർ മാത്രം)
+survey.meeting.7=നിങ്ങളുടെ ഉപയോഗ കേസുകളിലേക്ക് ആഴത്തിൽ ഇറങ്ങിച്ചെല്ലാനും സ്റ്റെർലിംഗ് PDF കൂടുതൽ മികച്ചതാക്കാനും ഞങ്ങൾ ആകാംക്ഷയോടെ കാത്തിരിക്കുന്നു!
+survey.meeting.notInterested=ഒരു ബിസിനസ്സ് അല്ല കൂടാതെ/അല്ലെങ്കിൽ ഒരു മീറ്റിംഗിൽ താൽപ്പര്യമില്ലേ?
+survey.meeting.button=മീറ്റിംഗ് ബുക്ക് ചെയ്യുക
+
+#error
+error.sorry=പ്രശ്നത്തിന് ക്ഷമിക്കുക!
+error.needHelp=സഹായം വേണോ / ഒരു പ്രശ്നം കണ്ടെത്തിയോ?
+error.contactTip=നിങ്ങൾക്ക് ഇപ്പോഴും പ്രശ്നമുണ്ടെങ്കിൽ, സഹായത്തിനായി ഞങ്ങളെ ബന്ധപ്പെടാൻ മടിക്കരുത്. ഞങ്ങളുടെ GitHub പേജിൽ നിങ്ങൾക്ക് ഒരു ടിക്കറ്റ് സമർപ്പിക്കാം അല്ലെങ്കിൽ Discord വഴി ഞങ്ങളെ ബന്ധപ്പെടാം:
+error.404.head=404 - പേജ് കണ്ടെത്തിയില്ല | അയ്യോ, ഞങ്ങൾ കോഡിൽ തട്ടി വീണു!
+error.404.1=നിങ്ങൾ തിരയുന്ന പേജ് ഞങ്ങൾക്ക് കണ്ടെത്താൻ കഴിയുന്നില്ല.
+error.404.2=എന്തോ കുഴപ്പം സംഭവിച്ചു
+error.github=GitHub-ൽ ഒരു ടിക്കറ്റ് സമർപ്പിക്കുക
+error.showStack=സ്റ്റാക്ക് ട്രേസ് കാണിക്കുക
+error.copyStack=സ്റ്റാക്ക് ട്രേസ് പകർത്തുക
+error.githubSubmit=GitHub - ഒരു ടിക്കറ്റ് സമർപ്പിക്കുക
+error.discordSubmit=Discord - പിന്തുണാ പോസ്റ്റ് സമർപ്പിക്കുക
+
+
+#remove-image
+removeImage.title=ചിത്രം നീക്കം ചെയ്യുക
+removeImage.header=ചിത്രം നീക്കം ചെയ്യുക
+removeImage.removeImage=ചിത്രം നീക്കം ചെയ്യുക
+removeImage.submit=ചിത്രം നീക്കം ചെയ്യുക
+
+
+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 വിഭജിക്കുക
+
+#File Chooser
+fileChooser.click=ക്ലിക്ക് ചെയ്യുക
+fileChooser.or=അല്ലെങ്കിൽ
+fileChooser.dragAndDrop=വലിച്ചിടുക
+fileChooser.dragAndDropPDF=PDF ഫയൽ വലിച്ചിടുക
+fileChooser.dragAndDropImage=ചിത്ര ഫയൽ വലിച്ചിടുക
+fileChooser.hoveredDragAndDrop=ഫയൽ(കൾ) ഇവിടെ വലിച്ചിടുക
+fileChooser.extractPDF=വേർതിരിച്ചെടുക്കുന്നു...
+
+#release notes
+releases.footer=റിലീസുകൾ
+releases.title=റിലീസ് കുറിപ്പുകൾ
+releases.header=റിലീസ് കുറിപ്പുകൾ
+releases.current.version=നിലവിലെ റിലീസ്
+releases.note=റിലീസ് കുറിപ്പുകൾ ഇംഗ്ലീഷിൽ മാത്രമേ ലഭ്യമാകൂ
+
+#Validate Signature
+validateSignature.title=PDF ഒപ്പുകൾ സാധൂകരിക്കുക
+validateSignature.header=ഡിജിറ്റൽ ഒപ്പുകൾ സാധൂകരിക്കുക
+validateSignature.selectPDF=ഒപ്പിട്ട PDF ഫയൽ തിരഞ്ഞെടുക്കുക
+validateSignature.submit=ഒപ്പുകൾ സാധൂകരിക്കുക
+validateSignature.results=സാധൂകരണ ഫലങ്ങൾ
+validateSignature.status=സ്ഥിതി
+validateSignature.signer=ഒപ്പിട്ടയാൾ
+validateSignature.date=തീയതി
+validateSignature.reason=കാരണം
+validateSignature.location=സ്ഥലം
+validateSignature.noSignatures=ഈ പ്രമാണത്തിൽ ഡിജിറ്റൽ ഒപ്പുകളൊന്നും കണ്ടെത്തിയില്ല
+validateSignature.status.valid=സാധുവാണ്
+validateSignature.status.invalid=അസാധുവാണ്
+validateSignature.chain.invalid=സർട്ടിഫിക്കറ്റ് ശൃംഖല സാധൂകരണം പരാജയപ്പെട്ടു - ഒപ്പിട്ടയാളുടെ ഐഡന്റിറ്റി പരിശോധിക്കാൻ കഴിയില്ല
+validateSignature.trust.invalid=സർട്ടിഫിക്കറ്റ് ട്രസ്റ്റ് സ്റ്റോറിൽ ഇല്ല - ഉറവിടം പരിശോധിക്കാൻ കഴിയില്ല
+validateSignature.cert.expired=സർട്ടിഫിക്കറ്റ് കാലഹരണപ്പെട്ടു
+validateSignature.cert.revoked=സർട്ടിഫിക്കറ്റ് റദ്ദാക്കിയിരിക്കുന്നു
+validateSignature.signature.info=ഒപ്പ് വിവരങ്ങൾ
+validateSignature.signature=ഒപ്പ്
+validateSignature.signature.mathValid=ഒപ്പ് ഗണിതശാസ്ത്രപരമായി സാധുവാണ് പക്ഷേ:
+validateSignature.selectCustomCert=ഇഷ്ടാനുസൃത സർട്ടിഫിക്കറ്റ് ഫയൽ X.509 (ഓപ്ഷണൽ)
+validateSignature.cert.info=സർട്ടിഫിക്കറ്റ് വിശദാംശങ്ങൾ
+validateSignature.cert.issuer=നൽകിയയാൾ
+validateSignature.cert.subject=വിഷയം
+validateSignature.cert.serialNumber=സീരിയൽ നമ്പർ
+validateSignature.cert.validFrom=മുതൽ സാധുവാണ്
+validateSignature.cert.validUntil=വരെ സാധുവാണ്
+validateSignature.cert.algorithm=അൽഗോരിതം
+validateSignature.cert.keySize=കീ വലുപ്പം
+validateSignature.cert.version=പതിപ്പ്
+validateSignature.cert.keyUsage=കീ ഉപയോഗം
+validateSignature.cert.selfSigned=സ്വയം ഒപ്പിട്ടത്
+validateSignature.cert.bits=ബിറ്റുകൾ
+
+####################
+# Cookie banner #
+####################
+cookieBanner.popUp.title=ഞങ്ങൾ കുക്കികൾ എങ്ങനെ ഉപയോഗിക്കുന്നു
+cookieBanner.popUp.description.1=സ്റ്റെർലിംഗ് PDF നിങ്ങൾക്ക് മികച്ച രീതിയിൽ പ്രവർത്തിക്കാൻ ഞങ്ങൾ കുക്കികളും മറ്റ് സാങ്കേതികവിദ്യകളും ഉപയോഗിക്കുന്നു—ഞങ്ങളുടെ ടൂളുകൾ മെച്ചപ്പെടുത്താനും നിങ്ങൾ ഇഷ്ടപ്പെടുന്ന ഫീച്ചറുകൾ നിർമ്മിക്കുന്നത് തുടരാനും ഇത് ഞങ്ങളെ സഹായിക്കുന്നു.
+cookieBanner.popUp.description.2=നിങ്ങൾക്ക് താൽപ്പര്യമില്ലെങ്കിൽ, 'വേണ്ട നന്ദി' ക്ലിക്ക് ചെയ്യുന്നത് കാര്യങ്ങൾ സുഗമമായി പ്രവർത്തിക്കാൻ ആവശ്യമായ അവശ്യ കുക്കികൾ മാത്രം പ്രവർത്തനക്ഷമമാക്കും.
+cookieBanner.popUp.acceptAllBtn=ശരി
+cookieBanner.popUp.acceptNecessaryBtn=വേണ്ട നന്ദി
+cookieBanner.popUp.showPreferencesBtn=മുൻഗണനകൾ കൈകാര്യം ചെയ്യുക
+cookieBanner.preferencesModal.title=സമ്മത മുൻഗണനാ കേന്ദ്രം
+cookieBanner.preferencesModal.acceptAllBtn=എല്ലാം സ്വീകരിക്കുക
+cookieBanner.preferencesModal.acceptNecessaryBtn=എല്ലാം നിരസിക്കുക
+cookieBanner.preferencesModal.savePreferencesBtn=മുൻഗണനകൾ സംരക്ഷിക്കുക
+cookieBanner.preferencesModal.closeIconLabel=മോഡൽ അടയ്ക്കുക
+cookieBanner.preferencesModal.serviceCounterLabel=സേവനം|സേവനങ്ങൾ
+cookieBanner.preferencesModal.subtitle=കുക്കി ഉപയോഗം
+cookieBanner.preferencesModal.description.1=നിങ്ങളുടെ അനുഭവം മെച്ചപ്പെടുത്തുന്നതിനും ഞങ്ങളുടെ ടൂളുകൾ എങ്ങനെ ഉപയോഗിക്കുന്നുവെന്ന് മനസ്സിലാക്കുന്നതിനും സ്റ്റെർലിംഗ് PDF കുക്കികളും സമാന സാങ്കേതികവിദ്യകളും ഉപയോഗിക്കുന്നു. പ്രകടനം മെച്ചപ്പെടുത്താനും നിങ്ങൾ വിലമതിക്കുന്ന ഫീച്ചറുകൾ വികസിപ്പിക്കാനും ഞങ്ങളുടെ ഉപയോക്താക്കൾക്ക് തുടർന്നും പിന്തുണ നൽകാനും ഇത് ഞങ്ങളെ സഹായിക്കുന്നു.
+cookieBanner.preferencesModal.description.2=സ്റ്റെർലിംഗ് PDF-ന് നിങ്ങൾ ഉപയോഗിക്കുന്ന പ്രമാണങ്ങളുടെ ഉള്ളടക്കം ട്രാക്ക് ചെയ്യാനോ ആക്സസ് ചെയ്യാനോ കഴിയില്ല—ഒരിക്കലും കഴിയില്ല.
+cookieBanner.preferencesModal.description.3=നിങ്ങളുടെ സ്വകാര്യതയും വിശ്വാസവുമാണ് ഞങ്ങൾ ചെയ്യുന്നതിന്റെ കാതൽ.
+cookieBanner.preferencesModal.necessary.title.1=കർശനമായി ആവശ്യമായ കുക്കികൾ
+cookieBanner.preferencesModal.necessary.title.2=എപ്പോഴും പ്രവർത്തനക്ഷമം
+cookieBanner.preferencesModal.necessary.description=വെബ്സൈറ്റ് ശരിയായി പ്രവർത്തിക്കാൻ ഈ കുക്കികൾ അത്യാവശ്യമാണ്. നിങ്ങളുടെ സ്വകാര്യതാ മുൻഗണനകൾ സജ്ജമാക്കുക, ലോഗിൻ ചെയ്യുക, ഫോമുകൾ പൂരിപ്പിക്കുക തുടങ്ങിയ പ്രധാന സവിശേഷതകൾ അവ പ്രവർത്തനക്ഷമമാക്കുന്നു—അതുകൊണ്ടാണ് അവ ഓഫാക്കാൻ കഴിയാത്തത്.
+cookieBanner.preferencesModal.analytics.title=അനലിറ്റിക്സ്
+cookieBanner.preferencesModal.analytics.description=ഞങ്ങളുടെ ടൂളുകൾ എങ്ങനെ ഉപയോഗിക്കുന്നുവെന്ന് മനസ്സിലാക്കാൻ ഈ കുക്കികൾ ഞങ്ങളെ സഹായിക്കുന്നു, അതിനാൽ ഞങ്ങളുടെ കമ്മ്യൂണിറ്റി ഏറ്റവും കൂടുതൽ വിലമതിക്കുന്ന ഫീച്ചറുകൾ നിർമ്മിക്കുന്നതിൽ ഞങ്ങൾക്ക് ശ്രദ്ധ കേന്ദ്രീകരിക്കാൻ കഴിയും. ഉറപ്പാക്കുക—സ്റ്റെർലിംഗ് PDF-ന് നിങ്ങൾ പ്രവർത്തിക്കുന്ന പ്രമാണങ്ങളുടെ ഉള്ളടക്കം ട്രാക്ക് ചെയ്യാൻ കഴിയില്ല, ഒരിക്കലും കഴിയില്ല.
+
diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties
index 24743d85f..f337ff6af 100644
--- a/src/main/resources/messages_ru_RU.properties
+++ b/src/main/resources/messages_ru_RU.properties
@@ -10,9 +10,9 @@ multiPdfPrompt=Выберите PDF-файлы (2+)
multiPdfDropPrompt=Выберите (или перетащите) все необходимые PDF-файлы
imgPrompt=Выберите изображение(я)
genericSubmit=Отправить
-uploadLimit=Maximum file size:
-uploadLimitExceededSingular=is too large. Maximum allowed size is
-uploadLimitExceededPlural=are too large. Maximum allowed size is
+uploadLimit=Максимальный размер файла:
+uploadLimitExceededSingular=слишком велик. Максимально допустимый размер -
+uploadLimitExceededPlural=слишком велики. Максимально допустимый размер -
processTimeWarning=Внимание: Данный процесс может занять до минуты в зависимости от размера файла
pageOrderPrompt=Пользовательский порядок страниц (Введите список номеров страниц через запятую или функции типа 2n+1):
pageSelectionPrompt=Выбор страниц (Введите список номеров страниц через запятую 1,5,6 или функции типа 2n+1):
@@ -86,14 +86,14 @@ loading=Загрузка...
addToDoc=Добавить в документ
reset=Сбросить
apply=Применить
-noFileSelected=No file selected. Please upload one.
+noFileSelected=Файл не выбран. Пожалуйста, загрузите его.
legal.privacy=Политика конфиденциальности
legal.terms=Условия использования
legal.accessibility=Доступность
legal.cookie=Политика использования файлов cookie
legal.impressum=Выходные данные
-legal.showCookieBanner=Cookie Preferences
+legal.showCookieBanner=Настройки файлов cookie
###############
# Pipeline #
@@ -237,7 +237,7 @@ adminUserSettings.activeUsers=Активные пользователи:
adminUserSettings.disabledUsers=Отключенные пользователи:
adminUserSettings.totalUsers=Всего пользователей:
adminUserSettings.lastRequest=Последний запрос
-adminUserSettings.usage=View Usage
+adminUserSettings.usage=Просмотр использования
endpointStatistics.title=Статистика конечных точек
endpointStatistics.header=Статистика конечных точек
@@ -292,18 +292,18 @@ home.desc=Ваше локальное решение для всех потре
home.searchBar=Поиск функций...
-home.viewPdf.title=View/Edit PDF
+home.viewPdf.title=Просмотр/Редактирование PDF
home.viewPdf.desc=Просмотр, аннотирование, добавление текста или изображений
viewPdf.tags=просмотр,чтение,аннотации,текст,изображение
-home.setFavorites=Set Favourites
-home.hideFavorites=Hide Favourites
-home.showFavorites=Show Favourites
-home.legacyHomepage=Old homepage
-home.newHomePage=Try our new homepage!
-home.alphabetical=Alphabetical
-home.globalPopularity=Global Popularity
-home.sortBy=Sort by:
+home.setFavorites=Добавить в избранное
+home.hideFavorites=Скрыть избранное
+home.showFavorites=Показать избранное
+home.legacyHomepage=Старая главная страница
+home.newHomePage=Попробуйте нашу новую главную страницу!
+home.alphabetical=По алфавиту
+home.globalPopularity=Глобальная популярность
+home.sortBy=Сортировать по:
home.multiTool.title=Мультиинструмент PDF
home.multiTool.desc=Объединение, поворот, переупорядочивание и удаление страниц
@@ -364,9 +364,9 @@ home.compressPdfs.title=Сжать
home.compressPdfs.desc=Сжимайте PDF-файлы для уменьшения их размера.
compressPdfs.tags=сжатие,маленький,крошечный
-home.unlockPDFForms.title=Unlock PDF Forms
-home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document.
-unlockPDFForms.tags=remove,delete,form,field,readonly
+home.unlockPDFForms.title=Разблокировать формы PDF
+home.unlockPDFForms.desc=Удалить свойство только для чтения из полей формы в PDF-документе.
+unlockPDFForms.tags=удалить,удаление,форма,поле,только для чтения
home.changeMetadata.title=Изменить метаданные
home.changeMetadata.desc=Изменить/удалить/добавить метаданные из PDF-документа
@@ -494,9 +494,9 @@ home.MarkdownToPDF.title=Markdown в PDF
home.MarkdownToPDF.desc=Преобразует любой файл Markdown в PDF
MarkdownToPDF.tags=разметка,веб-контент,преобразование,конвертация
-home.PDFToMarkdown.title=PDF to Markdown
-home.PDFToMarkdown.desc=Converts any PDF to Markdown
-PDFToMarkdown.tags=markup,web-content,transformation,convert,md
+home.PDFToMarkdown.title=PDF в Markdown
+home.PDFToMarkdown.desc=Конвертирует любой PDF в Markdown
+PDFToMarkdown.tags=разметка,веб-контент,преобразование,конвертировать,md
home.getPdfInfo.title=Получить ВСЮ информацию о PDF
home.getPdfInfo.desc=Собирает всю возможную информацию о PDF
@@ -609,7 +609,7 @@ login.userIsDisabled=Пользователь деактивирован, вхо
login.alreadyLoggedIn=Вы уже вошли в
login.alreadyLoggedIn2=устройств(а). Пожалуйста, выйдите из этих устройств и попробуйте снова.
login.toManySessions=У вас слишком много активных сессий
-login.logoutMessage=You have been logged out.
+login.logoutMessage=Вы вышли из системы.
#auto-redact
autoRedact.title=Автоматическое редактирование
@@ -648,7 +648,7 @@ redact.showAttatchments=Показать вложения
redact.showLayers=Показать слои (двойной щелчок для сброса всех слоев к состоянию по умолчанию)
redact.colourPicker=Выбор цвета
redact.findCurrentOutlineItem=Найти текущий элемент структуры
-redact.applyChanges=Apply Changes
+redact.applyChanges=Применить изменения
#showJS
showJS.title=Показать Javascript
@@ -686,9 +686,9 @@ MarkdownToPDF.credit=Использует WeasyPrint
#pdf-to-markdown
-PDFToMarkdown.title=PDF To Markdown
-PDFToMarkdown.header=PDF To Markdown
-PDFToMarkdown.submit=Convert
+PDFToMarkdown.title=PDF в Markdown
+PDFToMarkdown.header=PDF в Markdown
+PDFToMarkdown.submit=Конвертировать
#url-to-pdf
@@ -742,10 +742,10 @@ sanitizePDF.title=Очистить PDF
sanitizePDF.header=Очистить PDF-файл
sanitizePDF.selectText.1=Удалить JavaScript-действия
sanitizePDF.selectText.2=Удалить встроенные файлы
-sanitizePDF.selectText.3=Remove XMP metadata
+sanitizePDF.selectText.3=Удалить метаданные XMP
sanitizePDF.selectText.4=Удалить ссылки
sanitizePDF.selectText.5=Удалить шрифты
-sanitizePDF.selectText.6=Remove Document Info Metadata
+sanitizePDF.selectText.6=Удалить метаданные информации о документе
sanitizePDF.submit=Очистить PDF
@@ -894,8 +894,8 @@ sign.last=Последняя страница
sign.next=Следующая страница
sign.previous=Предыдущая страница
sign.maintainRatio=Переключить сохранение пропорций
-sign.undo=Undo
-sign.redo=Redo
+sign.undo=Отменить
+sign.redo=Повторить
#repair
repair.title=Восстановление
@@ -966,8 +966,8 @@ compress.title=Сжать
compress.header=Сжать PDF
compress.credit=Этот сервис использует qpdf для сжатия/оптимизации PDF.
compress.grayscale.label=Применить шкалу серого для сжатия
-compress.selectText.1=Compression Settings
-compress.selectText.1.1=1-3 PDF compression, 4-6 lite image compression, 7-9 intense image compression Will dramatically reduce image quality
+compress.selectText.1=Настройки сжатия
+compress.selectText.1.1=1-3 Сжатие PDF, 4-6 легкое сжатие изображений, 7-9 интенсивное сжатие изображений Существенно снижает качество изображений
compress.selectText.2=Уровень оптимизации:
compress.selectText.4=Автоматический режим - автоматически настраивает качество для получения точного размера PDF
compress.selectText.5=Ожидаемый размер PDF (например, 25MB, 10.8MB, 25KB)
@@ -1006,7 +1006,7 @@ pdfOrganiser.mode.7=Удалить первую
pdfOrganiser.mode.8=Удалить последнюю
pdfOrganiser.mode.9=Удалить первую и последнюю
pdfOrganiser.mode.10=Объединение четных-нечетных
-pdfOrganiser.mode.11=Duplicate all pages
+pdfOrganiser.mode.11=Дублировать все страницы
pdfOrganiser.placeholder=(например, 1,3,2 или 4-8,2,10-12 или 2n-1)
@@ -1049,7 +1049,7 @@ decrypt.success=Файл успешно расшифрован.
multiTool-advert.message=Эта функция также доступна на нашей странице мультиинструмента. Попробуйте её для улучшенного постраничного интерфейса и дополнительных возможностей!
#view pdf
-viewPdf.title=View/Edit PDF
+viewPdf.title=Просмотр/Редактирование PDF
viewPdf.header=Просмотр PDF
#pageRemover
@@ -1191,15 +1191,15 @@ 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=Изменить
#unlockPDFForms
-unlockPDFForms.title=Remove Read-Only from Form Fields
-unlockPDFForms.header=Unlock PDF Forms
-unlockPDFForms.submit=Remove
+unlockPDFForms.title=Удалить только для чтения из полей формы
+unlockPDFForms.header=Разблокировать формы PDF
+unlockPDFForms.submit=Удалить
#pdfToPDFA
pdfToPDFA.title=PDF в PDF/A
@@ -1319,15 +1319,15 @@ survey.please=Пожалуйста, примите участие в нашем
survey.disabled=(Всплывающее окно опроса будет отключено в следующих обновлениях, но будет доступно в нижней части страницы)
survey.button=Пройти опрос
survey.dontShowAgain=Больше не показывать
-survey.meeting.1=If you're using Stirling PDF at work, we'd love to speak to you. We're offering technical support sessions in exchange for a 15 minute user discovery session.
-survey.meeting.2=This is a chance to:
-survey.meeting.3=Get help with deployment, integrations, or troubleshooting
-survey.meeting.4=Provide direct feedback on performance, edge cases, and feature gaps
-survey.meeting.5=Help us refine Stirling PDF for real-world enterprise use
-survey.meeting.6=If you're interested, you can book time with our team directly. (English speaking only)
-survey.meeting.7=Looking forward to digging into your use cases and making Stirling PDF even better!
-survey.meeting.notInterested=Not a business and/or interested in a meeting?
-survey.meeting.button=Book meeting
+survey.meeting.1=Если вы используете Stirling PDF на работе, мы будем рады поговорить с вами. Мы предлагаем сеансы технической поддержки в обмен на 15-минутную сессию по изучению пользователей.
+survey.meeting.2=Это возможность:
+survey.meeting.3=Получить помощь с развертыванием, интеграцией или устранением неполадок
+survey.meeting.4=Предоставить прямую обратную связь о производительности, крайних случаях и пробелах в функциях
+survey.meeting.5=Помочь нам улучшить Stirling PDF для реального использования в корпоративной среде
+survey.meeting.6=Если вы заинтересованы, вы можете записаться на встречу с нашей командой напрямую. (Только на английском языке)
+survey.meeting.7=С нетерпением ждем возможности изучить ваши случаи использования и сделать Stirling PDF еще лучше!
+survey.meeting.notInterested=Не являетесь бизнесом и/или не заинтересованы во встрече?
+survey.meeting.button=Записаться на встречу
#error
error.sorry=Извините за неполадки!
@@ -1415,25 +1415,25 @@ validateSignature.cert.bits=бит
####################
# Cookie banner #
####################
-cookieBanner.popUp.title=How we use Cookies
-cookieBanner.popUp.description.1=We use cookies and other technologies to make Stirling PDF work better for you—helping us improve our tools and keep building features you'll love.
-cookieBanner.popUp.description.2=If you’d rather not, clicking 'No Thanks' will only enable the essential cookies needed to keep things running smoothly.
-cookieBanner.popUp.acceptAllBtn=Okay
-cookieBanner.popUp.acceptNecessaryBtn=No Thanks
-cookieBanner.popUp.showPreferencesBtn=Manage preferences
-cookieBanner.preferencesModal.title=Consent Preferences Center
-cookieBanner.preferencesModal.acceptAllBtn=Accept all
-cookieBanner.preferencesModal.acceptNecessaryBtn=Reject all
-cookieBanner.preferencesModal.savePreferencesBtn=Save preferences
-cookieBanner.preferencesModal.closeIconLabel=Close modal
-cookieBanner.preferencesModal.serviceCounterLabel=Service|Services
-cookieBanner.preferencesModal.subtitle=Cookie Usage
-cookieBanner.preferencesModal.description.1=Stirling PDF uses cookies and similar technologies to enhance your experience and understand how our tools are used. This helps us improve performance, develop the features you care about, and provide ongoing support to our users.
-cookieBanner.preferencesModal.description.2=Stirling PDF cannot—and will never—track or access the content of the documents you use.
-cookieBanner.preferencesModal.description.3=Your privacy and trust are at the core of what we do.
-cookieBanner.preferencesModal.necessary.title.1=Strictly Necessary Cookies
-cookieBanner.preferencesModal.necessary.title.2=Always Enabled
-cookieBanner.preferencesModal.necessary.description=These cookies are essential for the website to function properly. They enable core features like setting your privacy preferences, logging in, and filling out forms—which is why they can’t be turned off.
-cookieBanner.preferencesModal.analytics.title=Analytics
-cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with.
+cookieBanner.popUp.title=Как мы используем файлы cookie
+cookieBanner.popUp.description.1=Мы используем файлы cookie и другие технологии, чтобы Stirling PDF работал лучше для вас — помогая нам улучшать наши инструменты и добавлять функции, которые вам понравятся.
+cookieBanner.popUp.description.2=Если вы не хотите, нажав «Нет, спасибо», вы включите только основные файлы cookie, необходимые для бесперебойной работы.
+cookieBanner.popUp.acceptAllBtn=Хорошо
+cookieBanner.popUp.acceptNecessaryBtn=Нет, спасибо
+cookieBanner.popUp.showPreferencesBtn=Управление предпочтениями
+cookieBanner.preferencesModal.title=Центр управления предпочтениями
+cookieBanner.preferencesModal.acceptAllBtn=Принять все
+cookieBanner.preferencesModal.acceptNecessaryBtn=Отклонить все
+cookieBanner.preferencesModal.savePreferencesBtn=Сохранить предпочтения
+cookieBanner.preferencesModal.closeIconLabel=Закрыть окно
+cookieBanner.preferencesModal.serviceCounterLabel=Сервис|Сервисы
+cookieBanner.preferencesModal.subtitle=Использование файлов cookie
+cookieBanner.preferencesModal.description.1=Stirling PDF использует файлы cookie и аналогичные технологии, чтобы улучшить ваш опыт и понять, как используются наши инструменты. Это помогает нам улучшать производительность, разрабатывать функции, которые важны для нашего сообщества, и предоставлять постоянную поддержку нашим пользователям.
+cookieBanner.preferencesModal.description.2=Stirling PDF не может — и никогда не будет — отслеживать или получать доступ к содержимому документов, которые вы используете.
+cookieBanner.preferencesModal.description.3=Ваша конфиденциальность и доверие — в основе того, что мы делаем.
+cookieBanner.preferencesModal.necessary.title.1=Строго необходимые файлы cookie
+cookieBanner.preferencesModal.necessary.title.2=Всегда включены
+cookieBanner.preferencesModal.necessary.description=Эти файлы cookie необходимы для правильной работы веб-сайта. Они включают основные функции, такие как установка ваших предпочтений конфиденциальности, вход в систему и заполнение форм — поэтому их нельзя отключить.
+cookieBanner.preferencesModal.analytics.title=Аналитика
+cookieBanner.preferencesModal.analytics.description=Эти файлы cookie помогают нам понять, как используются наши инструменты, чтобы мы могли сосредоточиться на создании функций, которые ценит наше сообщество. Будьте уверены — Stirling PDF не может и никогда не будет отслеживать содержимое документов, с которыми вы работаете.
diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties
index 61b51c533..797e2c2c4 100644
--- a/src/main/resources/messages_uk_UA.properties
+++ b/src/main/resources/messages_uk_UA.properties
@@ -10,9 +10,9 @@ multiPdfPrompt=Оберіть PDFи (2+)
multiPdfDropPrompt=Оберіть (або перетягніть) всі необхідні PDFи
imgPrompt=Оберіть зображення(я)
genericSubmit=Надіслати
-uploadLimit=Maximum file size:
-uploadLimitExceededSingular=is too large. Maximum allowed size is
-uploadLimitExceededPlural=are too large. Maximum allowed size is
+uploadLimit=Максимальний розмір файлу:
+uploadLimitExceededSingular=занадто великий. Максимально дозволений розмір -
+uploadLimitExceededPlural=занадто великі. Максимально дозволений розмір -
processTimeWarning=Увага: Цей процес може тривати до хвилини в залежності від розміру файлу.
pageOrderPrompt=Порядок сторінок (введіть список номерів сторінок через кому):
pageSelectionPrompt=Користувацький вибір сторінки (введіть список номерів сторінок через кому 1,5,6 або функції типу 2n+1) :
@@ -86,14 +86,14 @@ loading=Завантаження...
addToDoc=Додати до документу
reset=Скинути
apply=Застосувати
-noFileSelected=No file selected. Please upload one.
+noFileSelected=Файл не вибрано. Будь ласка, завантажте один.
legal.privacy=Політика конфіденційності
legal.terms=Правила та умови
legal.accessibility=Доступність
legal.cookie=Політика використання файлів cookie
legal.impressum=Вихідні дані
-legal.showCookieBanner=Cookie Preferences
+legal.showCookieBanner=Налаштування файлів cookie
###############
# Pipeline #
@@ -237,7 +237,7 @@ adminUserSettings.activeUsers=Активні користувачі:
adminUserSettings.disabledUsers=Заблоковані користувачі:
adminUserSettings.totalUsers=Всього користувачів:
adminUserSettings.lastRequest=Останній запит
-adminUserSettings.usage=View Usage
+adminUserSettings.usage=Переглянути використання
endpointStatistics.title=Статистика кінцевих точок
endpointStatistics.header=Статистика кінцевих точок
@@ -364,9 +364,9 @@ home.compressPdfs.title=Стиснути
home.compressPdfs.desc=Стискайте PDF-файли, щоб зменшити їх розмір.
compressPdfs.tags=стиск,маленький,крихітний
-home.unlockPDFForms.title=Unlock PDF Forms
-home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document.
-unlockPDFForms.tags=remove,delete,form,field,readonly
+home.unlockPDFForms.title=Розблокувати PDF форми
+home.unlockPDFForms.desc=Видалити властивість "тільки для читання" з полів форми у PDF-документі.
+unlockPDFForms.tags=видалити,розблокувати,форма,поле,тільки для читання
home.changeMetadata.title=Змінити метадані
home.changeMetadata.desc=Змінити/видалити/додати метадані з документа PDF
@@ -609,7 +609,7 @@ login.userIsDisabled=Користувач деактивовано, вхід з
login.alreadyLoggedIn=Ви вже увійшли до
login.alreadyLoggedIn2=пристроїв (а). Будь ласка, вийдіть із цих пристроїв і спробуйте знову.
login.toManySessions=У вас дуже багато активних сесій
-login.logoutMessage=You have been logged out.
+login.logoutMessage=Ви вийшли з системи.
#auto-redact
autoRedact.title=Автоматичне редагування
@@ -742,10 +742,10 @@ sanitizePDF.title=Дезінфекція PDF
sanitizePDF.header=Дезінфекція PDF файлу
sanitizePDF.selectText.1=Видалити JavaScript
sanitizePDF.selectText.2=Видалити вбудовані файли
-sanitizePDF.selectText.3=Remove XMP metadata
+sanitizePDF.selectText.3=Видалити XMP метадані
sanitizePDF.selectText.4=Видалити посилання
sanitizePDF.selectText.5=Видалити шрифти
-sanitizePDF.selectText.6=Remove Document Info Metadata
+sanitizePDF.selectText.6=Видалити метадані інформації про документ
sanitizePDF.submit=Дезінфекція
@@ -1071,7 +1071,7 @@ rotate.submit=Повернути
split.title=Розділити PDF
split.header=Розділити PDF
split.desc.1=Числа, які ви вибрали, це номери сторінок, на яких ви хочете зробити розділ.
-split.desc.2=Таким чином, вибір 1,3,7-8 розділить 10-сторінковий документ на 6 окремих PDF-файлів з:
+split.desc.2=Таким чином, вибір 1,3,7-8 розділіть 10-сторінковий документ на 6 окремих PDF-файлів з:
split.desc.3=Документ #1: Сторінка 1
split.desc.4=Документ #2: Сторінки 2 і 3
split.desc.5=Документ #3: Сторінки 4, 5 і 6
@@ -1372,68 +1372,68 @@ fileChooser.extractPDF=Видобування...
#release notes
releases.footer=Релізи
-releases.title=Примечания к релизу
-releases.header=Примечания к релизу
-releases.current.version=Текущий релиз
-releases.note=Примітка до релізу доступна тільки на англійській мові
+releases.title=Примітки до релізу
+releases.header=Примітки до релізу
+releases.current.version=Поточний реліз
+releases.note=Примітки до релізу доступні лише англійською мовою
#Validate Signature
validateSignature.title=Перевірка підписів PDF
validateSignature.header=Перевірка цифрових підписів
validateSignature.selectPDF=Виберіть підписаний PDF-файл
validateSignature.submit=Перевірити підписи
-validateSignature.results=Результаты проверки
+validateSignature.results=Результати перевірки
validateSignature.status=Статус
validateSignature.signer=Підписант
validateSignature.date=Дата
validateSignature.reason=Причина
-validateSignature.location=Местоположение
-validateSignature.noSignatures=В цьому документі не знайдено цифрових підписів
-validateSignature.status.valid=Дійна
-validateSignature.status.invalid=Недійсна
-validateSignature.chain.invalid=Перевірка цепочки сертифікатів не удалась - неможливо перевірити особистість підписанта
+validateSignature.location=Місцезнаходження
+validateSignature.noSignatures=У цьому документі не знайдено цифрових підписів
+validateSignature.status.valid=Дійсний
+validateSignature.status.invalid=Недійсний
+validateSignature.chain.invalid=Перевірка ланцюга сертифікатів не вдалася - неможливо перевірити особу підписанта
validateSignature.trust.invalid=Сертифікат відсутній у довіреному сховищі - джерело не може бути перевірено
-validateSignature.cert.expired=Срок дії сертифіката істеку
-validateSignature.cert.revoked=Сертифікат був отозван
-validateSignature.signature.info=Інформація про підписи
-validateSignature.signature=Подпись
-validateSignature.signature.mathValid=Подпись математически корректна, НО:
-validateSignature.selectCustomCert=Користувачський файл сертифіката X.509 (Необов'язково)
-validateSignature.cert.info=Сведения про сертифікати
-validateSignature.cert.issuer=Издатель
-validateSignature.cert.subject=суб'єкт
-validateSignature.cert.serialNumber=Серийний номер
+validateSignature.cert.expired=Термін дії сертифіката закінчився
+validateSignature.cert.revoked=Сертифікат було відкликано
+validateSignature.signature.info=Інформація про підпис
+validateSignature.signature=Підпис
+validateSignature.signature.mathValid=Підпис математично коректний, АЛЕ:
+validateSignature.selectCustomCert=Користувацький файл сертифіката X.509 (Необов'язково)
+validateSignature.cert.info=Інформація про сертифікат
+validateSignature.cert.issuer=Видавець
+validateSignature.cert.subject=Суб'єкт
+validateSignature.cert.serialNumber=Серійний номер
validateSignature.cert.validFrom=Дійсний з
validateSignature.cert.validUntil=Дійсний до
validateSignature.cert.algorithm=Алгоритм
validateSignature.cert.keySize=Розмір ключа
validateSignature.cert.version=Версія
validateSignature.cert.keyUsage=Використання ключа
-validateSignature.cert.selfSigned=Самоподписанный
+validateSignature.cert.selfSigned=Самопідписаний
validateSignature.cert.bits=біт
####################
# Cookie banner #
####################
-cookieBanner.popUp.title=How we use Cookies
-cookieBanner.popUp.description.1=We use cookies and other technologies to make Stirling PDF work better for you—helping us improve our tools and keep building features you'll love.
-cookieBanner.popUp.description.2=If you’d rather not, clicking 'No Thanks' will only enable the essential cookies needed to keep things running smoothly.
-cookieBanner.popUp.acceptAllBtn=Okay
-cookieBanner.popUp.acceptNecessaryBtn=No Thanks
-cookieBanner.popUp.showPreferencesBtn=Manage preferences
-cookieBanner.preferencesModal.title=Consent Preferences Center
-cookieBanner.preferencesModal.acceptAllBtn=Accept all
-cookieBanner.preferencesModal.acceptNecessaryBtn=Reject all
-cookieBanner.preferencesModal.savePreferencesBtn=Save preferences
-cookieBanner.preferencesModal.closeIconLabel=Close modal
-cookieBanner.preferencesModal.serviceCounterLabel=Service|Services
-cookieBanner.preferencesModal.subtitle=Cookie Usage
-cookieBanner.preferencesModal.description.1=Stirling PDF uses cookies and similar technologies to enhance your experience and understand how our tools are used. This helps us improve performance, develop the features you care about, and provide ongoing support to our users.
-cookieBanner.preferencesModal.description.2=Stirling PDF cannot—and will never—track or access the content of the documents you use.
-cookieBanner.preferencesModal.description.3=Your privacy and trust are at the core of what we do.
-cookieBanner.preferencesModal.necessary.title.1=Strictly Necessary Cookies
-cookieBanner.preferencesModal.necessary.title.2=Always Enabled
-cookieBanner.preferencesModal.necessary.description=These cookies are essential for the website to function properly. They enable core features like setting your privacy preferences, logging in, and filling out forms—which is why they can’t be turned off.
-cookieBanner.preferencesModal.analytics.title=Analytics
-cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with.
+cookieBanner.popUp.title=Як ми використовуємо файли cookie
+cookieBanner.popUp.description.1=Ми використовуємо файли cookie та інші технології, щоб Stirling PDF працював краще для вас — допомагаючи нам покращувати наші інструменти та створювати функції, які вам сподобаються.
+cookieBanner.popUp.description.2=Якщо ви не хочете, натискання «Ні, дякую» увімкне лише необхідні файли cookie, потрібні для безперебійної роботи.
+cookieBanner.popUp.acceptAllBtn=Добре
+cookieBanner.popUp.acceptNecessaryBtn=Ні, дякую
+cookieBanner.popUp.showPreferencesBtn=Керувати налаштуваннями
+cookieBanner.preferencesModal.title=Центр налаштувань згоди
+cookieBanner.preferencesModal.acceptAllBtn=Прийняти всі
+cookieBanner.preferencesModal.acceptNecessaryBtn=Відхилити всі
+cookieBanner.preferencesModal.savePreferencesBtn=Зберегти налаштування
+cookieBanner.preferencesModal.closeIconLabel=Закрити модальне вікно
+cookieBanner.preferencesModal.serviceCounterLabel=Сервіс|Сервіси
+cookieBanner.preferencesModal.subtitle=Використання файлів cookie
+cookieBanner.preferencesModal.description.1=Stirling PDF використовує файли cookie та подібні технології, щоб покращити ваш досвід і зрозуміти, як використовуються наші інструменти. Це допомагає нам покращувати продуктивність, розробляти функції, які вас цікавлять, і надавати постійну підтримку нашим користувачам.
+cookieBanner.preferencesModal.description.2=Stirling PDF не може — і ніколи не буде — відстежувати або отримувати доступ до вмісту документів, які ви використовуєте.
+cookieBanner.preferencesModal.description.3=Ваша конфіденційність і довіра є основою того, що ми робимо.
+cookieBanner.preferencesModal.necessary.title.1=Суворо необхідні файли cookie
+cookieBanner.preferencesModal.necessary.title.2=Завжди увімкнені
+cookieBanner.preferencesModal.necessary.description=Ці файли cookie є необхідними для правильного функціонування вебсайту. Вони забезпечують основні функції, такі як налаштування ваших уподобань конфіденційності, вхід у систему та заповнення форм — тому їх не можна вимкнути.
+cookieBanner.preferencesModal.analytics.title=Аналітика
+cookieBanner.preferencesModal.analytics.description=Ці файли cookie допомагають нам зрозуміти, як використовуються наші інструменти, щоб ми могли зосередитися на створенні функцій, які найбільше цінує наша спільнота. Будьте впевнені — Stirling PDF не може і ніколи не буде відстежувати вміст документів, з якими ви працюєте.
diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties
index e04c77fbd..e3dd78dcf 100644
--- a/src/main/resources/messages_zh_CN.properties
+++ b/src/main/resources/messages_zh_CN.properties
@@ -1075,9 +1075,9 @@ split.desc.2=如选择1,3,7-9将把一个 10 页的文件分割成6个独立的P
split.desc.3=文档 #1:第 1 页
split.desc.4=文档 #2:第 2 页和第 3 页
split.desc.5=文档 #3:第 4 页、第 5 页、第 6 页和第 7 页
-split.desc.6=文档 #4:第 7 页
-split.desc.7=文档 #5:第 8 页
-split.desc.8=文档 #6:第 9 页和第 10 页
+split.desc.6=文档 #4:第 8 页
+split.desc.7=文档 #5:第 9 页
+split.desc.8=文档 #6:第 10 页
split.splitPages=输入要分割的页面:
split.submit=拆分
diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties
index ea67d4ce3..f284e5499 100644
--- a/src/main/resources/messages_zh_TW.properties
+++ b/src/main/resources/messages_zh_TW.properties
@@ -364,9 +364,9 @@ home.compressPdfs.title=壓縮
home.compressPdfs.desc=壓縮 PDF 以減少其檔案大小。
compressPdfs.tags=壓縮,小,微小
-home.unlockPDFForms.title=Unlock PDF Forms
-home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document.
-unlockPDFForms.tags=remove,delete,form,field,readonly
+home.unlockPDFForms.title=解鎖 PDF 表單
+home.unlockPDFForms.desc=移除 PDF 文件中表單欄位的唯讀屬性
+unlockPDFForms.tags=移除,刪除,表格,欄位,唯讀
home.changeMetadata.title=變更中繼資料
home.changeMetadata.desc=從 PDF 檔案中變更/移除/新增中繼資料
@@ -1197,9 +1197,9 @@ changeMetadata.selectText.5=新增自訂中繼資料項目
changeMetadata.submit=變更
#unlockPDFForms
-unlockPDFForms.title=Remove Read-Only from Form Fields
-unlockPDFForms.header=Unlock PDF Forms
-unlockPDFForms.submit=Remove
+unlockPDFForms.title=移除表單欄位的唯讀限制
+unlockPDFForms.header=解鎖 PDF 表單
+unlockPDFForms.submit=移除
#pdfToPDFA
pdfToPDFA.title=PDF 轉 PDF/A
diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template
index 201f875dd..380faeb42 100644
--- a/src/main/resources/settings.yml.template
+++ b/src/main/resources/settings.yml.template
@@ -77,7 +77,7 @@ premium:
appId: ''
mail:
- enabled: true # set to 'true' to enable sending emails
+ enabled: false # set to 'true' to enable sending emails
host: smtp.example.com # SMTP server hostname
port: 587 # SMTP server port
username: '' # SMTP server username
@@ -85,7 +85,7 @@ mail:
from: '' # sender email address
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
+ termsAndConditions: https://www.stirlingpdf.com/terms # 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
@@ -113,11 +113,11 @@ system:
name: postgres # set the name of your database. Should match the name of the database you create
customPaths:
pipeline:
- watchedFoldersDir: '' #Defaults to /pipeline/watchedFolders
- finishedFoldersDir: '' #Defaults to /pipeline/finishedFolders
+ watchedFoldersDir: '' # Defaults to /pipeline/watchedFolders
+ finishedFoldersDir: '' # Defaults to /pipeline/finishedFolders
operations:
- weasyprint: '' #Defaults to /opt/venv/bin/weasyprint
- unoconvert: '' #Defaults to /opt/venv/bin/unoconvert
+ weasyprint: '' # Defaults to /opt/venv/bin/weasyprint
+ unoconvert: '' # Defaults to /opt/venv/bin/unoconvert
fileUploadLimit: '' # Defaults to "". No limit when string is empty. Set a number, between 0 and 999, followed by one of the following strings to set a limit. "KB", "MB", "GB".
ui:
diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json
index da8718489..b701c302f 100644
--- a/src/main/resources/static/3rdPartyLicenses.json
+++ b/src/main/resources/static/3rdPartyLicenses.json
@@ -553,7 +553,7 @@
{
"moduleName": "io.micrometer:micrometer-core",
"moduleUrl": "https://github.com/micrometer-metrics/micrometer",
- "moduleVersion": "1.14.6",
+ "moduleVersion": "1.15.0",
"moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
},
@@ -932,14 +932,14 @@
},
{
"moduleName": "org.apache.xmlgraphics:batik-all",
- "moduleVersion": "1.18",
+ "moduleVersion": "1.19",
"moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
},
{
"moduleName": "org.apache.xmlgraphics:xmlgraphics-commons",
"moduleUrl": "http://xmlgraphics.apache.org/commons/",
- "moduleVersion": "2.10",
+ "moduleVersion": "2.11",
"moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
},
@@ -1637,7 +1637,7 @@
{
"moduleName": "org.springframework.security:spring-security-saml2-service-provider",
"moduleUrl": "https://spring.io/projects/spring-security",
- "moduleVersion": "6.4.5",
+ "moduleVersion": "6.5.0",
"moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
},
@@ -1714,7 +1714,7 @@
{
"moduleName": "org.springframework:spring-jdbc",
"moduleUrl": "https://github.com/spring-projects/spring-framework",
- "moduleVersion": "6.2.6",
+ "moduleVersion": "6.2.7",
"moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
},
@@ -1742,7 +1742,7 @@
{
"moduleName": "org.springframework:spring-webmvc",
"moduleUrl": "https://github.com/spring-projects/spring-framework",
- "moduleVersion": "6.2.6",
+ "moduleVersion": "6.2.7",
"moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
},
diff --git a/src/main/resources/static/css/general.css b/src/main/resources/static/css/general.css
index b49bfb7ee..88e7a1b11 100644
--- a/src/main/resources/static/css/general.css
+++ b/src/main/resources/static/css/general.css
@@ -1,7 +1,8 @@
#page-container {
- min-height: 100vh;
+ height: 100vh;
display: flex;
flex-direction: column;
+ overflow-x: clip;
}
#content-wrap {
diff --git a/src/main/resources/static/css/home-legacy.css b/src/main/resources/static/css/home-legacy.css
deleted file mode 100644
index b25fafc17..000000000
--- a/src/main/resources/static/css/home-legacy.css
+++ /dev/null
@@ -1,229 +0,0 @@
-#searchBar {
- color: var(--md-sys-color-on-surface);
- background-color: var(--md-sys-color-surface-container-low);
- width: 100%;
- font-size: 16px;
- margin-bottom: 2rem;
- padding: 0.75rem 3.5rem;
- border: 1px solid var(--md-sys-color-outline-variant);
- border-radius: 3rem;
- outline-color: var(--md-sys-color-outline-variant);
- }
-
- #filtersContainer {
- display: flex;
- width: 100%;
- align-items: center;
- justify-content: center;
- gap: 10px;
- }
-
- .filter-button {
- color: var(--md-sys-color-secondary);
- user-select: none;
- cursor: pointer;
- transition: transform 0.3s;
- transform-origin: center center;
- }
-
- .filter-button:hover {
- transform: scale(1.08);
- }
-
- .search-icon {
- position: absolute;
- margin: 0.75rem 1rem;
- border: 0.1rem solid transparent;
- }
-
- .features-container {
- display: flex;
- flex-direction: column;
- gap: 30px;
- }
-
- .feature-group-legacy {
- display: flex;
- flex-direction: column;
- }
-
- .feature-group-header {
- display: flex;
- align-items: center;
- justify-content: flex-start;
- color: var(--md-sys-color-on-surface);
- margin-bottom: 15px;
- user-select: none;
- cursor: pointer;
- gap: 10px;
- }
-
- .feature-group-container {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(15rem, 3fr));
- gap: 30px 30px;
- overflow: hidden;
- margin: -20px;
- padding: 20px;
- box-sizing:content-box;
- }
-
- .feature-group-container.animated-group {
- transition: 0.5s all;
- }
-
- .feature-group-legacy.collapsed>.feature-group-container {
- max-height: 0 !important;
- margin: 0;
- padding: 0;
- }
-
- .header-expand-button {
- transition: 0.5s all;
- transform: rotate(90deg);
- }
-
- .header-expand-button.collapsed {
- transform: rotate(0deg);
- }
-
- .feature-card {
- border: 1px solid var(--md-sys-color-surface-5);
- border-radius: 1.75rem;
- padding: 1.25rem;
- display: flex;
- flex-direction: column;
- align-items: flex-start;
- background: var(--md-sys-color-surface-5);
- transition:
- transform 0.3s,
- border 0.3s;
- transform-origin: center center;
- outline: 0px solid transparent;
- position:relative;
- }
-
- .feature-card a {
- text-decoration: none;
- color: var(--md-sys-color-on-surface);
- display: flex;
- flex-direction: column;
- width: 100%;
- height: 100%;
- }
-
- .feature-card .card-text {
- font-size: .875rem;
- }
-
- .feature-card:hover {
- cursor: pointer;
- transform: scale(1.08);
- box-shadow: var(--md-sys-elevation-2);
- }
-
- .card-title.text-primary {
- color: #000;
- }
-
- .home-card-icon {
- width: 3rem;
- height: 3rem;
- transform: translateY(-5px);
- }
-
- .favorite-icon {
- display: none !important;
- position: absolute;
- top: 10px;
- right: 10px;
- color: var(--md-sys-color-secondary);
- }
-
- #tool-icon {
- height: 100%;
- }
-
- #tool-text {
- margin: 0.0rem 0 0 1.25rem;
- }
-
- .card-title {
- margin-bottom: 1rem;
- font-size: 1.1rem;
- }
-
- /* Only show the favorite icons when the parent card is being hovered over */
- .feature-card:hover .favorite-icon {
- display: block !important;
- }
-
- .favorite-icon img {
- filter: brightness(0) invert(var(--md-theme-filter-color));
- }
-
- .favorite-icon:hover .material-symbols-rounded {
- transform: scale(1.2);
- }
-
- .favorite-icon .material-symbols-rounded.fill{
- color: #f5c000;
- }
-
- .jumbotron {
- padding: 3rem 3rem;
- /* Reduce vertical padding */
- }
-
- .lookatme {
- opacity: 1;
- position: relative;
- display: inline-block;
- }
-
- .lookatme::after {
- color: #e33100;
- text-shadow: 0 0 5px #e33100;
- /* in the html, the data-lookatme-text attribute must */
- /* contain the same text as the .lookatme element */
- content: attr(data-lookatme-text);
- padding: inherit;
- position: absolute;
- inset: 0 0 0 0;
- z-index: 1;
- /* 20 steps / 2 seconds = 10fps */
- -webkit-animation: 2s infinite Pulse steps(20);
- animation: 2s infinite Pulse steps(20);
- }
-
- @keyframes Pulse {
- from {
- opacity: 0;
- }
-
- 50% {
- opacity: 1;
- }
-
- to {
- opacity: 0;
- }
- }
-
- .update-notice {
- animation: scale 1s infinite alternate;
- }
-
- @keyframes scale {
- 0% {
- transform: scale(0.96);
- }
-
- 100% {
- transform: scale(1);
- }
- }
-
- .hidden {
- visibility: hidden;
- }
diff --git a/src/main/resources/static/css/navbar.css b/src/main/resources/static/css/navbar.css
index f9b3f3072..31099cdf2 100644
--- a/src/main/resources/static/css/navbar.css
+++ b/src/main/resources/static/css/navbar.css
@@ -162,6 +162,7 @@ html[dir="rtl"] .lang-dropdown-item-wrapper {
text-wrap: wrap;
word-break: break-word;
width: 80%;
+ font-size: large;
}
.close-icon {
@@ -476,6 +477,9 @@ html[dir="rtl"] .dropdown-menu[data-bs-popper] {
display: flex;
gap: 30px;
justify-content: center;
+ width: 140%;
+ position: relative;
+ left: -20%;
}
.feature-group {
diff --git a/src/main/resources/static/js/favourites.js b/src/main/resources/static/js/favourites.js
index 913c656b2..5aab52824 100644
--- a/src/main/resources/static/js/favourites.js
+++ b/src/main/resources/static/js/favourites.js
@@ -126,11 +126,7 @@ function addToFavorites(entryId) {
localStorage.setItem('favoritesList', JSON.stringify(favoritesList));
updateFavoritesDropdown();
updateFavoriteIcons();
- const currentPath = window.location.pathname;
- if (currentPath.includes('home-legacy')) {
- syncFavoritesLegacy();
- } else {
+
initializeCards();
- }
}
}
diff --git a/src/main/resources/static/js/homecard-legacy.js b/src/main/resources/static/js/homecard-legacy.js
deleted file mode 100644
index a43453f1c..000000000
--- a/src/main/resources/static/js/homecard-legacy.js
+++ /dev/null
@@ -1,266 +0,0 @@
-function filterCardsLegacy() {
- var input = document.getElementById('searchBar');
- var filter = input.value.toUpperCase();
-
- let featureGroups = document.querySelectorAll('.feature-group-legacy');
- const collapsedGroups = getCollapsedGroups();
-
- for (const featureGroup of featureGroups) {
- var cards = featureGroup.querySelectorAll('.feature-card');
-
- let groupMatchesFilter = false;
- for (var i = 0; i < cards.length; i++) {
- var card = cards[i];
- var title = card.querySelector('h5.card-title').innerText;
- var text = card.querySelector('p.card-text').innerText;
-
- // Get the navbar tags associated with the card
- var navbarItem = document.querySelector(`a.dropdown-item[href="${card.id}"]`);
- var navbarTags = navbarItem ? navbarItem.getAttribute('data-bs-tags') : '';
-
- var content = title + ' ' + text + ' ' + navbarTags;
-
- if (content.toUpperCase().indexOf(filter) > -1) {
- card.style.display = '';
- groupMatchesFilter = true;
- } else {
- card.style.display = 'none';
- }
- }
-
- if (!groupMatchesFilter) {
- featureGroup.style.display = 'none';
- } else {
- featureGroup.style.display = '';
- resetOrTemporarilyExpandGroup(featureGroup, filter, collapsedGroups);
- }
- }
-}
-
-function getCollapsedGroups() {
- return localStorage.getItem('collapsedGroups') ? JSON.parse(localStorage.getItem('collapsedGroups')) : [];
-}
-
-function resetOrTemporarilyExpandGroup(featureGroup, filterKeywords = '', collapsedGroups = []) {
- const shouldResetCollapse = filterKeywords.trim() === '';
- if (shouldResetCollapse) {
- // Resetting the group's expand/collapse to its original state (as in collapsed groups)
- const isCollapsed = collapsedGroups.indexOf(featureGroup.id) != -1;
- expandCollapseToggle(featureGroup, !isCollapsed);
- } else {
- // Temporarily expands feature group without affecting the actual/stored collapsed groups
- featureGroup.classList.remove('collapsed');
- featureGroup.querySelector('.header-expand-button').classList.remove('collapsed');
- }
-}
-
-function updateFavoritesSectionLegacy() {
- const favoritesContainer = document.getElementById('groupFavorites').querySelector('.feature-group-container');
- favoritesContainer.innerHTML = '';
- const cards = Array.from(document.querySelectorAll('.feature-card:not(.duplicate)'));
- const addedCardIds = new Set();
- let favoritesAmount = 0;
-
- cards.forEach((card) => {
- const favouritesList = JSON.parse(localStorage.getItem('favoritesList') || '[]');
-
- if (favouritesList.includes(card.id) && !addedCardIds.has(card.id)) {
- const duplicate = card.cloneNode(true);
- duplicate.classList.add('duplicate');
- favoritesContainer.appendChild(duplicate);
- addedCardIds.add(card.id);
- favoritesAmount++;
- }
- });
-
- if (favoritesAmount === 0) {
- document.getElementById('groupFavorites').style.display = 'none';
- } else {
- document.getElementById('groupFavorites').style.display = 'flex';
- }
- reorderCards(favoritesContainer);
-}
-
-function syncFavoritesLegacy() {
- const cards = Array.from(document.querySelectorAll('.feature-card'));
- cards.forEach((card) => {
- const isFavorite = localStorage.getItem(card.id) === 'favorite';
- const starIcon = card.querySelector('.favorite-icon span.material-symbols-rounded');
- if (starIcon) {
- if (isFavorite) {
- starIcon.classList.remove('no-fill');
- starIcon.classList.add('fill');
- card.classList.add('favorite');
- } else {
- starIcon.classList.remove('fill');
- starIcon.classList.add('no-fill');
- card.classList.remove('favorite');
- }
- }
- });
- updateFavoritesSectionLegacy();
- updateFavoritesDropdown();
- filterCardsLegacy();
-}
-
-function reorderCards(container) {
- var cards = Array.from(container.querySelectorAll('.feature-card'));
- cards.forEach(function (card) {
- container.removeChild(card);
- });
- cards.sort(function (a, b) {
- var aIsFavorite = localStorage.getItem(a.id) === 'favorite';
- var bIsFavorite = localStorage.getItem(b.id) === 'favorite';
- if (a.id === 'update-link') {
- return -1;
- }
- if (b.id === 'update-link') {
- return 1;
- }
-
- if (aIsFavorite && !bIsFavorite) {
- return -1;
- } else if (!aIsFavorite && bIsFavorite) {
- return 1;
- } else {
- return a.id > b.id;
- }
- });
- cards.forEach(function (card) {
- container.appendChild(card);
- });
-}
-
-function reorderAllCards() {
- const containers = Array.from(document.querySelectorAll('.feature-group-container'));
- containers.forEach(function (container) {
- reorderCards(container);
- });
-}
-
-function initializeCardsLegacy() {
- reorderAllCards();
- updateFavoritesSectionLegacy();
- updateFavoritesDropdown();
- filterCardsLegacy();
-}
-
-function showFavoritesOnly() {
- const groups = Array.from(document.querySelectorAll('.feature-group-legacy'));
- if (localStorage.getItem('favoritesOnly') === 'true') {
- groups.forEach((group) => {
- if (group.id !== 'groupFavorites') {
- group.style.display = 'none';
- }
- });
- } else {
- groups.forEach((group) => {
- if (group.id !== 'groupFavorites') {
- group.style.display = 'flex';
- }
- });
- }
-}
-
-function toggleFavoritesOnly() {
- if (localStorage.getItem('favoritesOnly') === 'true') {
- localStorage.setItem('favoritesOnly', 'false');
- } else {
- localStorage.setItem('favoritesOnly', 'true');
- }
- showFavoritesOnly();
-}
-
-// Expands a feature group on true, collapses it on false and toggles state on null.
-function expandCollapseToggle(group, expand = null) {
- if (expand === null) {
- group.classList.toggle('collapsed');
- group.querySelector('.header-expand-button').classList.toggle('collapsed');
- } else if (expand) {
- group.classList.remove('collapsed');
- group.querySelector('.header-expand-button').classList.remove('collapsed');
- } else {
- group.classList.add('collapsed');
- group.querySelector('.header-expand-button').classList.add('collapsed');
- }
-
- const collapsed = localStorage.getItem('collapsedGroups') ? JSON.parse(localStorage.getItem('collapsedGroups')) : [];
- const groupIndex = collapsed.indexOf(group.id);
-
- if (group.classList.contains('collapsed')) {
- if (groupIndex === -1) {
- collapsed.push(group.id);
- }
- } else {
- if (groupIndex !== -1) {
- collapsed.splice(groupIndex, 1);
- }
- }
-
- localStorage.setItem('collapsedGroups', JSON.stringify(collapsed));
-}
-
-function expandCollapseAll(expandAll) {
- const groups = Array.from(document.querySelectorAll('.feature-group-legacy'));
- groups.forEach((group) => {
- expandCollapseToggle(group, expandAll);
- });
-}
-
-window.onload = function () {
- initializeCardsLegacy();
- syncFavoritesLegacy(); // Ensure everything is in sync on page load
-};
-
-document.addEventListener('DOMContentLoaded', function () {
- const materialIcons = new FontFaceObserver('Material Symbols Rounded');
-
- materialIcons
- .load()
- .then(() => {
- document.querySelectorAll('.feature-card.hidden').forEach((el) => {
- el.classList.remove('hidden');
- });
- })
- .catch(() => {
- console.error('Material Symbols Rounded font failed to load.');
- });
-
- Array.from(document.querySelectorAll('.feature-group-header-legacy')).forEach((header) => {
- const parent = header.parentNode;
- const container = header.parentNode.querySelector('.feature-group-container');
- if (parent.id !== 'groupFavorites') {
- // container.style.maxHeight = container.scrollHeight + 'px';
- }
- header.onclick = () => {
- expandCollapseToggle(parent);
- };
- });
-
- const collapsed = localStorage.getItem('collapsedGroups') ? JSON.parse(localStorage.getItem('collapsedGroups')) : [];
- const groupsArray = Array.from(document.querySelectorAll('.feature-group-legacy'));
-
- groupsArray.forEach((group) => {
- if (collapsed.indexOf(group.id) !== -1) {
- expandCollapseToggle(group, false);
- }
- });
-
- // Necessary in order to not fire the transition animation on page load, which looks wrong.
- // The timeout isn't doing anything visible to the user, so it's not making the page load look slower.
- setTimeout(() => {
- groupsArray.forEach((group) => {
- const container = group.querySelector('.feature-group-container');
- container.classList.add('animated-group');
- });
- }, 500);
-
- Array.from(document.querySelectorAll('.feature-group-header')).forEach((header) => {
- const parent = header.parentNode;
- header.onclick = () => {
- expandCollapseToggle(parent);
- };
- });
-
- showFavoritesOnly();
-});
diff --git a/src/main/resources/static/js/pages/home.js b/src/main/resources/static/js/pages/home.js
index 6c48fe81d..d474e9439 100644
--- a/src/main/resources/static/js/pages/home.js
+++ b/src/main/resources/static/js/pages/home.js
@@ -4,10 +4,21 @@ document.addEventListener('DOMContentLoaded', function () {
if (window.analyticsPromptBoolean) {
const analyticsModal = new bootstrap.Modal(document.getElementById('analyticsModal'));
analyticsModal.show();
+
+ let retryCount = 0;
+function hideCookieBanner() {
+ const cookieBanner = document.querySelector('#cc-main');
+ if (cookieBanner && cookieBanner.offsetHeight > 0) {
+ cookieBanner.style.display = "none";
+ } else if (retryCount < 20) {
+ retryCount++;
+ setTimeout(hideCookieBanner, 100);
+ }
+}
+hideCookieBanner();
}
});
-/*]]>*/
-function setAnalytics(enabled) {
+/*]]>*/function setAnalytics(enabled) {
fetchWithCsrf('api/v1/settings/update-enable-analytics', {
method: 'POST',
headers: {
@@ -19,6 +30,15 @@ function setAnalytics(enabled) {
if (response.status === 200) {
console.log('Analytics setting updated successfully');
bootstrap.Modal.getInstance(document.getElementById('analyticsModal')).hide();
+
+ if (typeof CookieConsent !== "undefined") {
+ if (enabled) {
+ CookieConsent.acceptCategory(['analytics']);
+ } else {
+ CookieConsent.acceptCategory([]);
+ }
+ }
+
} else if (response.status === 208) {
console.log('Analytics setting has already been set. Please edit /config/settings.yml to change it.', response);
alert('Analytics setting has already been set. Please edit /config/settings.yml to change it.');
@@ -35,10 +55,6 @@ function setAnalytics(enabled) {
updateFavoriteIcons();
const contentPath = /*[[${@contextPath}]]*/ '';
-const defaultView = localStorage.getItem('defaultView') || 'home'; // Default to "home"
-if (defaultView === 'home-legacy') {
- window.location.href = contentPath + 'home-legacy'; // Redirect to legacy view
-}
document.addEventListener('DOMContentLoaded', function () {
const surveyVersion = '3.0';
diff --git a/src/main/resources/static/js/pipeline.js b/src/main/resources/static/js/pipeline.js
index 7633a6bbd..c44779c1f 100644
--- a/src/main/resources/static/js/pipeline.js
+++ b/src/main/resources/static/js/pipeline.js
@@ -299,21 +299,42 @@ document.getElementById("addOperationBtn").addEventListener("click", function ()
}
}
- listItem.innerHTML = `
-