Merge remote-tracking branch 'origin/main' into feature/react-overhaul

This commit is contained in:
Anthony Stirling
2025-07-11 15:14:11 +01:00
173 changed files with 9649 additions and 3214 deletions
+6 -1
View File
@@ -62,7 +62,7 @@ dependencies {
exclude group: 'com.google.code.gson', module: 'gson'
}
implementation 'org.apache.pdfbox:jbig2-imageio:3.0.4'
implementation 'com.opencsv:opencsv:5.11.1' // https://mvnrepository.com/artifact/com.opencsv/opencsv
implementation 'com.opencsv:opencsv:5.11.2' // https://mvnrepository.com/artifact/com.opencsv/opencsv
// Batik
implementation 'org.apache.xmlgraphics:batik-all:1.19'
@@ -146,5 +146,10 @@ bootJar {
}
}
// Configure main class for Spring Boot
springBoot {
mainClass = 'stirling.software.SPDF.SPDFApplication'
}
bootJar.dependsOn ':common:jar'
bootJar.dependsOn ':proprietary:jar'
@@ -21,6 +21,8 @@ public class EndpointConfiguration {
private final ApplicationProperties applicationProperties;
private Map<String, Boolean> endpointStatuses = new ConcurrentHashMap<>();
private Map<String, Set<String>> endpointGroups = new ConcurrentHashMap<>();
private Set<String> disabledGroups = new HashSet<>();
private Map<String, Set<String>> endpointAlternatives = new ConcurrentHashMap<>();
private final boolean runningProOrHigher;
public EndpointConfiguration(
@@ -34,13 +36,14 @@ public class EndpointConfiguration {
public void enableEndpoint(String endpoint) {
endpointStatuses.put(endpoint, true);
log.debug("Enabled endpoint: {}", endpoint);
}
public void disableEndpoint(String endpoint) {
if (!endpointStatuses.containsKey(endpoint) || endpointStatuses.get(endpoint) != false) {
log.debug("Disabling {}", endpoint);
endpointStatuses.put(endpoint, false);
if (!Boolean.FALSE.equals(endpointStatuses.get(endpoint))) {
log.debug("Disabling endpoint: {}", endpoint);
}
endpointStatuses.put(endpoint, false);
}
public Map<String, Boolean> getEndpointStatuses() {
@@ -48,25 +51,96 @@ public class EndpointConfiguration {
}
public boolean isEndpointEnabled(String endpoint) {
String original = endpoint;
if (endpoint.startsWith("/")) {
endpoint = endpoint.substring(1);
}
return endpointStatuses.getOrDefault(endpoint, true);
}
public boolean isGroupEnabled(String group) {
Set<String> endpoints = endpointGroups.get(group);
if (endpoints == null || endpoints.isEmpty()) {
log.debug("Group '{}' does not exist or has no endpoints", group);
// Rule 1: Explicit flag wins - if disabled via disableEndpoint(), stay disabled
Boolean explicitStatus = endpointStatuses.get(endpoint);
if (Boolean.FALSE.equals(explicitStatus)) {
log.debug("isEndpointEnabled('{}') -> false (explicitly disabled)", original);
return false;
}
for (String endpoint : endpoints) {
if (!isEndpointEnabled(endpoint)) {
// Rule 2: Functional-group override - check if endpoint belongs to any disabled functional
// group
for (String group : endpointGroups.keySet()) {
if (disabledGroups.contains(group) && endpointGroups.get(group).contains(endpoint)) {
// Skip tool groups (qpdf, OCRmyPDF, Ghostscript, LibreOffice, etc.)
if (!isToolGroup(group)) {
log.debug(
"isEndpointEnabled('{}') -> false (functional group '{}' disabled)",
original,
group);
return false;
}
}
}
// Rule 3: Tool-group fallback - check if at least one alternative tool group is enabled
Set<String> alternatives = endpointAlternatives.get(endpoint);
if (alternatives != null && !alternatives.isEmpty()) {
boolean hasEnabledToolGroup =
alternatives.stream()
.anyMatch(toolGroup -> !disabledGroups.contains(toolGroup));
log.debug(
"isEndpointEnabled('{}') -> {} (tool groups check)",
original,
hasEnabledToolGroup);
return hasEnabledToolGroup;
}
// Rule 4: Single-dependency check - if no alternatives defined, check if endpoint belongs
// to any disabled tool groups
for (String group : endpointGroups.keySet()) {
if (isToolGroup(group)
&& disabledGroups.contains(group)
&& endpointGroups.get(group).contains(endpoint)) {
log.debug(
"isEndpointEnabled('{}') -> false (single tool group '{}' disabled, no alternatives)",
original,
group);
return false;
}
}
// Default: enabled if not explicitly disabled
boolean enabled = !Boolean.FALSE.equals(explicitStatus);
log.debug("isEndpointEnabled('{}') -> {} (default)", original, enabled);
return enabled;
}
public boolean isGroupEnabled(String group) {
// Rule 1: If group is explicitly disabled, it stays disabled
if (disabledGroups.contains(group)) {
log.debug("isGroupEnabled('{}') -> false (explicitly disabled)", group);
return false;
}
Set<String> endpoints = endpointGroups.get(group);
if (endpoints == null || endpoints.isEmpty()) {
log.debug("isGroupEnabled('{}') -> false (no endpoints)", group);
return false;
}
// Rule 2: For functional groups, check if all endpoints are enabled
// Rule 3: For tool groups, they're enabled unless explicitly disabled (handled above)
if (isToolGroup(group)) {
log.debug("isGroupEnabled('{}') -> true (tool group not disabled)", group);
return true;
}
// For functional groups, check each endpoint individually
for (String endpoint : endpoints) {
if (!isEndpointEnabledDirectly(endpoint)) {
log.debug(
"isGroupEnabled('{}') -> false (endpoint '{}' disabled)", group, endpoint);
return false;
}
}
log.debug("isGroupEnabled('{}') -> true (all endpoints enabled)", group);
return true;
}
@@ -74,38 +148,84 @@ public class EndpointConfiguration {
endpointGroups.computeIfAbsent(group, k -> new HashSet<>()).add(endpoint);
}
public void enableGroup(String group) {
Set<String> endpoints = endpointGroups.get(group);
if (endpoints != null) {
for (String endpoint : endpoints) {
enableEndpoint(endpoint);
}
}
public void addEndpointAlternative(String endpoint, String toolGroup) {
endpointAlternatives.computeIfAbsent(endpoint, k -> new HashSet<>()).add(toolGroup);
}
public void disableGroup(String group) {
Set<String> endpoints = endpointGroups.get(group);
if (endpoints != null) {
for (String endpoint : endpoints) {
disableEndpoint(endpoint);
if (disabledGroups.add(group)) {
if (isToolGroup(group)) {
log.debug(
"Disabling tool group: {} (endpoints with alternatives remain available)",
group);
} else {
log.debug(
"Disabling functional group: {} (will disable all endpoints in group)",
group);
}
}
// Only cascade to endpoints for *functional* groups
if (!isToolGroup(group)) {
Set<String> endpoints = endpointGroups.get(group);
if (endpoints != null) {
endpoints.forEach(this::disableEndpoint);
}
}
}
public void enableGroup(String group) {
if (disabledGroups.remove(group)) {
log.debug("Enabling group: {}", group);
}
Set<String> endpoints = endpointGroups.get(group);
if (endpoints != null) {
endpoints.forEach(this::enableEndpoint);
}
}
public Set<String> getDisabledGroups() {
return new HashSet<>(disabledGroups);
}
public void logDisabledEndpointsSummary() {
List<String> disabledList =
endpointStatuses.entrySet().stream()
.filter(entry -> !entry.getValue()) // only get disabled endpoints (value
// is false)
.map(Map.Entry::getKey)
// Get all unique endpoints across all groups
Set<String> allEndpoints =
endpointGroups.values().stream()
.flatMap(Set::stream)
.collect(java.util.stream.Collectors.toSet());
// Check which endpoints are actually disabled (functionally unavailable)
List<String> functionallyDisabledEndpoints =
allEndpoints.stream()
.filter(endpoint -> !isEndpointEnabled(endpoint))
.sorted()
.toList();
if (!disabledList.isEmpty()) {
// Separate tool groups from functional groups
List<String> disabledToolGroups =
disabledGroups.stream().filter(this::isToolGroup).sorted().toList();
List<String> disabledFunctionalGroups =
disabledGroups.stream().filter(group -> !isToolGroup(group)).sorted().toList();
if (!disabledToolGroups.isEmpty()) {
log.info(
"Disabled tool groups: {} (endpoints may have alternative implementations)",
String.join(", ", disabledToolGroups));
}
if (!disabledFunctionalGroups.isEmpty()) {
log.info("Disabled functional groups: {}", String.join(", ", disabledFunctionalGroups));
}
if (!functionallyDisabledEndpoints.isEmpty()) {
log.info(
"Total disabled endpoints: {}. Disabled endpoints: {}",
disabledList.size(),
String.join(", ", disabledList));
functionallyDisabledEndpoints.size(),
String.join(", ", functionallyDisabledEndpoints));
} else if (!disabledToolGroups.isEmpty()) {
log.info(
"No endpoints disabled despite missing tools - fallback implementations available");
}
}
@@ -212,8 +332,6 @@ public class EndpointConfiguration {
// Unoconvert
addEndpointToGroup("Unoconvert", "file-to-pdf");
addEndpointToGroup("tesseract", "ocr-pdf");
// Java
addEndpointToGroup("Java", "merge-pdfs");
addEndpointToGroup("Java", "remove-pages");
@@ -254,6 +372,7 @@ public class EndpointConfiguration {
addEndpointToGroup("Java", "remove-image-pdf");
addEndpointToGroup("Java", "pdf-to-markdown");
addEndpointToGroup("Java", "add-attachments");
addEndpointToGroup("Java", "compress-pdf");
// Javascript
addEndpointToGroup("Javascript", "pdf-organizer");
@@ -261,8 +380,42 @@ public class EndpointConfiguration {
addEndpointToGroup("Javascript", "compare");
addEndpointToGroup("Javascript", "adjust-contrast");
// qpdf dependent endpoints
/* qpdf */
addEndpointToGroup("qpdf", "repair");
addEndpointToGroup("qpdf", "compress-pdf");
/* Ghostscript */
addEndpointToGroup("Ghostscript", "repair");
addEndpointToGroup("Ghostscript", "compress-pdf");
/* tesseract */
addEndpointToGroup("tesseract", "ocr-pdf");
/* OCRmyPDF */
addEndpointToGroup("OCRmyPDF", "ocr-pdf");
// Multi-tool endpoints - endpoints that can be handled by multiple tools
addEndpointAlternative("repair", "qpdf");
addEndpointAlternative("repair", "Ghostscript");
addEndpointAlternative("compress-pdf", "qpdf");
addEndpointAlternative("compress-pdf", "Ghostscript");
addEndpointAlternative("compress-pdf", "Java");
addEndpointAlternative("ocr-pdf", "tesseract");
addEndpointAlternative("ocr-pdf", "OCRmyPDF");
// file-to-pdf has multiple implementations
addEndpointAlternative("file-to-pdf", "LibreOffice");
addEndpointAlternative("file-to-pdf", "Python");
addEndpointAlternative("file-to-pdf", "Unoconvert");
// pdf-to-html and pdf-to-markdown can use either LibreOffice or Pdftohtml
addEndpointAlternative("pdf-to-html", "LibreOffice");
addEndpointAlternative("pdf-to-html", "Pdftohtml");
addEndpointAlternative("pdf-to-markdown", "Pdftohtml");
// markdown-to-pdf can use either Weasyprint or Java
addEndpointAlternative("markdown-to-pdf", "Weasyprint");
addEndpointAlternative("markdown-to-pdf", "Java");
// Weasyprint dependent endpoints
addEndpointToGroup("Weasyprint", "html-to-pdf");
@@ -304,4 +457,43 @@ public class EndpointConfiguration {
public Set<String> getEndpointsForGroup(String group) {
return endpointGroups.getOrDefault(group, new HashSet<>());
}
private boolean isToolGroup(String group) {
return "qpdf".equals(group)
|| "OCRmyPDF".equals(group)
|| "Ghostscript".equals(group)
|| "LibreOffice".equals(group)
|| "tesseract".equals(group)
|| "CLI".equals(group)
|| "Python".equals(group)
|| "OpenCV".equals(group)
|| "Unoconvert".equals(group)
|| "Java".equals(group)
|| "Javascript".equals(group)
|| "Weasyprint".equals(group)
|| "Pdftohtml".equals(group);
}
private boolean isEndpointEnabledDirectly(String endpoint) {
if (endpoint.startsWith("/")) {
endpoint = endpoint.substring(1);
}
// Check explicit disable flag
Boolean explicitStatus = endpointStatuses.get(endpoint);
if (Boolean.FALSE.equals(explicitStatus)) {
return false;
}
// Check if endpoint belongs to any disabled functional group
for (String group : endpointGroups.keySet()) {
if (disabledGroups.contains(group) && endpointGroups.get(group).contains(endpoint)) {
if (!isToolGroup(group)) {
return false;
}
}
}
return true;
}
}
@@ -34,6 +34,8 @@ public class ExternalAppDepConfig {
new HashMap<>() {
{
put("gs", List.of("Ghostscript"));
put("ocrmypdf", List.of("OCRmyPDF"));
put("soffice", List.of("LibreOffice"));
put(weasyprintPath, List.of("Weasyprint"));
put("pdftohtml", List.of("Pdftohtml"));
@@ -109,6 +111,8 @@ public class ExternalAppDepConfig {
@PostConstruct
public void checkDependencies() {
// Check core dependencies
checkDependencyAndDisableGroup("gs");
checkDependencyAndDisableGroup("ocrmypdf");
checkDependencyAndDisableGroup("tesseract");
checkDependencyAndDisableGroup("soffice");
checkDependencyAndDisableGroup("qpdf");
@@ -26,8 +26,6 @@ public class WebMvcConfig implements WebMvcConfigurer {
registry.addResourceHandler("/**")
.addResourceLocations(
"file:" + InstallationPathConfig.getStaticPath(), "classpath:/static/");
registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/");
registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/");
// .setCachePeriod(0); // Optional: disable caching
}
}
@@ -35,7 +35,9 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.api.general.MergePdfsRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.GeneralUtils;
import stirling.software.common.util.PdfErrorUtils;
import stirling.software.common.util.WebResponseUtils;
@RestController
@@ -146,7 +148,7 @@ public class MergeController {
try (PDDocument doc = pdfDocumentFactory.load(file)) {
pageIndex += doc.getNumberOfPages();
} catch (IOException e) {
log.error("Error loading document for TOC generation", e);
ExceptionUtils.logException("document loading for TOC generation", e);
pageIndex++; // Increment by at least one if we can't determine page count
}
}
@@ -189,8 +191,17 @@ public class MergeController {
mergedTempFile = Files.createTempFile("merged-", ".pdf").toFile();
mergerUtility.setDestinationFileName(mergedTempFile.getAbsolutePath());
mergerUtility.mergeDocuments(
pdfDocumentFactory.getStreamCacheFunction(totalSize)); // Merge the documents
try {
mergerUtility.mergeDocuments(
pdfDocumentFactory.getStreamCacheFunction(
totalSize)); // Merge the documents
} catch (IOException e) {
ExceptionUtils.logException("PDF merge", e);
if (PdfErrorUtils.isCorruptedPdfError(e)) {
throw ExceptionUtils.createMultiplePdfCorruptedException(e);
}
throw e;
}
// Load the merged PDF document
mergedDocument = pdfDocumentFactory.load(mergedTempFile);
@@ -229,7 +240,11 @@ public class MergeController {
baos, mergedFileName); // Return the modified PDF
} catch (Exception ex) {
log.error("Error in merge pdf process", ex);
if (ex instanceof IOException && PdfErrorUtils.isCorruptedPdfError((IOException) ex)) {
log.warn("Corrupted PDF detected in merge pdf process: {}", ex.getMessage());
} else {
log.error("Error in merge pdf process", ex);
}
throw ex;
} finally {
if (mergedDocument != null) {
@@ -25,6 +25,7 @@ import stirling.software.SPDF.model.SortTypes;
import stirling.software.SPDF.model.api.PDFWithPageNums;
import stirling.software.SPDF.model.api.general.RearrangePagesRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.GeneralUtils;
import stirling.software.common.util.WebResponseUtils;
@@ -288,8 +289,8 @@ public class RearrangePagesPDFController {
.replaceFirst("[.][^.]+$", "")
+ "_rearranged.pdf");
} catch (IOException e) {
log.error("Failed rearranging documents", e);
return null;
ExceptionUtils.logException("document rearrangement", e);
throw e;
}
}
}
@@ -20,6 +20,7 @@ import lombok.RequiredArgsConstructor;
import stirling.software.SPDF.model.api.general.RotatePDFRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.WebResponseUtils;
@RestController
@@ -43,7 +44,8 @@ public class RotationController {
// Validate the angle is a multiple of 90
if (angle % 90 != 0) {
throw new IllegalArgumentException("Angle must be a multiple of 90");
throw ExceptionUtils.createIllegalArgumentException(
"error.angleNotMultipleOf90", "Angle must be a multiple of 90");
}
// Load the PDF document
@@ -27,6 +27,7 @@ import lombok.RequiredArgsConstructor;
import stirling.software.SPDF.model.api.general.ScalePagesRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.WebResponseUtils;
@RestController
@@ -120,9 +121,7 @@ public class ScalePagesController {
return sizeMap.get(targetPDRectangle);
}
throw new IllegalArgumentException(
"Invalid PDRectangle. It must be one of the following: A0, A1, A2, A3, A4, A5, A6,"
+ " LETTER, LEGAL, KEEP");
throw ExceptionUtils.createInvalidPageSizeException(targetPDRectangle);
}
private Map<String, PDRectangle> getSizeMap() {
@@ -29,6 +29,7 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.api.PDFWithPageNums;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.WebResponseUtils;
@RestController
@@ -71,7 +72,7 @@ public class SplitPDFController {
pageNumbers.add(totalPages - 1);
}
log.info(
log.debug(
"Splitting PDF into pages: {}",
pageNumbers.stream().map(String::valueOf).collect(Collectors.joining(",")));
@@ -84,7 +85,7 @@ public class SplitPDFController {
for (int i = previousPageNumber; i <= splitPoint; i++) {
PDPage page = document.getPage(i);
splitDocument.addPage(page);
log.info("Adding page {} to split document", i);
log.debug("Adding page {} to split document", i);
}
previousPageNumber = splitPoint + 1;
@@ -96,7 +97,7 @@ public class SplitPDFController {
splitDocumentsBoas.add(baos);
} catch (Exception e) {
log.error("Failed splitting documents and saving them", e);
ExceptionUtils.logException("document splitting and saving", e);
throw e;
}
}
@@ -122,14 +123,14 @@ public class SplitPDFController {
zipOut.write(pdf);
zipOut.closeEntry();
log.info("Wrote split document {} to zip file", fileName);
log.debug("Wrote split document {} to zip file", fileName);
}
} catch (Exception e) {
log.error("Failed writing to zip", e);
throw e;
}
log.info("Successfully created zip file with split documents: {}", zipFile.toString());
log.debug("Successfully created zip file with split documents: {}", zipFile.toString());
byte[] data = Files.readAllBytes(zipFile);
Files.deleteIfExists(zipFile);
@@ -35,6 +35,7 @@ import stirling.software.SPDF.model.api.SplitPdfByChaptersRequest;
import stirling.software.common.model.PdfMetadata;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.service.PdfMetadataService;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.WebResponseUtils;
@RestController
@@ -131,7 +132,8 @@ public class SplitPdfByChaptersController {
Integer bookmarkLevel =
request.getBookmarkLevel(); // levels start from 0 (top most bookmarks)
if (bookmarkLevel < 0) {
throw new IllegalArgumentException("Invalid bookmark level");
throw ExceptionUtils.createIllegalArgumentException(
"error.invalidArgument", "Invalid argument: {0}", "bookmark level");
}
sourceDocument = pdfDocumentFactory.load(file);
@@ -139,7 +141,8 @@ public class SplitPdfByChaptersController {
if (outline == null) {
log.warn("No outline found for {}", file.getOriginalFilename());
throw new IllegalArgumentException("No outline found");
throw ExceptionUtils.createIllegalArgumentException(
"error.pdfBookmarksNotFound", "No PDF bookmarks/outline found in document");
}
List<Bookmark> bookmarks = new ArrayList<>();
try {
@@ -156,7 +159,7 @@ public class SplitPdfByChaptersController {
Bookmark lastBookmark = bookmarks.get(bookmarks.size() - 1);
} catch (Exception e) {
log.error("Unable to extract outline items", e);
ExceptionUtils.logException("outline extraction", e);
return ResponseEntity.internalServerError()
.body("Unable to extract outline items".getBytes());
}
@@ -252,7 +255,7 @@ public class SplitPdfByChaptersController {
zipOut.write(pdf);
zipOut.closeEntry();
log.info("Wrote split document {} to zip file", fileName);
log.debug("Wrote split document {} to zip file", fileName);
}
} catch (Exception e) {
log.error("Failed writing to zip", e);
@@ -280,7 +283,7 @@ public class SplitPdfByChaptersController {
i++) {
PDPage page = sourceDocument.getPage(i);
splitDocument.addPage(page);
log.info("Adding page {} to split document", i);
log.debug("Adding page {} to split document", i);
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (includeMetadata) {
@@ -291,7 +294,7 @@ public class SplitPdfByChaptersController {
splitDocumentsBoas.add(baos);
} catch (Exception e) {
log.error("Failed splitting documents and saving them", e);
ExceptionUtils.logException("document splitting and saving", e);
throw e;
}
}
@@ -26,6 +26,7 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.api.general.SplitPdfBySizeOrCountRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.GeneralUtils;
import stirling.software.common.util.WebResponseUtils;
@@ -96,13 +97,15 @@ public class SplitPdfBySizeController {
handleSplitByDocCount(sourceDocument, documentCount, zipOut, filename);
} else {
log.error("Invalid split type: {}", type);
throw new IllegalArgumentException(
"Invalid argument for split type: " + type);
throw ExceptionUtils.createIllegalArgumentException(
"error.invalidArgument",
"Invalid argument: {0}",
"split type: " + type);
}
log.debug("PDF splitting completed successfully");
} catch (Exception e) {
log.error("Error loading or processing PDF document", e);
ExceptionUtils.logException("PDF document loading or processing", e);
throw e;
}
} catch (IOException e) {
@@ -111,7 +114,7 @@ public class SplitPdfBySizeController {
}
} catch (Exception e) {
log.error("Exception during PDF splitting process", e);
ExceptionUtils.logException("PDF splitting process", e);
throw e; // Re-throw to ensure proper error response
} finally {
try {
@@ -275,8 +278,8 @@ public class SplitPdfBySizeController {
currentDoc = pdfDocumentFactory.createNewDocumentBasedOnOldDocument(sourceDocument);
log.debug("Successfully created initial output document");
} catch (Exception e) {
log.error("Error creating initial output document", e);
throw new IOException("Failed to create initial output document", e);
ExceptionUtils.logException("initial output document creation", e);
throw ExceptionUtils.createFileProcessingException("split", e);
}
int fileIndex = 1;
@@ -295,7 +298,7 @@ public class SplitPdfBySizeController {
log.debug("Successfully added page {} to current document", pageIndex);
} catch (Exception e) {
log.error("Error adding page {} to current document", pageIndex, e);
throw new IOException("Failed to add page to document", e);
throw ExceptionUtils.createFileProcessingException("split", e);
}
currentPageCount++;
@@ -320,7 +323,7 @@ public class SplitPdfBySizeController {
log.debug("Successfully created new document");
} catch (Exception e) {
log.error("Error creating new document for next part", e);
throw new IOException("Failed to create new document", e);
throw ExceptionUtils.createFileProcessingException("split", e);
}
currentPageCount = 0;
@@ -329,7 +332,7 @@ public class SplitPdfBySizeController {
}
} catch (Exception e) {
log.error("Error iterating through pages", e);
throw new IOException("Failed to iterate through pages", e);
throw ExceptionUtils.createFileProcessingException("split", e);
}
// Add the last document if it contains any pages
@@ -351,7 +354,7 @@ public class SplitPdfBySizeController {
}
} catch (Exception e) {
log.error("Error checking or saving final document", e);
throw new IOException("Failed to process final document", e);
throw ExceptionUtils.createFileProcessingException("split", e);
} finally {
try {
log.debug("Closing final document");
@@ -390,7 +393,7 @@ public class SplitPdfBySizeController {
log.debug("Successfully created document {} of {}", i + 1, documentCount);
} catch (Exception e) {
log.error("Error creating document {} of {}", i + 1, documentCount, e);
throw new IOException("Failed to create document", e);
throw ExceptionUtils.createFileProcessingException("split", e);
}
int pagesToAdd = pagesPerDocument + (i < extraPages ? 1 : 0);
@@ -408,7 +411,7 @@ public class SplitPdfBySizeController {
currentPageIndex++;
} catch (Exception e) {
log.error("Error adding page {} to document {}", j + 1, i + 1, e);
throw new IOException("Failed to add page to document", e);
throw ExceptionUtils.createFileProcessingException("split", e);
}
}
@@ -437,7 +440,7 @@ public class SplitPdfBySizeController {
log.debug("Successfully saved document part {} ({} bytes)", index, outStream.size());
} catch (Exception e) {
log.error("Error saving document part {} to byte array", index, e);
throw new IOException("Failed to save document to byte array", e);
throw ExceptionUtils.createFileProcessingException("split", e);
}
try {
@@ -465,7 +468,7 @@ public class SplitPdfBySizeController {
log.debug("Successfully added document part {} to ZIP", index);
} catch (Exception e) {
log.error("Error adding document part {} to ZIP", index, e);
throw new IOException("Failed to add document to ZIP file", e);
throw ExceptionUtils.createFileProcessingException("split", e);
}
}
}
@@ -70,17 +70,17 @@ public class ToSinglePageController {
float yOffset = totalHeight;
// For each page, copy its content to the new page at the correct offset
int pageIndex = 0;
for (PDPage page : sourceDocument.getPages()) {
PDFormXObject form =
layerUtility.importPageAsForm(
sourceDocument, sourceDocument.getPages().indexOf(page));
PDFormXObject form = layerUtility.importPageAsForm(sourceDocument, pageIndex);
AffineTransform af =
AffineTransform.getTranslateInstance(
0, yOffset - page.getMediaBox().getHeight());
layerUtility.wrapInSaveRestore(newPage);
String defaultLayerName = "Layer" + sourceDocument.getPages().indexOf(page);
String defaultLayerName = "Layer" + pageIndex;
layerUtility.appendFormAsLayer(newPage, form, af, defaultLayerName);
yOffset -= page.getMediaBox().getHeight();
pageIndex++;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
@@ -17,6 +17,7 @@ import stirling.software.common.configuration.RuntimePathConfig;
import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.model.api.converters.HTMLToPdfRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.FileToPdf;
import stirling.software.common.util.TempFileManager;
import stirling.software.common.util.WebResponseUtils;
@@ -46,14 +47,14 @@ public class ConvertHtmlToPDF {
MultipartFile fileInput = request.getFileInput();
if (fileInput == null) {
throw new IllegalArgumentException(
"Please provide an HTML or ZIP file for conversion.");
throw ExceptionUtils.createHtmlFileRequiredException();
}
String originalFilename = Filenames.toSimpleFileName(fileInput.getOriginalFilename());
if (originalFilename == null
|| (!originalFilename.endsWith(".html") && !originalFilename.endsWith(".zip"))) {
throw new IllegalArgumentException("File must be either .html or .zip format.");
throw ExceptionUtils.createIllegalArgumentException(
"error.fileFormatRequired", "File must be in {0} format", ".html or .zip");
}
boolean disableSanitize =
@@ -34,6 +34,7 @@ import stirling.software.SPDF.model.api.converters.ConvertToImageRequest;
import stirling.software.SPDF.model.api.converters.ConvertToPdfRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.CheckProgramInstall;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.GeneralUtils;
import stirling.software.common.util.PdfUtils;
import stirling.software.common.util.ProcessExecutor;
@@ -104,7 +105,7 @@ public class ConvertImgPDFController {
log.error("resultant bytes for {} is null, error converting ", filename);
}
if ("webp".equalsIgnoreCase(imageFormat) && !CheckProgramInstall.isPythonAvailable()) {
throw new IOException("Python is not installed. Required for WebP conversion.");
throw ExceptionUtils.createPythonRequiredForWebpException();
} else if ("webp".equalsIgnoreCase(imageFormat)
&& CheckProgramInstall.isPythonAvailable()) {
// Write the output stream to a temp file
@@ -27,6 +27,7 @@ import stirling.software.common.configuration.RuntimePathConfig;
import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.model.api.GeneralFile;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.FileToPdf;
import stirling.software.common.util.TempFileManager;
import stirling.software.common.util.WebResponseUtils;
@@ -55,12 +56,14 @@ public class ConvertMarkdownToPdf {
MultipartFile fileInput = generalFile.getFileInput();
if (fileInput == null) {
throw new IllegalArgumentException("Please provide a Markdown file for conversion.");
throw ExceptionUtils.createIllegalArgumentException(
"error.fileFormatRequired", "File must be in {0} format", "Markdown");
}
String originalFilename = Filenames.toSimpleFileName(fileInput.getOriginalFilename());
if (originalFilename == null || !originalFilename.endsWith(".md")) {
throw new IllegalArgumentException("File must be in .md format.");
throw ExceptionUtils.createIllegalArgumentException(
"error.fileFormatRequired", "File must be in {0} format", ".md");
}
// Convert Markdown to HTML using CommonMark
@@ -67,6 +67,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.api.converters.PdfToPdfARequest;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.ProcessExecutor;
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
import stirling.software.common.util.WebResponseUtils;
@@ -90,7 +91,7 @@ public class ConvertPDFToPDFA {
// Validate input file type
if (!"application/pdf".equals(inputFile.getContentType())) {
log.error("Invalid input file type: {}", inputFile.getContentType());
throw new IllegalArgumentException("Input file must be a PDF");
throw ExceptionUtils.createPdfFileRequiredException();
}
// Get the original filename without extension
@@ -241,15 +242,13 @@ public class ConvertPDFToPDFA {
if (returnCode.getRc() != 0) {
log.error("PDF/A conversion failed with return code: {}", returnCode.getRc());
throw new RuntimeException("PDF/A conversion failed");
throw ExceptionUtils.createPdfaConversionFailedException();
}
// Get the output file
File[] outputFiles = tempOutputDir.toFile().listFiles();
if (outputFiles == null || outputFiles.length != 1) {
throw new RuntimeException(
"Expected one output PDF, found "
+ (outputFiles == null ? "none" : outputFiles.length));
throw ExceptionUtils.createPdfaConversionFailedException();
}
return outputFiles[0].toPath();
}
@@ -23,6 +23,7 @@ import stirling.software.SPDF.model.api.converters.UrlToPdfRequest;
import stirling.software.common.configuration.RuntimePathConfig;
import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.GeneralUtils;
import stirling.software.common.util.ProcessExecutor;
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
@@ -50,16 +51,19 @@ public class ConvertWebsiteToPDF {
String URL = request.getUrlInput();
if (!applicationProperties.getSystem().getEnableUrlToPDF()) {
throw new IllegalArgumentException("This endpoint has been disabled by the admin.");
throw ExceptionUtils.createIllegalArgumentException(
"error.endpointDisabled", "This endpoint has been disabled by the admin");
}
// Validate the URL format
if (!URL.matches("^https?://.*") || !GeneralUtils.isValidURL(URL)) {
throw new IllegalArgumentException("Invalid URL format provided.");
throw ExceptionUtils.createInvalidArgumentException(
"URL", "provided format is invalid");
}
// validate the URL is reachable
if (!GeneralUtils.isURLReachable(URL)) {
throw new IllegalArgumentException("URL is not reachable, please provide a valid URL.");
throw ExceptionUtils.createIllegalArgumentException(
"error.urlNotReachable", "URL is not reachable, please provide a valid URL");
}
Path tempOutputFile = null;
@@ -25,6 +25,7 @@ import stirling.software.SPDF.model.api.filter.FileSizeRequest;
import stirling.software.SPDF.model.api.filter.PageRotationRequest;
import stirling.software.SPDF.model.api.filter.PageSizeRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.PdfUtils;
import stirling.software.common.util.WebResponseUtils;
@@ -96,7 +97,7 @@ public class FilterController {
valid = actualPageCount < pageCount;
break;
default:
throw new IllegalArgumentException("Invalid comparator: " + comparator);
throw ExceptionUtils.createInvalidArgumentException("comparator", comparator);
}
if (valid) return WebResponseUtils.multiPartFileToWebResponse(inputFile);
@@ -139,7 +140,7 @@ public class FilterController {
valid = actualArea < standardArea;
break;
default:
throw new IllegalArgumentException("Invalid comparator: " + comparator);
throw ExceptionUtils.createInvalidArgumentException("comparator", comparator);
}
if (valid) return WebResponseUtils.multiPartFileToWebResponse(inputFile);
@@ -172,7 +173,7 @@ public class FilterController {
valid = actualFileSize < fileSize;
break;
default:
throw new IllegalArgumentException("Invalid comparator: " + comparator);
throw ExceptionUtils.createInvalidArgumentException("comparator", comparator);
}
if (valid) return WebResponseUtils.multiPartFileToWebResponse(inputFile);
@@ -208,7 +209,7 @@ public class FilterController {
valid = actualRotation < rotation;
break;
default:
throw new IllegalArgumentException("Invalid comparator: " + comparator);
throw ExceptionUtils.createInvalidArgumentException("comparator", comparator);
}
if (valid) return WebResponseUtils.multiPartFileToWebResponse(inputFile);
@@ -47,11 +47,13 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.config.EndpointConfiguration;
import stirling.software.SPDF.model.api.misc.OptimizePdfRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.GeneralUtils;
import stirling.software.common.util.ProcessExecutor;
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
@@ -61,16 +63,18 @@ import stirling.software.common.util.WebResponseUtils;
@RequestMapping("/api/v1/misc")
@Slf4j
@Tag(name = "Misc", description = "Miscellaneous APIs")
@RequiredArgsConstructor
public class CompressController {
private final CustomPDFDocumentFactory pdfDocumentFactory;
private final boolean qpdfEnabled;
private final EndpointConfiguration endpointConfiguration;
public CompressController(
CustomPDFDocumentFactory pdfDocumentFactory,
EndpointConfiguration endpointConfiguration) {
this.pdfDocumentFactory = pdfDocumentFactory;
this.qpdfEnabled = endpointConfiguration.isGroupEnabled("qpdf");
private boolean isQpdfEnabled() {
return endpointConfiguration.isGroupEnabled("qpdf");
}
private boolean isGhostscriptEnabled() {
return endpointConfiguration.isGroupEnabled("Ghostscript");
}
@Data
@@ -597,12 +601,12 @@ public class CompressController {
if (bytesRead > 0) {
byte[] dataToHash =
bytesRead == buffer.length ? buffer : Arrays.copyOf(buffer, bytesRead);
return bytesToHexString(generatMD5(dataToHash));
return bytesToHexString(generateMD5(dataToHash));
}
return "empty-stream";
}
} catch (Exception e) {
log.error("Error generating image hash", e);
ExceptionUtils.logException("image hash generation", e);
return "fallback-" + System.identityHashCode(image);
}
}
@@ -615,12 +619,12 @@ public class CompressController {
return sb.toString();
}
private byte[] generatMD5(byte[] data) throws IOException {
private byte[] generateMD5(byte[] data) throws IOException {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
return md.digest(data); // Get the MD5 hash of the image bytes
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("MD5 algorithm not available", e);
throw ExceptionUtils.createMd5AlgorithmException(e);
}
}
@@ -697,25 +701,69 @@ public class CompressController {
boolean sizeMet = false;
boolean imageCompressionApplied = false;
boolean qpdfCompressionApplied = false;
if (qpdfEnabled && optimizeLevel <= 3) {
optimizeLevel = 4;
}
boolean externalCompressionApplied = false;
while (!sizeMet && optimizeLevel <= 9) {
// Apply image compression for levels 4-9
if ((optimizeLevel >= 3 || Boolean.TRUE.equals(convertToGrayscale))
&& !imageCompressionApplied) {
double scaleFactor = getScaleFactorForLevel(optimizeLevel);
float jpegQuality = getJpegQualityForLevel(optimizeLevel);
// Apply external compression first
if (!externalCompressionApplied) {
boolean ghostscriptSuccess = false;
// Compress images
// Try Ghostscript first if available - for ANY compression level
if (isGhostscriptEnabled()) {
try {
applyGhostscriptCompression(
request, optimizeLevel, currentFile, tempFiles);
log.info("Ghostscript compression applied successfully");
ghostscriptSuccess = true;
} catch (IOException e) {
log.warn("Ghostscript compression failed, trying fallback methods");
}
}
// Fallback to QPDF if Ghostscript failed or not available (levels 1-3 only)
if (!ghostscriptSuccess && isQpdfEnabled() && optimizeLevel <= 3) {
try {
applyQpdfCompression(request, optimizeLevel, currentFile, tempFiles);
log.info("QPDF compression applied successfully");
} catch (IOException e) {
log.warn("QPDF compression also failed");
}
}
if (!ghostscriptSuccess && !isQpdfEnabled()) {
log.info(
"No external compression tools available, using image compression only");
}
externalCompressionApplied = true;
// Skip image compression if Ghostscript succeeded
if (ghostscriptSuccess) {
imageCompressionApplied = true;
}
}
// Apply image compression for levels 4+ only if Ghostscript didn't run
if ((optimizeLevel >= 4 || Boolean.TRUE.equals(convertToGrayscale))
&& !imageCompressionApplied) {
// Use different scale factors based on level
double scaleFactor =
switch (optimizeLevel) {
case 4 -> 0.95; // 95% of original size
case 5 -> 0.9; // 90% of original size
case 6 -> 0.8; // 80% of original size
case 7 -> 0.7; // 70% of original size
case 8 -> 0.65; // 65% of original size
case 9 -> 0.5; // 50% of original size
default -> 1.0;
};
log.info("Applying image compression with scale factor: {}", scaleFactor);
Path compressedImageFile =
compressImagesInPDF(
currentFile,
scaleFactor,
jpegQuality,
0.7f, // Default JPEG quality
Boolean.TRUE.equals(convertToGrayscale));
tempFiles.add(compressedImageFile);
@@ -723,18 +771,6 @@ public class CompressController {
imageCompressionApplied = true;
}
// Apply QPDF compression for all levels
if (!qpdfCompressionApplied && qpdfEnabled) {
applyQpdfCompression(request, optimizeLevel, currentFile, tempFiles);
qpdfCompressionApplied = true;
} else if (!qpdfCompressionApplied) {
// If QPDF is disabled, mark as applied and log
if (!qpdfEnabled) {
log.info("Skipping QPDF compression as QPDF group is disabled");
}
qpdfCompressionApplied = true;
}
// Check if target size reached or not in auto mode
long outputFileSize = Files.size(currentFile);
if (outputFileSize <= expectedOutputSize || !autoMode) {
@@ -754,7 +790,7 @@ public class CompressController {
} else {
// Reset flags for next iteration with higher optimization level
imageCompressionApplied = false;
qpdfCompressionApplied = false;
externalCompressionApplied = false;
optimizeLevel = newOptimizeLevel;
}
}
@@ -788,6 +824,96 @@ public class CompressController {
}
}
// Run Ghostscript compression
private void applyGhostscriptCompression(
OptimizePdfRequest request, int optimizeLevel, Path currentFile, List<Path> tempFiles)
throws IOException {
long preGsSize = Files.size(currentFile);
log.info("Pre-Ghostscript file size: {}", GeneralUtils.formatBytes(preGsSize));
// Create output file for Ghostscript
Path gsOutputFile = Files.createTempFile("gs_output_", ".pdf");
tempFiles.add(gsOutputFile);
// Build Ghostscript command based on optimization level
List<String> command = new ArrayList<>();
command.add("gs");
command.add("-sDEVICE=pdfwrite");
command.add("-dCompatibilityLevel=1.5");
command.add("-dNOPAUSE");
command.add("-dQUIET");
command.add("-dBATCH");
// Map optimization levels to Ghostscript settings
switch (optimizeLevel) {
case 1:
command.add("-dPDFSETTINGS=/prepress");
break;
case 2:
command.add("-dPDFSETTINGS=/printer");
break;
case 3:
command.add("-dPDFSETTINGS=/ebook");
break;
case 4:
case 5:
command.add("-dPDFSETTINGS=/screen");
break;
case 6:
case 7:
command.add("-dPDFSETTINGS=/screen");
command.add("-dColorImageResolution=150");
command.add("-dGrayImageResolution=150");
command.add("-dMonoImageResolution=300");
break;
case 8:
case 9:
command.add("-dPDFSETTINGS=/screen");
command.add("-dColorImageResolution=100");
command.add("-dGrayImageResolution=100");
command.add("-dMonoImageResolution=200");
break;
case 10:
command.add("-dPDFSETTINGS=/screen");
command.add("-dColorImageResolution=72");
command.add("-dGrayImageResolution=72");
command.add("-dMonoImageResolution=150");
break;
default:
command.add("-dPDFSETTINGS=/screen");
break;
}
command.add("-sOutputFile=" + gsOutputFile.toString());
command.add(currentFile.toString());
ProcessExecutorResult returnCode = null;
try {
returnCode =
ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT)
.runCommandWithOutputHandling(command);
if (returnCode.getRc() == 0) {
// Update current file to the Ghostscript output
Files.copy(gsOutputFile, currentFile, StandardCopyOption.REPLACE_EXISTING);
long postGsSize = Files.size(currentFile);
double gsReduction = 100.0 - ((postGsSize * 100.0) / preGsSize);
log.info(
"Post-Ghostscript file size: {} (reduced by {}%)",
GeneralUtils.formatBytes(postGsSize), String.format("%.1f", gsReduction));
} else {
log.warn("Ghostscript compression failed with return code: {}", returnCode.getRc());
throw new IOException("Ghostscript compression failed");
}
} catch (Exception e) {
log.warn("Ghostscript compression failed, will fallback to other methods", e);
throw new IOException("Ghostscript compression failed", e);
}
}
// Run QPDF compression
private void applyQpdfCompression(
OptimizePdfRequest request, int optimizeLevel, Path currentFile, List<Path> tempFiles)
@@ -26,6 +26,7 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.common.model.api.PDFFile;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.WebResponseUtils;
@RestController
@@ -134,7 +135,7 @@ public class DecompressPdfController {
stream.setInt(COSName.LENGTH, decompressedBytes.length);
}
} catch (IOException e) {
log.error("Error decompressing stream", e);
ExceptionUtils.logException("stream decompression", e);
// Continue processing other streams even if this one fails
}
}
@@ -33,6 +33,7 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.api.misc.ExtractImageScansRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.CheckProgramInstall;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.ProcessExecutor;
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
import stirling.software.common.util.WebResponseUtils;
@@ -72,7 +73,8 @@ public class ExtractImageScansController {
List<Path> tempDirs = new ArrayList<>();
if (!CheckProgramInstall.isPythonAvailable()) {
throw new IOException("Python is not installed.");
throw ExceptionUtils.createIOException(
"error.toolNotInstalled", "{0} is not installed", null, "Python");
}
String pythonVersion = CheckProgramInstall.getAvailablePythonCommand();
@@ -41,6 +41,7 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.api.PDFExtractImagesRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.ImageProcessingUtils;
import stirling.software.common.util.WebResponseUtils;
@@ -90,39 +91,57 @@ public class ExtractImagesController {
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
Set<Future<Void>> futures = new HashSet<>();
// Iterate over each page
for (int pgNum = 0; pgNum < document.getPages().getCount(); pgNum++) {
PDPage page = document.getPage(pgNum);
Future<Void> future =
executor.submit(
() -> {
// Use the page number directly from the iterator, so no need to
// calculate manually
int pageNum = document.getPages().indexOf(page) + 1;
// Safely iterate over each page, handling corrupt PDFs where page count might be wrong
try {
int pageCount = document.getPages().getCount();
log.debug("Document reports {} pages", pageCount);
try {
// Call the image extraction method for each page
extractImagesFromPage(
page,
format,
filename,
pageNum,
processedImages,
zos,
allowDuplicates);
} catch (IOException e) {
// Log the error and continue processing other pages
log.error(
"Error extracting images from page {}: {}",
pageNum,
e.getMessage());
}
int consecutiveFailures = 0;
return null; // Callable requires a return type
});
for (int pgNum = 0; pgNum < pageCount; pgNum++) {
try {
PDPage page = document.getPage(pgNum);
consecutiveFailures = 0; // Reset on success
final int currentPageNum = pgNum + 1; // Convert to 1-based page numbering
Future<Void> future =
executor.submit(
() -> {
try {
// Call the image extraction method for each page
extractImagesFromPage(
page,
format,
filename,
currentPageNum,
processedImages,
zos,
allowDuplicates);
} catch (Exception e) {
// Log the error and continue processing other pages
ExceptionUtils.logException(
"image extraction from page "
+ currentPageNum,
e);
}
// Add the Future object to the list to track completion
futures.add(future);
return null; // Callable requires a return type
});
// Add the Future object to the list to track completion
futures.add(future);
} catch (Exception e) {
consecutiveFailures++;
ExceptionUtils.logException("page access for page " + (pgNum + 1), e);
if (consecutiveFailures >= 3) {
log.warn("Stopping page iteration after 3 consecutive failures");
break;
}
}
}
} catch (Exception e) {
ExceptionUtils.logException("page count determination", e);
throw e;
}
// Wait for all tasks to complete
@@ -180,34 +199,39 @@ public class ExtractImagesController {
}
int count = 1;
for (COSName name : page.getResources().getXObjectNames()) {
if (page.getResources().isImageXObject(name)) {
PDImageXObject image = (PDImageXObject) page.getResources().getXObject(name);
if (!allowDuplicates) {
byte[] data = ImageProcessingUtils.getImageData(image.getImage());
byte[] imageHash = md.digest(data);
synchronized (processedImages) {
if (processedImages.stream()
.anyMatch(hash -> Arrays.equals(hash, imageHash))) {
continue; // Skip already processed images
try {
if (page.getResources().isImageXObject(name)) {
PDImageXObject image = (PDImageXObject) page.getResources().getXObject(name);
if (!allowDuplicates) {
byte[] data = ImageProcessingUtils.getImageData(image.getImage());
byte[] imageHash = md.digest(data);
synchronized (processedImages) {
if (processedImages.stream()
.anyMatch(hash -> Arrays.equals(hash, imageHash))) {
continue; // Skip already processed images
}
processedImages.add(imageHash);
}
processedImages.add(imageHash);
}
RenderedImage renderedImage = image.getImage();
// Convert to standard RGB colorspace if needed
BufferedImage bufferedImage = convertToRGB(renderedImage, format);
// Write image to zip file
String imageName = filename + "_page_" + pageNum + "_" + count++ + "." + format;
synchronized (zos) {
zos.putNextEntry(new ZipEntry(imageName));
ByteArrayOutputStream imageBaos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, format, imageBaos);
zos.write(imageBaos.toByteArray());
zos.closeEntry();
}
}
RenderedImage renderedImage = image.getImage();
// Convert to standard RGB colorspace if needed
BufferedImage bufferedImage = convertToRGB(renderedImage, format);
// Write image to zip file
String imageName = filename + "_page_" + pageNum + "_" + count++ + "." + format;
synchronized (zos) {
zos.putNextEntry(new ZipEntry(imageName));
ByteArrayOutputStream imageBaos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, format, imageBaos);
zos.write(imageBaos.toByteArray());
zos.closeEntry();
}
} catch (IOException e) {
ExceptionUtils.logException("image extraction", e);
throw ExceptionUtils.handlePdfException(e, "during image extraction");
}
}
}
@@ -47,6 +47,11 @@ public class FakeScanController {
private final CustomPDFDocumentFactory pdfDocumentFactory;
private static final Random RANDOM = new Random();
// Size limits to prevent OutOfMemoryError
private static final int MAX_IMAGE_WIDTH = 8192;
private static final int MAX_IMAGE_HEIGHT = 8192;
private static final long MAX_IMAGE_PIXELS = 16_777_216; // 4096x4096
@PostMapping(value = "/fake-scan", consumes = "multipart/form-data")
@Operation(
summary = "Convert PDF to look like a scanned document",
@@ -82,8 +87,46 @@ public class FakeScanController {
PDFRenderer pdfRenderer = new PDFRenderer(document);
for (int i = 0; i < document.getNumberOfPages(); i++) {
// Render page to image with specified resolution
BufferedImage image = pdfRenderer.renderImageWithDPI(i, resolution);
// Get page dimensions to calculate safe resolution
PDRectangle pageSize = document.getPage(i).getMediaBox();
float pageWidthPts = pageSize.getWidth();
float pageHeightPts = pageSize.getHeight();
// Calculate what the image dimensions would be at the requested resolution
int projectedWidth = (int) Math.ceil(pageWidthPts * resolution / 72.0);
int projectedHeight = (int) Math.ceil(pageHeightPts * resolution / 72.0);
long projectedPixels = (long) projectedWidth * projectedHeight;
// Calculate safe resolution that stays within limits
int safeResolution = resolution;
if (projectedWidth > MAX_IMAGE_WIDTH
|| projectedHeight > MAX_IMAGE_HEIGHT
|| projectedPixels > MAX_IMAGE_PIXELS) {
double widthScale = (double) MAX_IMAGE_WIDTH / projectedWidth;
double heightScale = (double) MAX_IMAGE_HEIGHT / projectedHeight;
double pixelScale = Math.sqrt((double) MAX_IMAGE_PIXELS / projectedPixels);
double minScale = Math.min(Math.min(widthScale, heightScale), pixelScale);
safeResolution = (int) Math.max(72, resolution * minScale);
log.warn(
"Page {} would be too large at {}dpi ({}x{} pixels). Reducing to {}dpi",
i + 1,
resolution,
projectedWidth,
projectedHeight,
safeResolution);
}
// Render page to image with safe resolution
BufferedImage image = pdfRenderer.renderImageWithDPI(i, safeResolution);
log.debug(
"Processing page {} with dimensions {}x{} ({} pixels) at {}dpi",
i + 1,
image.getWidth(),
image.getHeight(),
(long) image.getWidth() * image.getHeight(),
safeResolution);
// 1. Convert to grayscale or keep color
BufferedImage processed;
@@ -2,6 +2,7 @@ package stirling.software.SPDF.controller.api.misc;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.zip.ZipEntry;
@@ -29,12 +30,17 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.config.EndpointConfiguration;
import stirling.software.SPDF.model.api.misc.ProcessPdfWithOcrRequest;
import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.ProcessExecutor;
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
import stirling.software.common.util.TempDirectory;
import stirling.software.common.util.TempFile;
import stirling.software.common.util.TempFileManager;
import stirling.software.common.util.WebResponseUtils;
@RestController
@RequestMapping("/api/v1/misc")
@@ -46,6 +52,15 @@ public class OCRController {
private final ApplicationProperties applicationProperties;
private final CustomPDFDocumentFactory pdfDocumentFactory;
private final TempFileManager tempFileManager;
private final EndpointConfiguration endpointConfiguration;
private boolean isOcrMyPdfEnabled() {
return endpointConfiguration.isGroupEnabled("OCRmyPDF");
}
private boolean isTesseractEnabled() {
return endpointConfiguration.isGroupEnabled("tesseract");
}
/** Gets the list of available Tesseract languages from the tessdata directory */
public List<String> getAvailableTesseractLanguages() {
@@ -63,39 +78,261 @@ public class OCRController {
@PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf")
@Operation(
summary = "Process PDF files with OCR using Tesseract",
summary = "Process a PDF file with OCR",
description =
"Takes a PDF file as input, performs OCR using specified languages and OCR type"
+ " (skip-text/force-ocr), and returns the processed PDF. Input:PDF"
+ " Output:PDF Type:SISO")
"This endpoint processes a PDF file using OCR (Optical Character Recognition). "
+ "Users can specify languages, sidecar, deskew, clean, cleanFinal, ocrType, ocrRenderType, and removeImagesAfter options. "
+ "Uses OCRmyPDF if available, falls back to Tesseract. Input:PDF Output:PDF Type:SI-Conditional")
public ResponseEntity<byte[]> processPdfWithOCR(
@ModelAttribute ProcessPdfWithOcrRequest request)
throws IOException, InterruptedException {
MultipartFile inputFile = request.getFileInput();
List<String> languages = request.getLanguages();
List<String> selectedLanguages = request.getLanguages();
Boolean sidecar = request.isSidecar();
Boolean deskew = request.isDeskew();
Boolean clean = request.isClean();
Boolean cleanFinal = request.isCleanFinal();
String ocrType = request.getOcrType();
String ocrRenderType = request.getOcrRenderType();
Boolean removeImagesAfter = request.isRemoveImagesAfter();
// Create a temp directory using TempFileManager directly
Path tempDirPath = tempFileManager.createTempDirectory();
File tempDir = tempDirPath.toFile();
if (selectedLanguages == null || selectedLanguages.isEmpty()) {
throw ExceptionUtils.createOcrLanguageRequiredException();
}
try {
File tempInputFile = new File(tempDir, "input.pdf");
File tempOutputDir = new File(tempDir, "output");
File tempImagesDir = new File(tempDir, "images");
File finalOutputFile = new File(tempDir, "final_output.pdf");
if (!"hocr".equals(ocrRenderType) && !"sandwich".equals(ocrRenderType)) {
throw new IOException("ocrRenderType wrong");
}
// Get available Tesseract languages
List<String> availableLanguages = getAvailableTesseractLanguages();
// Validate selected languages
selectedLanguages =
selectedLanguages.stream().filter(availableLanguages::contains).toList();
if (selectedLanguages.isEmpty()) {
throw ExceptionUtils.createOcrInvalidLanguagesException();
}
// Use try-with-resources for proper temp file management
try (TempFile tempInputFile = new TempFile(tempFileManager, ".pdf");
TempFile tempOutputFile = new TempFile(tempFileManager, ".pdf")) {
inputFile.transferTo(tempInputFile.getFile());
TempFile sidecarTextFile = null;
try {
// Use OCRmyPDF if available (no fallback - error if it fails)
if (isOcrMyPdfEnabled()) {
if (sidecar != null && sidecar) {
sidecarTextFile = new TempFile(tempFileManager, ".txt");
}
processWithOcrMyPdf(
selectedLanguages,
sidecar,
deskew,
clean,
cleanFinal,
ocrType,
ocrRenderType,
removeImagesAfter,
tempInputFile.getPath(),
tempOutputFile.getPath(),
sidecarTextFile != null ? sidecarTextFile.getPath() : null);
log.info("OCRmyPDF processing completed successfully");
}
// Use Tesseract only if OCRmyPDF is not available
else if (isTesseractEnabled()) {
processWithTesseract(
selectedLanguages,
ocrType,
tempInputFile.getPath(),
tempOutputFile.getPath());
log.info("Tesseract processing completed successfully");
} else {
throw ExceptionUtils.createOcrToolsUnavailableException();
}
// Read the processed PDF file
byte[] pdfBytes = Files.readAllBytes(tempOutputFile.getPath());
// Return the OCR processed PDF as a response
String outputFilename =
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
.replaceFirst("[.][^.]+$", "")
+ "_OCR.pdf";
if (sidecar != null && sidecar && sidecarTextFile != null) {
// Create a zip file containing both the PDF and the text file
String outputZipFilename =
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
.replaceFirst("[.][^.]+$", "")
+ "_OCR.zip";
try (TempFile tempZipFile = new TempFile(tempFileManager, ".zip");
ZipOutputStream zipOut =
new ZipOutputStream(
Files.newOutputStream(tempZipFile.getPath()))) {
// Add PDF file to the zip
ZipEntry pdfEntry = new ZipEntry(outputFilename);
zipOut.putNextEntry(pdfEntry);
zipOut.write(pdfBytes);
zipOut.closeEntry();
// Add text file to the zip
ZipEntry txtEntry = new ZipEntry(outputFilename.replace(".pdf", ".txt"));
zipOut.putNextEntry(txtEntry);
Files.copy(sidecarTextFile.getPath(), zipOut);
zipOut.closeEntry();
zipOut.finish();
byte[] zipBytes = Files.readAllBytes(tempZipFile.getPath());
// Return the zip file containing both the PDF and the text file
return WebResponseUtils.bytesToWebResponse(
zipBytes, outputZipFilename, MediaType.APPLICATION_OCTET_STREAM);
}
} else {
// Return the OCR processed PDF as a response
return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename);
}
} finally {
// Clean up sidecar temp file if created
if (sidecarTextFile != null) {
try {
sidecarTextFile.close();
} catch (Exception e) {
log.warn("Failed to close sidecar temp file", e);
}
}
}
}
}
private void processWithOcrMyPdf(
List<String> selectedLanguages,
Boolean sidecar,
Boolean deskew,
Boolean clean,
Boolean cleanFinal,
String ocrType,
String ocrRenderType,
Boolean removeImagesAfter,
Path tempInputFile,
Path tempOutputFile,
Path sidecarTextPath)
throws IOException, InterruptedException {
// Build OCRmyPDF command
String languageOption = String.join("+", selectedLanguages);
List<String> command =
new ArrayList<>(
Arrays.asList(
"ocrmypdf",
"--verbose",
"2",
"--output-type",
"pdf",
"--pdf-renderer",
ocrRenderType));
if (sidecar != null && sidecar && sidecarTextPath != null) {
command.add("--sidecar");
command.add(sidecarTextPath.toString());
}
if (deskew != null && deskew) {
command.add("--deskew");
}
if (clean != null && clean) {
command.add("--clean");
}
if (cleanFinal != null && cleanFinal) {
command.add("--clean-final");
}
if (ocrType != null && !"".equals(ocrType)) {
if ("skip-text".equals(ocrType)) {
command.add("--skip-text");
} else if ("force-ocr".equals(ocrType)) {
command.add("--force-ocr");
}
}
command.addAll(
Arrays.asList(
"--language",
languageOption,
tempInputFile.toString(),
tempOutputFile.toString()));
// Run CLI command
ProcessExecutorResult result =
ProcessExecutor.getInstance(ProcessExecutor.Processes.OCR_MY_PDF)
.runCommandWithOutputHandling(command);
if (result.getRc() != 0
&& result.getMessages().contains("multiprocessing/synchronize.py")
&& result.getMessages().contains("OSError: [Errno 38] Function not implemented")) {
command.add("--jobs");
command.add("1");
result =
ProcessExecutor.getInstance(ProcessExecutor.Processes.OCR_MY_PDF)
.runCommandWithOutputHandling(command);
}
if (result.getRc() != 0) {
throw new IOException("OCRmyPDF failed with return code: " + result.getRc());
}
// Remove images from the OCR processed PDF if the flag is set to true
if (removeImagesAfter != null && removeImagesAfter) {
try (TempFile tempPdfWithoutImages = new TempFile(tempFileManager, "_no_images.pdf")) {
List<String> gsCommand =
Arrays.asList(
"gs",
"-sDEVICE=pdfwrite",
"-dFILTERIMAGE",
"-o",
tempPdfWithoutImages.getPath().toString(),
tempOutputFile.toString());
ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT)
.runCommandWithOutputHandling(gsCommand);
// Replace output file with version without images
Files.copy(
tempPdfWithoutImages.getPath(),
tempOutputFile,
java.nio.file.StandardCopyOption.REPLACE_EXISTING);
}
}
}
private void processWithTesseract(
List<String> selectedLanguages, String ocrType, Path tempInputFile, Path tempOutputFile)
throws IOException, InterruptedException {
// Create temp directory for Tesseract processing
try (TempDirectory tempDir = new TempDirectory(tempFileManager)) {
File tempOutputDir = new File(tempDir.getPath().toFile(), "output");
File tempImagesDir = new File(tempDir.getPath().toFile(), "images");
File finalOutputFile = new File(tempDir.getPath().toFile(), "final_output.pdf");
// Create directories
tempOutputDir.mkdirs();
tempImagesDir.mkdirs();
// Save input file
inputFile.transferTo(tempInputFile);
PDFMergerUtility merger = new PDFMergerUtility();
merger.setDestinationFileName(finalOutputFile.toString());
try (PDDocument document = pdfDocumentFactory.load(tempInputFile)) {
try (PDDocument document = pdfDocumentFactory.load(tempInputFile.toFile())) {
PDFRenderer pdfRenderer = new PDFRenderer(document);
int pageCount = document.getNumberOfPages();
@@ -135,35 +372,24 @@ public class OCRController {
new File(tempOutputDir, String.format("page_%d", pageNum))
.toString());
command.add("-l");
command.add(String.join("+", languages));
// Always output PDF
command.add("pdf");
command.add(String.join("+", selectedLanguages));
command.add("pdf"); // Always output PDF
// Use ProcessExecutor to run tesseract command
try {
ProcessExecutorResult result =
ProcessExecutor.getInstance(ProcessExecutor.Processes.TESSERACT)
.runCommandWithOutputHandling(command);
ProcessExecutorResult result =
ProcessExecutor.getInstance(ProcessExecutor.Processes.TESSERACT)
.runCommandWithOutputHandling(command);
log.debug(
"Tesseract OCR completed for page {} with exit code {}",
pageNum,
if (result.getRc() != 0) {
throw ExceptionUtils.createRuntimeException(
"error.commandFailed",
"{0} command failed with exit code: {1}",
null,
"Tesseract",
result.getRc());
// Add OCR'd PDF to merger
merger.addSource(pageOutputPath);
} catch (IOException | InterruptedException e) {
log.error(
"Error processing page {} with tesseract: {}",
pageNum,
e.getMessage());
// If OCR fails, fall back to the original page
try (PDDocument pageDoc = new PDDocument()) {
pageDoc.addPage(page);
pageDoc.save(pageOutputPath);
merger.addSource(pageOutputPath);
}
}
// Add OCR'd PDF to merger
merger.addSource(pageOutputPath);
} else {
// Save original page without OCR
try (PDDocument pageDoc = new PDDocument()) {
@@ -178,40 +404,11 @@ public class OCRController {
// Merge all pages into final PDF
merger.mergeDocuments(null);
// Read the final PDF file
byte[] pdfContent = java.nio.file.Files.readAllBytes(finalOutputFile.toPath());
String outputFilename =
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
.replaceFirst("[.][^.]+$", "")
+ "_OCR.pdf";
return ResponseEntity.ok()
.header(
"Content-Disposition",
"attachment; filename=\"" + outputFilename + "\"")
.contentType(MediaType.APPLICATION_PDF)
.body(pdfContent);
} finally {
// Clean up the temp directory and all its contents
tempFileManager.deleteTempDirectory(tempDirPath);
}
}
private void addFileToZip(File file, String filename, ZipOutputStream zipOut)
throws IOException {
if (!file.exists()) {
log.warn("File {} does not exist, skipping", file);
return;
}
try (FileInputStream fis = new FileInputStream(file)) {
ZipEntry zipEntry = new ZipEntry(filename);
zipOut.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) >= 0) {
zipOut.write(buffer, 0, length);
}
zipOut.closeEntry();
// Copy final output to the expected location
Files.copy(
finalOutputFile.toPath(),
tempOutputFile,
java.nio.file.StandardCopyOption.REPLACE_EXISTING);
}
}
}
@@ -16,7 +16,9 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.config.EndpointConfiguration;
import stirling.software.common.model.api.PDFFile;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ProcessExecutor;
@@ -28,17 +30,27 @@ import stirling.software.common.util.WebResponseUtils;
@RestController
@RequestMapping("/api/v1/misc")
@Tag(name = "Misc", description = "Miscellaneous APIs")
@Slf4j
@RequiredArgsConstructor
public class RepairController {
private final CustomPDFDocumentFactory pdfDocumentFactory;
private final TempFileManager tempFileManager;
private final EndpointConfiguration endpointConfiguration;
private boolean isGhostscriptEnabled() {
return endpointConfiguration.isGroupEnabled("Ghostscript");
}
private boolean isQpdfEnabled() {
return endpointConfiguration.isGroupEnabled("qpdf");
}
@PostMapping(consumes = "multipart/form-data", value = "/repair")
@Operation(
summary = "Repair a PDF file",
description =
"This endpoint repairs a given PDF file by running qpdf command. The PDF is"
"This endpoint repairs a given PDF file by running Ghostscript (primary), qpdf (fallback), or PDFBox (if no external tools available). The PDF is"
+ " first saved to a temporary location, repaired, read back, and then"
+ " returned as a response. Input:PDF Output:PDF Type:SISO")
public ResponseEntity<byte[]> repairPdf(@ModelAttribute PDFFile file)
@@ -46,25 +58,71 @@ public class RepairController {
MultipartFile inputFile = file.getFileInput();
// Use TempFile with try-with-resources for automatic cleanup
try (TempFile tempFile = new TempFile(tempFileManager, ".pdf")) {
try (TempFile tempInputFile = new TempFile(tempFileManager, ".pdf");
TempFile tempOutputFile = new TempFile(tempFileManager, ".pdf")) {
// Save the uploaded file to the temporary location
inputFile.transferTo(tempFile.getFile());
inputFile.transferTo(tempInputFile.getFile());
List<String> command = new ArrayList<>();
command.add("qpdf");
command.add("--replace-input"); // Automatically fixes problems it can
command.add("--qdf"); // Linearizes and normalizes PDF structure
command.add("--object-streams=disable"); // Can help with some corruptions
command.add(tempFile.getFile().getAbsolutePath());
boolean repairSuccess = false;
ProcessExecutorResult returnCode =
ProcessExecutor.getInstance(ProcessExecutor.Processes.QPDF)
.runCommandWithOutputHandling(command);
// Try Ghostscript first if available
if (isGhostscriptEnabled()) {
try {
List<String> gsCommand = new ArrayList<>();
gsCommand.add("gs");
gsCommand.add("-o");
gsCommand.add(tempOutputFile.getPath().toString());
gsCommand.add("-sDEVICE=pdfwrite");
gsCommand.add(tempInputFile.getPath().toString());
// Read the optimized PDF file
byte[] pdfBytes = pdfDocumentFactory.loadToBytes(tempFile.getFile());
ProcessExecutorResult gsResult =
ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT)
.runCommandWithOutputHandling(gsCommand);
// Return the optimized PDF as a response
if (gsResult.getRc() == 0) {
repairSuccess = true;
}
} catch (Exception e) {
// Log and continue to QPDF fallback
log.warn("Ghostscript repair failed, trying QPDF fallback: ", e);
}
}
// Fallback to QPDF if Ghostscript failed or not available
if (!repairSuccess && isQpdfEnabled()) {
List<String> qpdfCommand = new ArrayList<>();
qpdfCommand.add("qpdf");
qpdfCommand.add("--replace-input"); // Automatically fixes problems it can
qpdfCommand.add("--qdf"); // Linearizes and normalizes PDF structure
qpdfCommand.add("--object-streams=disable"); // Can help with some corruptions
qpdfCommand.add(tempInputFile.getPath().toString());
qpdfCommand.add(tempOutputFile.getPath().toString());
ProcessExecutorResult qpdfResult =
ProcessExecutor.getInstance(ProcessExecutor.Processes.QPDF)
.runCommandWithOutputHandling(qpdfCommand);
repairSuccess = true;
}
// Use PDFBox as last resort if no external tools are available
if (!repairSuccess) {
if (!isGhostscriptEnabled() && !isQpdfEnabled()) {
// Basic PDFBox repair - load and save to fix structural issues
try (var document = pdfDocumentFactory.load(tempInputFile.getFile())) {
document.save(tempOutputFile.getFile());
repairSuccess = true;
}
} else {
throw new IOException("PDF repair failed with available tools");
}
}
// Read the repaired PDF file
byte[] pdfBytes = pdfDocumentFactory.loadToBytes(tempOutputFile.getFile());
// Return the repaired PDF as a response
String outputFilename =
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
.replaceFirst("[.][^.]+$", "")
@@ -150,11 +150,22 @@ public class PipelineProcessor {
}
}
if (!hasInputFileType) {
String filename = file.getFilename();
String providedExtension = "no extension";
if (filename != null && filename.contains(".")) {
providedExtension =
filename.substring(filename.lastIndexOf(".")).toLowerCase();
}
logPrintStream.println(
"No files with extension "
+ String.join(", ", inputFileTypes)
+ " found for operation "
+ operation);
+ operation
+ ". Provided file '"
+ filename
+ "' has extension: "
+ providedExtension);
hasErrors = true;
}
}
@@ -203,11 +214,32 @@ public class PipelineProcessor {
hasErrors = true;
}
} else {
// Get details about what files were actually provided
List<String> providedExtensions =
outputFiles.stream()
.map(
file -> {
String filename = file.getFilename();
if (filename != null && filename.contains(".")) {
return filename.substring(
filename.lastIndexOf("."))
.toLowerCase();
}
return "no extension";
})
.distinct()
.toList();
logPrintStream.println(
"No files with extension "
+ String.join(", ", inputFileTypes)
+ " found for multi-input operation "
+ operation);
+ operation
+ ". Provided files have extensions: "
+ String.join(", ", providedExtensions)
+ " (total files: "
+ outputFiles.size()
+ ")");
hasErrors = true;
}
}
@@ -65,6 +65,7 @@ import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import io.github.pixee.security.Filenames;
import io.micrometer.common.util.StringUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -73,6 +74,7 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.api.security.SignPDFWithCertRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.WebResponseUtils;
@RestController
@@ -132,7 +134,7 @@ public class CertSignController {
}
doc.saveIncremental(output);
} catch (Exception e) {
log.error("exception", e);
ExceptionUtils.logException("PDF signing", e);
}
}
@@ -165,8 +167,11 @@ public class CertSignController {
Integer pageNumber = request.getPageNumber() != null ? (request.getPageNumber() - 1) : null;
Boolean showLogo = request.getShowLogo();
if (certType == null) {
throw new IllegalArgumentException("Cert type must be provided");
if (StringUtils.isBlank(certType)) {
throw ExceptionUtils.createIllegalArgumentException(
"error.optionsNotSpecified",
"{0} options are not specified",
"certificate type");
}
KeyStore ks = null;
@@ -189,7 +194,10 @@ public class CertSignController {
ks.load(jksfile.getInputStream(), password.toCharArray());
break;
default:
throw new IllegalArgumentException("Invalid cert type: " + certType);
throw ExceptionUtils.createIllegalArgumentException(
"error.invalidArgument",
"Invalid argument: {0}",
"certificate type: " + certType);
}
CreateSignature createSignature = new CreateSignature(ks, password.toCharArray());
@@ -63,6 +63,7 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.common.model.api.PDFFile;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.WebResponseUtils;
@RestController
@@ -149,23 +150,39 @@ public class GetInfoOnPDF {
try {
PDMetadata pdMetadata = document.getDocumentCatalog().getMetadata();
if (pdMetadata != null) {
COSInputStream metaStream = pdMetadata.createInputStream();
DomXmpParser domXmpParser = new DomXmpParser();
XMPMetadata xmpMeta = domXmpParser.parse(metaStream);
try (COSInputStream metaStream = pdMetadata.createInputStream()) {
// First try to read raw metadata as string to check for standard keywords
byte[] metadataBytes = metaStream.readAllBytes();
String rawMetadata = new String(metadataBytes, StandardCharsets.UTF_8);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
new XmpSerializer().serialize(xmpMeta, baos, true);
String xmpString = new String(baos.toByteArray(), StandardCharsets.UTF_8);
if (rawMetadata.contains(standardKeyword)) {
return true;
}
}
if (xmpString.contains(standardKeyword)) {
return true;
// If raw check doesn't find it, try parsing with XMP parser
try (COSInputStream metaStream = pdMetadata.createInputStream()) {
try {
DomXmpParser domXmpParser = new DomXmpParser();
XMPMetadata xmpMeta = domXmpParser.parse(metaStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
new XmpSerializer().serialize(xmpMeta, baos, true);
String xmpString = new String(baos.toByteArray(), StandardCharsets.UTF_8);
if (xmpString.contains(standardKeyword)) {
return true;
}
} catch (XmpParsingException e) {
// XMP parsing failed, but we already checked raw metadata above
log.debug(
"XMP parsing failed for standard check, but raw metadata was already checked: {}",
e.getMessage());
}
}
}
} catch (
Exception
e) { // Catching general exception for brevity, ideally you'd catch specific
// exceptions.
log.error("exception", e);
} catch (Exception e) {
ExceptionUtils.logException("PDF standard checking", e);
}
return false;
@@ -391,14 +408,22 @@ public class GetInfoOnPDF {
if (pdMetadata != null) {
try {
COSInputStream is = pdMetadata.createInputStream();
DomXmpParser domXmpParser = new DomXmpParser();
XMPMetadata xmpMeta = domXmpParser.parse(is);
try (COSInputStream is = pdMetadata.createInputStream()) {
DomXmpParser domXmpParser = new DomXmpParser();
XMPMetadata xmpMeta = domXmpParser.parse(is);
ByteArrayOutputStream os = new ByteArrayOutputStream();
new XmpSerializer().serialize(xmpMeta, os, true);
xmpString = new String(os.toByteArray(), StandardCharsets.UTF_8);
} catch (XmpParsingException | IOException e) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
new XmpSerializer().serialize(xmpMeta, os, true);
xmpString = new String(os.toByteArray(), StandardCharsets.UTF_8);
}
} catch (XmpParsingException e) {
// XMP parsing failed, try to read raw metadata instead
log.debug("XMP parsing failed, reading raw metadata: {}", e.getMessage());
try (COSInputStream is = pdMetadata.createInputStream()) {
byte[] metadataBytes = is.readAllBytes();
xmpString = new String(metadataBytes, StandardCharsets.UTF_8);
}
} catch (IOException e) {
log.error("exception", e);
}
}
@@ -21,6 +21,7 @@ import lombok.RequiredArgsConstructor;
import stirling.software.SPDF.model.api.security.AddPasswordRequest;
import stirling.software.SPDF.model.api.security.PDFPasswordRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.WebResponseUtils;
@RestController
@@ -42,12 +43,19 @@ public class PasswordController {
MultipartFile fileInput = request.getFileInput();
String password = request.getPassword();
PDDocument document = pdfDocumentFactory.load(fileInput, password);
document.setAllSecurityToBeRemoved(true);
return WebResponseUtils.pdfDocToWebResponse(
document,
Filenames.toSimpleFileName(fileInput.getOriginalFilename())
.replaceFirst("[.][^.]+$", "")
+ "_password_removed.pdf");
try {
document.setAllSecurityToBeRemoved(true);
return WebResponseUtils.pdfDocToWebResponse(
document,
Filenames.toSimpleFileName(fileInput.getOriginalFilename())
.replaceFirst("[.][^.]+$", "")
+ "_password_removed.pdf");
} catch (IOException e) {
document.close();
ExceptionUtils.logException("password removal", e);
throw ExceptionUtils.handlePdfException(e);
}
}
@PostMapping(consumes = "multipart/form-data", value = "/add-password")
@@ -41,6 +41,7 @@ import stirling.software.SPDF.model.api.security.SignatureValidationRequest;
import stirling.software.SPDF.model.api.security.SignatureValidationResult;
import stirling.software.SPDF.service.CertificateValidationService;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ExceptionUtils;
@RestController
@RequestMapping("/api/v1/security")
@@ -82,7 +83,12 @@ public class ValidateSignatureController {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
customCert = (X509Certificate) cf.generateCertificate(certStream);
} catch (CertificateException e) {
throw new RuntimeException("Invalid certificate file: " + e.getMessage());
throw ExceptionUtils.createRuntimeException(
"error.invalidFormat",
"Invalid {0} format: {1}",
e,
"certificate file",
e.getMessage());
}
}
@@ -29,6 +29,7 @@ import stirling.software.SPDF.service.SignatureService;
import stirling.software.common.configuration.InstallationPathConfig;
import stirling.software.common.configuration.RuntimePathConfig;
import stirling.software.common.service.UserServiceInterface;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.GeneralUtils;
@Controller
@@ -263,13 +264,17 @@ public class GeneralWebController {
}
return null;
} catch (Exception e) {
throw new RuntimeException("Error processing filename", e);
throw ExceptionUtils.createRuntimeException(
"error.fontLoadingFailed",
"Error processing font file",
e);
}
})
.filter(Objects::nonNull)
.toList();
} catch (Exception e) {
throw new RuntimeException("Failed to read font directory from " + locationPattern, e);
throw ExceptionUtils.createRuntimeException(
"error.fontDirectoryReadFailed", "Failed to read font directory", e);
}
}
@@ -19,6 +19,18 @@ public class ProcessPdfWithOcrRequest extends PDFFile {
defaultValue = "[\"eng\"]")
private List<String> languages;
@Schema(description = "Include OCR text in a sidecar text file if set to true")
private boolean sidecar;
@Schema(description = "Deskew the input file if set to true")
private boolean deskew;
@Schema(description = "Clean the input file if set to true")
private boolean clean;
@Schema(description = "Clean the final output if set to true")
private boolean cleanFinal;
@Schema(
description = "Specify the OCR type, e.g., 'skip-text', 'force-ocr', or 'Normal'",
requiredMode = Schema.RequiredMode.REQUIRED,
@@ -31,4 +43,7 @@ public class ProcessPdfWithOcrRequest extends PDFFile {
allowableValues = {"hocr", "sandwich"},
defaultValue = "hocr")
private String ocrRenderType = "hocr";
@Schema(description = "Remove images from the output PDF if set to true")
private boolean removeImagesAfter;
}
@@ -120,8 +120,8 @@ public class ApiDocService {
ObjectMapper mapper = new ObjectMapper();
apiDocsJsonRootNode = mapper.readTree(apiDocsJson);
JsonNode paths = apiDocsJsonRootNode.path("paths");
paths.fields()
.forEachRemaining(
paths.propertyStream()
.forEach(
entry -> {
String path = entry.getKey();
JsonNode pathNode = entry.getValue();
@@ -77,7 +77,7 @@ public class MetricsAggregatorService {
double lastCount = lastSentMetrics.getOrDefault(key, 0.0);
double difference = currentCount - lastCount;
if (difference > 0) {
logger.info("{}, {}", key, difference);
logger.debug("{}, {}", key, difference);
metrics.put(key, difference);
lastSentMetrics.put(key, currentCount);
}
@@ -1,7 +1,11 @@
package stirling.software.common.controller;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
@@ -14,6 +18,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import stirling.software.common.model.job.JobResult;
import stirling.software.common.model.job.ResultFile;
import stirling.software.common.service.FileStorage;
import stirling.software.common.service.JobQueue;
import stirling.software.common.service.TaskManager;
@@ -78,16 +83,31 @@ public class JobController {
return ResponseEntity.badRequest().body("Job failed: " + result.getError());
}
if (result.getFileId() != null) {
// Handle multiple files - return metadata for client to download individually
if (result.hasMultipleFiles()) {
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(
Map.of(
"jobId",
jobId,
"hasMultipleFiles",
true,
"files",
result.getAllResultFiles()));
}
// Handle single file (download directly)
if (result.hasFiles() && !result.hasMultipleFiles()) {
try {
byte[] fileContent = fileStorage.retrieveBytes(result.getFileId());
List<ResultFile> files = result.getAllResultFiles();
ResultFile singleFile = files.get(0);
byte[] fileContent = fileStorage.retrieveBytes(singleFile.getFileId());
return ResponseEntity.ok()
.header("Content-Type", result.getContentType())
.header("Content-Type", singleFile.getContentType())
.header(
"Content-Disposition",
"form-data; name=\"attachment\"; filename=\""
+ result.getOriginalFileName()
+ "\"")
createContentDispositionHeader(singleFile.getFileName()))
.body(fileContent);
} catch (Exception e) {
log.error("Error retrieving file for job {}: {}", jobId, e.getMessage(), e);
@@ -170,4 +190,127 @@ public class JobController {
}
}
}
/**
* Get the list of files for a job
*
* @param jobId The job ID
* @return List of files for the job
*/
@GetMapping("/api/v1/general/job/{jobId}/result/files")
public ResponseEntity<?> getJobFiles(@PathVariable("jobId") String jobId) {
JobResult result = taskManager.getJobResult(jobId);
if (result == null) {
return ResponseEntity.notFound().build();
}
if (!result.isComplete()) {
return ResponseEntity.badRequest().body("Job is not complete yet");
}
if (result.getError() != null) {
return ResponseEntity.badRequest().body("Job failed: " + result.getError());
}
List<ResultFile> files = result.getAllResultFiles();
return ResponseEntity.ok(
Map.of(
"jobId", jobId,
"fileCount", files.size(),
"files", files));
}
/**
* Get metadata for an individual file by its file ID
*
* @param fileId The file ID
* @return The file metadata
*/
@GetMapping("/api/v1/general/files/{fileId}/metadata")
public ResponseEntity<?> getFileMetadata(@PathVariable("fileId") String fileId) {
try {
// Verify file exists
if (!fileStorage.fileExists(fileId)) {
return ResponseEntity.notFound().build();
}
// Find the file metadata from any job that contains this file
ResultFile resultFile = taskManager.findResultFileByFileId(fileId);
if (resultFile != null) {
return ResponseEntity.ok(resultFile);
} else {
// File exists but no metadata found, get basic info efficiently
long fileSize = fileStorage.getFileSize(fileId);
return ResponseEntity.ok(
Map.of(
"fileId",
fileId,
"fileName",
"unknown",
"contentType",
"application/octet-stream",
"fileSize",
fileSize));
}
} catch (Exception e) {
log.error("Error retrieving file metadata {}: {}", fileId, e.getMessage(), e);
return ResponseEntity.internalServerError()
.body("Error retrieving file metadata: " + e.getMessage());
}
}
/**
* Download an individual file by its file ID
*
* @param fileId The file ID
* @return The file content
*/
@GetMapping("/api/v1/general/files/{fileId}")
public ResponseEntity<?> downloadFile(@PathVariable("fileId") String fileId) {
try {
// Verify file exists
if (!fileStorage.fileExists(fileId)) {
return ResponseEntity.notFound().build();
}
// Retrieve file content
byte[] fileContent = fileStorage.retrieveBytes(fileId);
// Find the file metadata from any job that contains this file
// This is for getting the original filename and content type
ResultFile resultFile = taskManager.findResultFileByFileId(fileId);
String fileName = resultFile != null ? resultFile.getFileName() : "download";
String contentType =
resultFile != null ? resultFile.getContentType() : "application/octet-stream";
return ResponseEntity.ok()
.header("Content-Type", contentType)
.header("Content-Disposition", createContentDispositionHeader(fileName))
.body(fileContent);
} catch (Exception e) {
log.error("Error retrieving file {}: {}", fileId, e.getMessage(), e);
return ResponseEntity.internalServerError()
.body("Error retrieving file: " + e.getMessage());
}
}
/**
* Create Content-Disposition header with UTF-8 filename support
*
* @param fileName The filename to encode
* @return Content-Disposition header value
*/
private String createContentDispositionHeader(String fileName) {
try {
String encodedFileName =
URLEncoder.encode(fileName, StandardCharsets.UTF_8)
.replace("+", "%20"); // URLEncoder uses + for spaces, but we want %20
return "attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + encodedFileName;
} catch (Exception e) {
// Fallback to basic filename if encoding fails
return "attachment; filename=\"" + fileName + "\"";
}
}
}
@@ -163,13 +163,74 @@ alphabet=الأبجدية
downloadPdf=تنزيل PDF
text=نص
font=الخط
selectFillter=- حدد -
selectFilter=- حدد -
pageNum=رقم الصفحة
sizes.small=صغير
sizes.medium=وسط
sizes.large=كبير
sizes.x-large=كبير جدا
error.pdfPassword=ملف PDF محمي بكلمة مرور ولم يتم تقديم كلمة المرور أو كانت غير صحيحة
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=حذف
username=اسم المستخدم
password=كلمة المرور
@@ -181,7 +242,6 @@ red=أحمر
green=أخضر
blue=أزرق
custom=مخصص...
WorkInProgess=العمل قيد التقدم، قد لا يعمل أو يحتوي على أخطاء، يرجى الإبلاغ عن أي مشاكل!
poweredBy=مدعوم بواسطة
yes=نعم
no=لا
@@ -525,6 +585,10 @@ home.addImage.title=إضافة صورة إلى ملف PDF
home.addImage.desc=إضافة صورة إلى موقع معين في PDF (العمل قيد التقدم)
addImage.tags=صورة,jpg,صورة,صورة فوتوغرافية
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=إضافة علامة مائية
home.watermark.desc=أضف علامة مائية مخصصة إلى مستند PDF الخاص بك.
watermark.tags=نص,تكرار,تسمية,خاص,حقوق النشر,علامة تجارية,صورة,jpg,صورة,صورة فوتوغرافية
@@ -1205,6 +1269,12 @@ addImage.everyPage=كل صفحة؟
addImage.upload=إضافة صورة
addImage.submit=إضافة صورة
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=دمج
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=قم بسحب المفات وإفلاتها هنا
fileChooser.extractPDF=جاري الاستخراج...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Releases
@@ -163,13 +163,74 @@ alphabet=Əlifba
downloadPdf=PDF Yüklə
text=Yazı
font=Şrift
selectFillter=-- Seç --
selectFilter=-- Seç --
pageNum=Səhifə nömrəsi
sizes.small=Kiçik
sizes.medium=Orta
sizes.large=Böyük
sizes.x-large=Ekstra Böyük
error.pdfPassword=PDF sənədi şifrlənmişdir və şifr təmin edilməmişdir və ya yanlışdır.
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Sil
username=İstifadəçi Adı
password=Şifr
@@ -181,7 +242,6 @@ red=Qırmızı
green=Yaşıl
blue=Mavi
custom=Xüsusi...
WorkInProgess=İş davam edir, İşləməyə bilər və ya xətalarla üzləşə bilərsiniz, Zəhmət olmasa problemləri bildirin!
poweredBy=Təchiz edilmişdir
yes=Bəli
no=Xeyr
@@ -525,6 +585,10 @@ home.addImage.title=Şəkil əlavə et
home.addImage.desc=PDF-də təyin edilmiş yerə şəkil əlavə edir
addImage.tags=şəkil,jpg,fotoşəkil,foto
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Watermark əlavə et
home.watermark.desc=PDF sənədinə fərdi watermark əlavə et.
watermark.tags=Mətn,təkrarlanan,nişan,sahib olmaq,müəllif hüquqları,əmtəə nişanı,şəkil,jpg,fotoşəkil,foto
@@ -1205,6 +1269,12 @@ addImage.everyPage=Bütün Səhifələr?
addImage.upload=Şəkli Əlavə Et
addImage.submit=Şəkli Əlavə Et
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Birləşdirin
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
fileChooser.extractPDF=Extracting...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Buraxılışlar
@@ -163,13 +163,74 @@ alphabet=Азбука
downloadPdf=Изтеглете PDF
text=Текст
font=Шрифт
selectFillter=-- Изберете --
selectFilter=-- Изберете --
pageNum=Брой страница
sizes.small=Малък
sizes.medium=Среден
sizes.large=Голям
sizes.x-large=X-Голям
error.pdfPassword=PDF документът е с парола и или паролата не е предоставена, или е неправилна
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Изтрий
username=Потребителско име
password=Парола
@@ -181,7 +242,6 @@ red=Червено
green=Зелено
blue=Синьо
custom=Персонализиране...
WorkInProgess=Работата е в ход, може да не работи или да има грешки, моля, докладвайте за проблеми!
poweredBy=Задвижван чрез
yes=Да
no=Не
@@ -525,6 +585,10 @@ home.addImage.title=Добавяне на изображение
home.addImage.desc=Добавя изображение към зададено място към PDF файла
addImage.tags=img,jpg,изображение,снимка
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Добавяне на воден знак
home.watermark.desc=Добавете персонализиран воден знак към вашия PDF документ.
watermark.tags=Текст,повтарящ се,етикет,собствено,авторско право,търговска марка,img,jpg,изображение,снимка
@@ -1205,6 +1269,12 @@ addImage.everyPage=Всяка страница?
addImage.upload=Добавяне на изображение
addImage.submit=Добавяне на изображение
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Обединяване
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Влачете и пуснете PDF файл
fileChooser.dragAndDropImage=Влачете и пуснете изображение
fileChooser.hoveredDragAndDrop=Влачете и пуснете файл(ове) тук
fileChooser.extractPDF=Извличане...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Версии
@@ -163,13 +163,74 @@ alphabet=གསལ་བྱེད།
downloadPdf=PDF ཕབ་ལེན།
text=ཡི་གེ
font=ཡིག་གཟུགས་ཌྷ
selectFillter=-- འདེམས་རོགས། --
selectFilter=-- འདེམས་རོགས། --
pageNum=ཤོག་གིངས།
sizes.small=ཆུང་ཆང་།
sizes.medium=འབྲིང་ཚད།
sizes.large=ཆེན་པོ།
sizes.x-large=ཧ་ཅང་ཆེན་པོ།
error.pdfPassword=PDF ཡིག་ཆར་གསང་ཚིག་བཀོད་ཡོད་པ་དང་། གསང་ཚིག་མ་བཀོད་པའམ་ནོར་འདུག
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=སུབ་པ།
username=སྤྱོད་མཁན་མིང་།
password=གསང་ཚིག།
@@ -181,7 +242,6 @@ red=དམར་པོ
green=ལྗང་ཁུ།
blue=སྔོན་པོ
custom=མཚན་ཉིད་རང་སྒྲིག...
WorkInProgess=ལས་ཀ་བྱེད་བཞིན་པ། ནོར་འཁྲུལ་ཡོང་སྲིད། དཀའ་ངལ་ཡོད་ཚེ་སྙན་སེང་གནང་རོགས།
poweredBy=མཁོ་སྲོད་བྱེད་མཁན།
yes=ཡིན།
no=མིན།
@@ -525,6 +585,10 @@ home.addImage.title=པར་རིས་སྣོན་པ།
home.addImage.desc=PDF ནང་གནས་ས་ངེས་ཅན་ཞིག་ཏུ་པར་རིས་སྣོན་པ།
addImage.tags=པར་རིས།,jpg,པར།,འདྲ་པར།
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=ཆུ་རྟགས་སྣོན་པ།
home.watermark.desc=PDF ཡིག་ཆར་རང་སྒྲིག་གི་ཆུ་རྟགས་སྣོན་པ།
watermark.tags=ཡི་གེ,བསྐྱར་ཟློས།,ཁ་ཡིག,རང་དབང་།,པར་དབང་།,ཚོང་རྟགས།,པར་རིས།,jpg,པར།,འདྲ་པར།
@@ -1205,6 +1269,12 @@ addImage.everyPage=ཤོག་ངོས་ཚང་མར་ཡིན་ནམ
addImage.upload=པར་རིས་སྣོན་པ།
addImage.submit=པར་རིས་སྣོན་པ།
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=སྡེབ་སྦྱོར།
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=PDF ཡིག་ཆ་འཐེན་ནས་འཇ
fileChooser.dragAndDropImage=པར་རིས་ཡིག་ཆ་འཐེན་ནས་འཇོག་པ།
fileChooser.hoveredDragAndDrop=ཡིག་ཆ་འདིར་འཐེན་ནས་འཇོག་པ།
fileChooser.extractPDF=འདོན་རིས་འགྱུར་བའི་སྒྲིག་བཏང་བ།
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=པར་གཞི།
@@ -163,13 +163,74 @@ alphabet=Alfabet
downloadPdf=Descarregueu PDF
text=Text
font=Tipus de lletra
selectFillter=-- Selecciona --
selectFilter=-- Selecciona --
pageNum=Número de pàgina
sizes.small=Petit
sizes.medium=Mitjà
sizes.large=Llarg
sizes.x-large=X-Large
error.pdfPassword=El PDF està protegit o bé el password és incorrecte
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Esborra
username=Usuari
password=Contrasenya
@@ -181,7 +242,6 @@ red=Vermell
green=Verd
blue=Blau
custom=Personalitzat...
WorkInProgess=En desenvolupament, pot no funcionar o contenir errors. Si us plau, informa de qualsevol problema!
poweredBy=Impulsat per
yes=Si
no=No
@@ -525,6 +585,10 @@ home.addImage.title=Afegir imatge a PDF
home.addImage.desc=Afegeix una imatge en un PDF (en progrés)
addImage.tags=img,jpg,imatge,foto
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Afegir Marca d'aigua
home.watermark.desc=Afegir una marca d'aigua personalitzada en un PDF
watermark.tags=text,repetició,etiqueta,propia,copyright,marca registrada,img,jpg,imatge,foto
@@ -1205,6 +1269,12 @@ addImage.everyPage=Totes les pàgines?
addImage.upload=Afegir Imatge
addImage.submit=Afegir Imatge
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Fusiona
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Arrossega i deixa anar un fitxer PDF
fileChooser.dragAndDropImage=Arrossega i deixa anar un fitxer d'imatge
fileChooser.hoveredDragAndDrop=Arrossega i deixa anar fitxer(s) aquí
fileChooser.extractPDF=Extracting...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Llançaments
@@ -163,13 +163,74 @@ alphabet=Abeceda
downloadPdf=Stáhnout PDF
text=Text
font=Písmo
selectFillter=-- Vybrat --
selectFilter=-- Vybrat --
pageNum=Číslo stránky
sizes.small=Malé
sizes.medium=Střední
sizes.large=Velké
sizes.x-large=Extra velké
error.pdfPassword=PDF dokument je chráněn heslem a buď heslo nebylo zadáno, nebo bylo nesprávné
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Smazat
username=Uživatelské jméno
password=Heslo
@@ -181,7 +242,6 @@ red=Červená
green=Zelená
blue=Modrá
custom=Vlastní...
WorkInProgess=Práce probíhá, nemusí fungovat nebo může obsahovat chyby. Prosím, nahlaste případné problémy!
poweredBy=Využívá
yes=Ano
no=Ne
@@ -525,6 +585,10 @@ home.addImage.title=Přidat obrázek
home.addImage.desc=Přidá obrázek na určené místo v PDF
addImage.tags=img,jpg,obrázek,fotka
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Přidat vodoznak
home.watermark.desc=Přidat vlastní vodoznak do vašeho PDF dokumentu.
watermark.tags=Text,opakující se,popisek,vlastní,copyright,ochranná známka,img,jpg,obrázek,fotka
@@ -1205,6 +1269,12 @@ addImage.everyPage=Každá stránka?
addImage.upload=Přidat obrázek
addImage.submit=Přidat obrázek
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Sloučit
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Přetáhnout PDF soubor
fileChooser.dragAndDropImage=Přetáhnout obrázek
fileChooser.hoveredDragAndDrop=Přetáhněte soubor(y) sem
fileChooser.extractPDF=Extrahování...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Vydání
@@ -163,13 +163,74 @@ alphabet=Alfabet
downloadPdf=Download PDF
text=Tekst
font=Skrifttype
selectFillter=-- Vælg --
selectFilter=-- Vælg --
pageNum=Sidenummer
sizes.small=Lille
sizes.medium=Mellem
sizes.large=Stor
sizes.x-large=X-Stor
error.pdfPassword=PDF-dokumentet er beskyttet med adgangskode, og enten blev adgangskoden ikke angivet eller var forkert
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Slet
username=Brugernavn
password=Adgangskode
@@ -181,7 +242,6 @@ red=Rød
green=Grøn
blue=Blå
custom=Brugerdefineret...
WorkInProgess=Arbejde i gang, Kan muligvis ikke virke eller have fejl, Rapportér venligst eventuelle problemer!
poweredBy=Drevet af
yes=Ja
no=Nej
@@ -525,6 +585,10 @@ home.addImage.title=Tilføj billede
home.addImage.desc=Tilføjer et billede på en bestemt placering på PDF'en
addImage.tags=img,jpg,billede,foto
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Tilføj Vandmærke
home.watermark.desc=Tilføj et brugerdefineret vandmærke til dit PDF-dokument.
watermark.tags=Tekst,gentagne,etiket,egen,ophavsret,varemærke,img,jpg,billede,foto
@@ -1205,6 +1269,12 @@ addImage.everyPage=Hver Side?
addImage.upload=Tilføj billede
addImage.submit=Tilføj billede
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Flet
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
fileChooser.extractPDF=Extracting...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Releases
@@ -138,7 +138,7 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Schriftgröße
addPageNumbers.fontName=Schriftart
pdfPrompt=PDF(s) auswählen
multiPdfPrompt=PDFs auswählen(2+)
multiPdfPrompt=PDFs auswählen (2+)
multiPdfDropPrompt=Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin)
imgPrompt=Wählen Sie ein Bild
genericSubmit=Absenden
@@ -146,7 +146,7 @@ uploadLimit=Maximale Dateigröße:
uploadLimitExceededSingular=ist zu groß. Die maximal zulässige Größe ist
uploadLimitExceededPlural=sind zu groß. Die maximal zulässige Größe ist
processTimeWarning=Achtung: Abhängig von der Dateigröße kann dieser Prozess bis zu einer Minute dauern
pageOrderPrompt=Seitenreihenfolge (Geben Sie eine durch Komma getrennte Liste von Seitenzahlen ein):
pageOrderPrompt=Seitenreihenfolge (Geben Sie eine durch Kommas getrennte Liste von Seitenzahlen ein):
pageSelectionPrompt=Benutzerdefinierte Seitenauswahl (Geben Sie eine durch Kommas getrennte Liste von Seitenzahlen 1,5,6 oder Funktionen wie 2n+1 ein):
goToPage=Los
true=Wahr
@@ -163,13 +163,74 @@ alphabet=Alphabet
downloadPdf=PDF herunterladen
text=Text
font=Schriftart
selectFillter=-- Auswählen --
selectFilter=-- Auswählen --
pageNum=Seitenzahl
sizes.small=Klein
sizes.medium=Mittel
sizes.large=Groß
sizes.x-large=Extra Groß
error.pdfPassword=Das PDF-Dokument ist passwortgeschützt und das Passwort wurde entweder nicht angegeben oder war falsch
error.pdfCorrupted=Die PDF-Datei scheint beschädigt zu sein. Bitte nutzen Sie zuerst die Funktion "PDFs reparieren", um die Datei zu beheben, bevor Sie fortfahren.
error.pdfCorruptedMultiple=Eine oder mehrere PDF-Dateien scheinen beschädigt zu sein. Bitte versuchen Sie, jede Datei zunächst mit der Funktion "PDFs reparieren" zu korrigieren, bevor Sie sie zusammenführen.
error.pdfCorruptedDuring=Fehler {0}: Die PDF-Datei scheint beschädigt zu sein. Bitte nutzen Sie zuerst die Funktion "PDFs reparieren", um die Datei zu beheben, bevor Sie fortfahren.
# Frontend corruption error messages
error.pdfInvalid=Die PDF-Datei "{0}" scheint beschädigt oder ungültig zu sein. Bitte versuchen Sie, die Datei mit der Funktion "PDFs reparieren" zu beheben.
error.tryRepair=Versuchen Sie, beschädigte Dateien mit der Funktion "PDFs reparieren" zu beheben.
# Additional error messages
error.pdfEncryption=Die PDF-Datei enthält möglicherweise beschädigte Verschlüsselungsdaten. Dies kann auftreten, wenn sie mit inkompatiblen Methoden erstellt wurde. Bitte versuchen Sie zunächst die Funktion "PDFs reparieren" oder kontaktieren Sie den Ersteller für eine neue Kopie.
error.fileProcessing=Beim Verarbeiten der Datei während des Vorgangs {0} ist ein Fehler aufgetreten: {1}
# Generic error message templates
error.toolNotInstalled={0} ist nicht installiert.
error.toolRequired={0} wird für {1} benötigt.
error.conversionFailed={0} Konvertierung fehlgeschlagen
error.commandFailed={0} Befehl fehlgeschlagen
error.algorithmNotAvailable={0}-Algorithmus nicht verfügbar
error.optionsNotSpecified=Optionen für {0} wurden nicht angegeben.
error.fileFormatRequired=Die Datei muss im Format {0} vorliegen.
error.invalidFormat=Ungültiges {0}-Format: {1}
error.endpointDisabled=Dieser Endpunkt wurde vom Administrator deaktiviert.
error.urlNotReachable=Die URL ist nicht erreichbar, bitte geben Sie eine gültige URL an.
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=Der DPI-Wert {0} überschreitet das sichere Maximum von {1}. Hohe DPI-Werte können zu Speicherproblemen und Abstürzen führen. Bitte verwende einen niedrigeren DPI-Wert.
error.pageTooBigForDpi=Die PDF-Seite {0} ist zu groß, um mit {1} DPI gerendert zu werden. Bitte versuche einen niedrigeren DPI-Wert (empfohlen: 150 oder weniger).
error.pageTooBigExceedsArray=Die PDF-Seite {0} ist zu groß, um mit {1} DPI gerendert zu werden. Das Ergebnis überschreitet die zulässige Größe. Bitte versuche einen niedrigeren DPI-Wert (empfohlen: 150 oder weniger).
error.pageTooBigFor300Dpi=Die PDF-Seite {0} ist zu groß, um mit 300 DPI gerendert zu werden. Das Ergebnis überschreitet die zulässige Größe. Bitte verwende für die PDF-zu-Bild-Konvertierung einen niedrigeren DPI-Wert.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API-Schlüssel ist ungültig.
error.userNotFound=Benutzer nicht gefunden.
error.passwordRequired=Passwort darf nicht leer sein.
error.accountLocked=Ihr Konto wurde aufgrund zu vieler fehlgeschlagener Anmeldeversuche gesperrt.
error.invalidEmail=Ungültige E-Mail-Adressen angegeben.
error.emailAttachmentRequired=Für das Versenden der E-Mail ist ein Anhang erforderlich.
error.signatureNotFound=Signaturdatei nicht gefunden.
# File processing messages
error.fileNotFound=Datei mit der ID {0} nicht gefunden.
# Database and configuration messages
error.noBackupScripts=Keine Backup-Skripte gefunden.
error.unsupportedProvider={0} wird derzeit nicht unterstützt.
error.pathTraversalDetected=Pfad-Traversal aus Sicherheitsgründen erkannt.
# Validation messages
error.invalidArgument=Ungültiges Argument: {0}
error.argumentRequired={0} darf nicht null sein.
error.operationFailed=Vorgang fehlgeschlagen: {0}
error.angleNotMultipleOf90=Der Winkel muss ein Vielfaches von 90 sein.
error.pdfBookmarksNotFound=Keine PDF-Lesezeichen/Gliederung im Dokument gefunden.
error.fontLoadingFailed=Fehler bei der Verarbeitung der Schriftdatei.
error.fontDirectoryReadFailed=Konnte das Schriftverzeichnis nicht lesen.
delete=Löschen
username=Benutzername
password=Passwort
@@ -181,7 +242,6 @@ red=Rot
green=Grün
blue=Blau
custom=benutzerdefiniert...
WorkInProgess=In Arbeit, funktioniert möglicherweise nicht oder ist fehlerhaft. Bitte melden Sie alle Probleme!
poweredBy=Unterstützt von
yes=Ja
no=Nein
@@ -200,7 +260,7 @@ disabledCurrentUserMessage=Der aktuelle Benutzer kann nicht deaktiviert werden
downgradeCurrentUserLongMessage=Die Rolle des aktuellen Benutzers kann nicht herabgestuft werden. Daher wird der aktuelle Benutzer nicht angezeigt.
userAlreadyExistsOAuthMessage=Der Benutzer ist bereits als OAuth2-Benutzer vorhanden.
userAlreadyExistsWebMessage=Der Benutzer ist bereits als Webbenutzer vorhanden.
invalidRoleMessage=Invalid role.
invalidRoleMessage=Ungültige Rolle.
error=Fehler
oops=Hoppla!
help=Hilfe
@@ -213,7 +273,7 @@ color=Farbe
sponsor=Sponsor
info=Informationen
pro=Pro
proFeatures=Pro Features
proFeatures=Pro-Funktionen
page=Seite
pages=Seiten
loading=Laden...
@@ -244,7 +304,7 @@ pipeline.configureButton=Konfigurieren
pipeline.defaultOption=Benutzerdefiniert
pipeline.submitButton=Ausführen
pipeline.help=Hilfe für Pipeline
pipeline.scanHelp=Hilfe zum Ordnerscan
pipeline.scanHelp=Hilfe zum Ordner-Scan
pipeline.deletePrompt=Möchten Sie die Pipeline wirklich löschen?
######################
@@ -275,7 +335,7 @@ enterpriseEdition.proTeamFeatureDisabled=Teammanagementfunktionen erfordern eine
#################
analytics.title=Möchten Sie Stirling-PDF verbessern?
analytics.paragraph1=Stirling-PDF verfügt über Opt-in-Analytics, die uns helfen, das Produkt zu verbessern. Wir zeichnen keine persönlichen Informationen oder Dateiinhalte auf.
analytics.paragraph2=Bitte erwägen Sie die Analytics zu aktivieren, um Stirling-PDF beim Wachsen zu helfen und um unsere User besser zu verstehen.
analytics.paragraph2=Bitte erwägen Sie, Analytics zu aktivieren, um Stirling-PDF beim Wachstum zu unterstützen und um unsere Benutzer besser zu verstehen.
analytics.enable=Analytics aktivieren
analytics.disable=Analytics deaktivieren
analytics.settings=Sie können die Einstellungen für die Analytics in der config/settings.yml Datei bearbeiten
@@ -525,6 +585,10 @@ home.addImage.title=Bild einfügen
home.addImage.desc=Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit)
addImage.tags=img,jpg,bild,foto
home.attachments.title=Anhänge hinzufügen
home.attachments.desc=Eingebettete Dateien (Anhänge) zu einem PDF hinzufügen oder daraus entfernen
attachments.tags=einbetten, anhängen, datei, anhang, anhänge
home.watermark.title=Wasserzeichen hinzufügen
home.watermark.desc=Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu
watermark.tags=text,wiederholend,beschriftung,besitzen,urheberrecht,marke,img,jpg,bild,foto
@@ -607,7 +671,7 @@ home.flatten.title=Abflachen
home.flatten.desc=Alle interaktiven Elemente und Formulare aus einem PDF entfernen
flatten.tags=statisch,deaktivieren,nicht interaktiv,optimieren
home.repair.title=Reparatur
home.repair.title=PDFs reparieren
home.repair.desc=Versucht, ein beschädigtes/kaputtes PDF zu reparieren
repair.tags=reparieren,wiederherstellen,korrigieren,wiederherstellen
@@ -676,21 +740,21 @@ home.HTMLToPDF.desc=Konvertiert jede HTML-Datei oder Zip-Archiv zu PDF
HTMLToPDF.tags=markup,webinhalt,transformation,konvertierung
#eml-to-pdf
home.EMLToPDF.title=Email to PDF
home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images
EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail
home.EMLToPDF.title=E-Mail zu PDF
home.EMLToPDF.desc=Konvertiert E-Mail-(EML-)Dateien inklusive Kopfzeilen, Text und eingebetteten Bildern in das PDF-Format
EMLToPDF.tags=e-mail,conversion,eml,nachricht,transformation,konvertieren,mail
EMLToPDF.title=Email To PDF
EMLToPDF.header=Email To PDF
EMLToPDF.submit=Convert
EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF
EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues
EMLToPDF.includeAttachments=Include attachments in PDF
EMLToPDF.maxAttachmentSize=Maximum attachment size (MB)
EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images
EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both
EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code.
EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs
EMLToPDF.title=E-Mail zu PDF
EMLToPDF.header=E-Mail zu PDF
EMLToPDF.submit=Konvertieren
EMLToPDF.downloadHtml=HTML-Zwischendatei statt PDF herunterladen
EMLToPDF.downloadHtmlHelp=Damit können Sie die HTML-Version vor der PDF-Konvertierung ansehen und Formatierungsprobleme beheben
EMLToPDF.includeAttachments=Anhänge in PDF einfügen
EMLToPDF.maxAttachmentSize=Maximale Anhangsgröße (MB)
EMLToPDF.help=Konvertiert E-Mail-(EML-)Dateien inklusive Kopfzeilen, Text und eingebetteten Bildern in das PDF-Format
EMLToPDF.troubleshootingTip1=E-Mail zu HTML ist zuverlässiger, daher wird bei Stapelverarbeitung empfohlen, beide Versionen zu speichern
EMLToPDF.troubleshootingTip2=Bei wenigen E-Mails können Sie bei fehlerhaftem PDF das HTML herunterladen und problematischen HTML/CSS-Code anpassen
EMLToPDF.troubleshootingTip3=Einbettungen funktionieren jedoch nicht mit HTML-Dateien
home.MarkdownToPDF.title=Markdown zu PDF
home.MarkdownToPDF.desc=Konvertiert jede Markdown-Datei zu PDF
@@ -877,28 +941,28 @@ getPdfInfo.title=Alle Informationen anzeigen
getPdfInfo.header=Alle Informationen anzeigen
getPdfInfo.submit=Informationen anzeigen
getPdfInfo.downloadJson=Als JSON herunterladen
getPdfInfo.summary=PDF Summary
getPdfInfo.summary.encrypted=This PDF is encrypted so may face issues with some applications
getPdfInfo.summary.permissions=This PDF has {0} restricted permissions which may limit what you can do with it
getPdfInfo.summary.compliance=This PDF complies with the {0} standard
getPdfInfo.summary.basicInfo=Basic Information
getPdfInfo.summary.docInfo=Document Information
getPdfInfo.summary.encrypted.alert=Encrypted PDF - This document is password protected
getPdfInfo.summary.not.encrypted.alert=Unencrypted PDF - No password protection
getPdfInfo.summary.permissions.alert=Restricted Permissions - {0} actions are not allowed
getPdfInfo.summary.all.permissions.alert=All Permissions Allowed
getPdfInfo.summary.compliance.alert={0} Compliant
getPdfInfo.summary.no.compliance.alert=No Compliance Standards
getPdfInfo.summary.security.section=Security Status
getPdfInfo.section.BasicInfo=Basic Information about the PDF document including file size, page count, and language
getPdfInfo.section.Metadata=Document metadata including title, author, creation date and other document properties
getPdfInfo.section.DocumentInfo=Technical details about the PDF document structure and version
getPdfInfo.section.Compliancy=PDF standards compliance information (PDF/A, PDF/X, etc.)
getPdfInfo.section.Encryption=Security and encryption details of the document
getPdfInfo.section.Permissions=Document permission settings that control what actions can be performed
getPdfInfo.section.Other=Additional document components like bookmarks, layers, and embedded files
getPdfInfo.section.FormFields=Interactive form fields present in the document
getPdfInfo.section.PerPageInfo=Detailed information about each page in the document
getPdfInfo.summary=PDF-Zusammenfassung
getPdfInfo.summary.encrypted=Dieses PDF ist verschlüsselt und kann in manchen Anwendungen Probleme verursachen.
getPdfInfo.summary.permissions=Dieses PDF hat {0} eingeschränkte Berechtigungen, was Ihre Möglichkeiten einschränken kann.
getPdfInfo.summary.compliance=Dieses PDF entspricht dem Standard {0}.
getPdfInfo.summary.basicInfo=Grundlegende Informationen
getPdfInfo.summary.docInfo=Dokumentinformationen
getPdfInfo.summary.encrypted.alert=Verschlüsseltes PDF Dieses Dokument ist passwortgeschützt.
getPdfInfo.summary.not.encrypted.alert=Nicht verschlüsseltes PDF Kein Passwortschutz.
getPdfInfo.summary.permissions.alert=Eingeschränkte Berechtigungen {0} Aktionen sind nicht erlaubt.
getPdfInfo.summary.all.permissions.alert=Alle Berechtigungen erlaubt
getPdfInfo.summary.compliance.alert={0}-konform
getPdfInfo.summary.no.compliance.alert=Kein Konformitätsstandard
getPdfInfo.summary.security.section=Sicherheitsstatus
getPdfInfo.section.BasicInfo=Grundlegende Informationen über das PDF-Dokument inklusive Dateigröße, Seitenanzahl und Sprache.
getPdfInfo.section.Metadata=Dokumentenmetadaten inklusive Titel, Autor, Erstellungsdatum und weiteren Eigenschaften.
getPdfInfo.section.DocumentInfo=Technische Details zur Struktur und Version des PDF-Dokuments.
getPdfInfo.section.Compliancy=Informationen zur Einhaltung von PDF-Standards (PDF/A, PDF/X, etc.).
getPdfInfo.section.Encryption=Sicherheits- und Verschlüsselungsdetails des Dokuments.
getPdfInfo.section.Permissions=Dokumentenberechtigungen, die festlegen, welche Aktionen erlaubt sind.
getPdfInfo.section.Other=Zusätzliche Dokumentbestandteile wie Lesezeichen, Ebenen und eingebettete Dateien.
getPdfInfo.section.FormFields=Interaktive Formularfelder im Dokument.
getPdfInfo.section.PerPageInfo=Detaillierte Informationen zu jeder Seite im Dokument.
#markdown-to-pdf
@@ -948,7 +1012,7 @@ AddStampRequest.header=PDF Stempel
AddStampRequest.title=PDF Stempel
AddStampRequest.stampType=Stempeltyp
AddStampRequest.stampText=Stempeltext
AddStampRequest.stampImage=Stampelbild
AddStampRequest.stampImage=Stempelbild
AddStampRequest.alphabet=Alphabet
AddStampRequest.fontSize=Schriftart/Bildgröße
AddStampRequest.rotation=Drehung
@@ -1205,6 +1269,12 @@ addImage.everyPage=In jede Seite einfügen?
addImage.upload=Bild hinzufügen
addImage.submit=Bild hinzufügen
#attachments
attachments.title=Anhänge hinzufügen
attachments.header=Anhänge hinzufügen
attachments.description=Ermöglicht das Hinzufügen von Anhängen zum PDF
attachments.descriptionPlaceholder=Beschreibung für die Anhänge eingeben...
attachments.addButton=Anhänge hinzufügen
#merge
merge.title=Zusammenführen
@@ -1212,7 +1282,7 @@ merge.header=Mehrere PDFs zusammenführen (2+)
merge.sortByName=Nach Namen sortieren
merge.sortByDate=Nach Datum sortieren
merge.removeCertSign=Digitale Signatur in der zusammengeführten Datei entfernen?
merge.generateToc=Generate table of contents in the merged file?
merge.generateToc=Inhaltsverzeichnis in der zusammengeführten Datei erstellen?
merge.submit=Zusammenführen
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF-Datei
fileChooser.dragAndDropImage=Drag & Drop Bilddatei
fileChooser.hoveredDragAndDrop=Datei(en) hierhin Ziehen & Fallenlassen
fileChooser.extractPDF=Extrahiere...
fileChooser.addAttachments=Drag & Drop Anhänge
#release notes
releases.footer=Veröffentlichungen
@@ -1638,82 +1709,82 @@ validateSignature.cert.selfSigned=Selbstsigniert
validateSignature.cert.bits=bits
# Audit Dashboard
audit.dashboard.title=Audit Dashboard
audit.dashboard.systemStatus=Audit System Status
audit.dashboard.title=Audit-Dashboard
audit.dashboard.systemStatus=Systemstatus prüfen
audit.dashboard.status=Status
audit.dashboard.enabled=Enabled
audit.dashboard.disabled=Disabled
audit.dashboard.currentLevel=Current Level
audit.dashboard.retentionPeriod=Retention Period
audit.dashboard.days=days
audit.dashboard.totalEvents=Total Events
audit.dashboard.enabled=Aktiviert
audit.dashboard.disabled=Deaktiviert
audit.dashboard.currentLevel=Aktuelle Ebene
audit.dashboard.retentionPeriod=Aufbewahrungsdauer
audit.dashboard.days=Tage
audit.dashboard.totalEvents=Gesamtereignisse
# Audit Dashboard Tabs
audit.dashboard.tab.dashboard=Dashboard
audit.dashboard.tab.events=Audit Events
audit.dashboard.tab.events=Überwachungsereignisse
audit.dashboard.tab.export=Export
# Dashboard Charts
audit.dashboard.eventsByType=Events by Type
audit.dashboard.eventsByUser=Events by User
audit.dashboard.eventsOverTime=Events Over Time
audit.dashboard.period.7days=7 Days
audit.dashboard.period.30days=30 Days
audit.dashboard.period.90days=90 Days
audit.dashboard.eventsByType=Ereignisse nach Typ
audit.dashboard.eventsByUser=Ereignisse nach Benutzer
audit.dashboard.eventsOverTime=Ereignisse im Laufe der Zeit
audit.dashboard.period.7days=7 Tage
audit.dashboard.period.30days=30 Tage
audit.dashboard.period.90days=90 Tage
# Events Tab
audit.dashboard.auditEvents=Audit Events
audit.dashboard.filter.eventType=Event Type
audit.dashboard.filter.allEventTypes=All event types
audit.dashboard.filter.user=User
audit.dashboard.filter.userPlaceholder=Filter by user
audit.dashboard.filter.startDate=Start Date
audit.dashboard.filter.endDate=End Date
audit.dashboard.filter.apply=Apply Filters
audit.dashboard.filter.reset=Reset Filters
audit.dashboard.auditEvents=Überwachungsereignisse
audit.dashboard.filter.eventType=Ereignisart
audit.dashboard.filter.allEventTypes=Alle Ereignisstypen
audit.dashboard.filter.user=Benutzer
audit.dashboard.filter.userPlaceholder=Nach Benutzer filtern
audit.dashboard.filter.startDate=Startdatum
audit.dashboard.filter.endDate=Enddatum
audit.dashboard.filter.apply=Filter anwenden
audit.dashboard.filter.reset=Filter zurücksetzen
# Table Headers
audit.dashboard.table.id=ID
audit.dashboard.table.time=Time
audit.dashboard.table.user=User
audit.dashboard.table.type=Type
audit.dashboard.table.time=Zeit
audit.dashboard.table.user=Benutzer
audit.dashboard.table.type=Typ
audit.dashboard.table.details=Details
audit.dashboard.table.viewDetails=View Details
audit.dashboard.table.viewDetails=Details anzeigen
# Pagination
audit.dashboard.pagination.show=Show
audit.dashboard.pagination.entries=entries
audit.dashboard.pagination.pageInfo1=Page
audit.dashboard.pagination.pageInfo2=of
audit.dashboard.pagination.totalRecords=Total records:
audit.dashboard.pagination.show=Zeigen
audit.dashboard.pagination.entries=Einträge
audit.dashboard.pagination.pageInfo1=Seite
audit.dashboard.pagination.pageInfo2=von
audit.dashboard.pagination.totalRecords=Gesamtdatensätze:
# Modal
audit.dashboard.modal.eventDetails=Event Details
audit.dashboard.modal.eventDetails=Ereignisdetails
audit.dashboard.modal.id=ID
audit.dashboard.modal.user=User
audit.dashboard.modal.type=Type
audit.dashboard.modal.time=Time
audit.dashboard.modal.data=Data
audit.dashboard.modal.user=Benutzer
audit.dashboard.modal.type=Typ
audit.dashboard.modal.time=Zeit
audit.dashboard.modal.data=Daten
# Export Tab
audit.dashboard.export.title=Export Audit Data
audit.dashboard.export.format=Export Format
audit.dashboard.export.csv=CSV (Comma Separated Values)
audit.dashboard.export.json=JSON (JavaScript Object Notation)
audit.dashboard.export.button=Export Data
audit.dashboard.export.infoTitle=Export Information
audit.dashboard.export.infoDesc1=The export will include all audit events matching the selected filters. For large datasets, the export may take a few moments to generate.
audit.dashboard.export.infoDesc2=Exported data will include:
audit.dashboard.export.infoItem1=Event ID
audit.dashboard.export.infoItem2=User
audit.dashboard.export.infoItem3=Event Type
audit.dashboard.export.infoItem4=Timestamp
audit.dashboard.export.infoItem5=Event Data
audit.dashboard.export.title=Audit-Daten exportieren
audit.dashboard.export.format=Exportformat
audit.dashboard.export.csv=CSV (Kommagetrennte Werte)
audit.dashboard.export.json=JSON (JavaScript-Objektnotation)
audit.dashboard.export.button=Daten exportieren
audit.dashboard.export.infoTitle=Informationen zum Export
audit.dashboard.export.infoDesc1=Der Export umfasst alle Protokollereignisse, die den gewählten Filtern entsprechen. Bei großen Datenmengen kann die Erstellung einige Zeit dauern.
audit.dashboard.export.infoDesc2=Exportierte Daten enthalten:
audit.dashboard.export.infoItem1=Ereignis-ID
audit.dashboard.export.infoItem2=Benutzer
audit.dashboard.export.infoItem3=Ereignistyp
audit.dashboard.export.infoItem4=Zeitstempel
audit.dashboard.export.infoItem5=Ereignisdaten
# JavaScript i18n keys
audit.dashboard.js.noEventsFound=No audit events found matching the current filters
audit.dashboard.js.errorLoading=Error loading data:
audit.dashboard.js.errorRendering=Error rendering table:
audit.dashboard.js.loadingPage=Loading page
audit.dashboard.js.noEventsFound=Keine Protokollereignisse mit den aktuellen Filtern gefunden
audit.dashboard.js.errorLoading=Fehler beim Laden der Daten:
audit.dashboard.js.errorRendering=Fehler beim Anzeigen der Tabelle:
audit.dashboard.js.loadingPage=Seite wird geladen
####################
# Cookie banner #
@@ -163,13 +163,74 @@ alphabet=Αλφάβητο
downloadPdf=Λήψη PDF
text=Κείμενο
font=Γραμματοσειρά
selectFillter=-- Επιλέξτε --
selectFilter=-- Επιλέξτε --
pageNum=Αριθμός σελίδας
sizes.small=Μικρό
sizes.medium=Μεσαίο
sizes.large=Μεγάλο
sizes.x-large=Πολύ μεγάλο
error.pdfPassword=Το PDF έχει προστασία κωδικού και είτε δεν δόθηκε κωδικός ή ήταν λανθασμένος
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Διαγραφή
username=Όνομα χρήστη
password=Κωδικός
@@ -181,7 +242,6 @@ red=Κόκκινο
green=Πράσινο
blue=Μπλε
custom=Προσαρμογή...
WorkInProgess=Εργασία σε εξέλιξη, μπορεί να μην λειτουργεί ή να έχει σφάλματα, παρακαλώ αναφέρετε τυχόν προβλήματα!
poweredBy=Με την υποστήριξη του
yes=Ναι
no=Όχι
@@ -525,6 +585,10 @@ home.addImage.title=Προσθήκη εικόνας
home.addImage.desc=Προσθήκη εικόνας σε συγκεκριμένη θέση στο PDF
addImage.tags=εικόνα,jpg,φωτογραφία
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Προσθήκη υδατογραφήματος
home.watermark.desc=Προσθήκη προσαρμοσμένου υδατογραφήματος στο έγγραφο PDF.
watermark.tags=κείμενο,επαναλαμβανόμενο,ετικέτα,ιδιοκτησία,πνευματικά δικαιώματα,εμπορικό σήμα,εικόνα,jpg,φωτογραφία
@@ -1205,6 +1269,12 @@ addImage.everyPage=Κάθε σελίδα;
addImage.upload=Προσθήκη εικόνας
addImage.submit=Προσθήκη εικόνας
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Συγχώνευση
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Σύρετε & αφήστε αρχείο PDF
fileChooser.dragAndDropImage=Σύρετε & αφήστε αρχείο εικόνας
fileChooser.hoveredDragAndDrop=Σύρετε & αφήστε αρχείο(α) εδώ
fileChooser.extractPDF=Εξαγωγή...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Εκδόσεις
@@ -163,13 +163,74 @@ alphabet=Alphabet
downloadPdf=Download PDF
text=Text
font=Font
selectFillter=-- Select --
selectFilter=-- Select --
pageNum=Page Number
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Delete
username=Username
password=Password
@@ -181,7 +242,6 @@ red=Red
green=Green
blue=Blue
custom=Custom...
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by
yes=Yes
no=No
@@ -163,13 +163,74 @@ alphabet=Alphabet
downloadPdf=Download PDF
text=Text
font=Font
selectFillter=-- Select --
selectFilter=-- Select --
pageNum=Page Number
sizes.small=Small
sizes.medium=Medium
sizes.large=Large
sizes.x-large=X-Large
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Delete
username=Username
password=Password
@@ -181,7 +242,6 @@ red=Red
green=Green
blue=Blue
custom=Custom...
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by
yes=Yes
no=No
@@ -525,6 +585,10 @@ home.addImage.title=Add image
home.addImage.desc=Adds a image onto a set location on the PDF
addImage.tags=img,jpg,picture,photo
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Add Watermark
home.watermark.desc=Add a custom watermark to your PDF document.
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
@@ -1205,6 +1269,12 @@ addImage.everyPage=Every Page?
addImage.upload=Add image
addImage.submit=Add image
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Merge
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
fileChooser.extractPDF=Extracting...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Releases
@@ -163,13 +163,74 @@ alphabet=Alfabeto
downloadPdf=Descargar PDF
text=Texto
font=Fuente
selectFillter=-- Seleccionar --
selectFilter=-- Seleccionar --
pageNum=Número de página
sizes.small=Pequeño
sizes.medium=Mediano
sizes.large=Grande
sizes.x-large=Extra grande
error.pdfPassword=El documento PDF está protegido con contraseña y no se ha proporcionado o es incorrecta
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Borrar
username=Nombre de usuario
password=Contraseña
@@ -181,7 +242,6 @@ red=Rojo
green=Verde
blue=Azul
custom=Personalizado...
WorkInProgess=Tarea en progreso, puede no funcionar o ralentizarse; ¡por favor, informe de cualquier problema!
poweredBy=Desarrollado por
yes=
no=No
@@ -525,6 +585,10 @@ home.addImage.title=Agregar imagen al PDF
home.addImage.desc=Agregar una imagen en el PDF en una ubicación establecida (en desarrollo)
addImage.tags=img,jpg,imagen,fotografía
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Añadir marca de agua
home.watermark.desc=Añadir una marca de agua predefinida al documento PDF
watermark.tags=Texto,repetir,etiquetar,propietario,copyright,marca comercial,img,jpg,imagen,fotografía
@@ -1205,6 +1269,12 @@ addImage.everyPage=¿Todas las páginas?
addImage.upload=Añadir imagen
addImage.submit=Enviar imagen
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Unir
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Arrastrar & Soltar archivo PDF
fileChooser.dragAndDropImage=Arrastrar & Soltar archivo de Imagen
fileChooser.hoveredDragAndDrop=Arrastrar & Soltar archivos(s) aquí
fileChooser.extractPDF=Extrayendo...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Versiones
@@ -163,13 +163,74 @@ alphabet=Alfabetoa
downloadPdf=PDFa deskargatu
text=Testua
font=Letra-tipoa
selectFillter=-- Aukeratu filtroa --
selectFilter=-- Aukeratu filtroa --
pageNum=Orrialde-zenbakia
sizes.small=Txikia
sizes.medium=Erdikoa
sizes.large=Handia
sizes.x-large=Oso handia
error.pdfPassword=PDF dokumentua pasahitzarekin babestuta dago eta pasahitza ez da sartu edo okerra da
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=ezabatu
username=Erabiltzaile izena
password=Pasahitza
@@ -181,7 +242,6 @@ red=Gorria
green=Berdea
blue=Urdina
custom=Pertsonalizatu...
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by
yes=Yes
no=No
@@ -525,6 +585,10 @@ home.addImage.title=Gehitu irudia PDFari
home.addImage.desc=Gehitu irudi bat PDFan ezarritako kokaleku batean (lanean)
addImage.tags=img,jpg,picture,photo
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Gehitu ur-marka
home.watermark.desc=Gehitu aurrez zehaztutako ur-marka bat PFD dokumentuari
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
@@ -1205,6 +1269,12 @@ addImage.everyPage=Orrialde guztiak?
addImage.upload=Gehitu irudia
addImage.submit=Gehitu irudia
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Elkartu
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
fileChooser.extractPDF=Extracting...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Releases
@@ -163,13 +163,74 @@ alphabet=حروف الفبا
downloadPdf=دانلود PDF
text=متن
font=فونت
selectFillter=-- انتخاب کنید --
selectFilter=-- انتخاب کنید --
pageNum=شماره صفحه
sizes.small=کوچک
sizes.medium=متوسط
sizes.large=بزرگ
sizes.x-large=خیلی بزرگ
error.pdfPassword=سند PDF دارای رمز عبور است و یا رمز عبور وارد نشده یا نادرست است
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=حذف
username=نام کاربری
password=رمز عبور
@@ -181,7 +242,6 @@ red=قرمز
green=سبز
blue=آبی
custom=سفارشی...
WorkInProgess=کار در حال پیشرفت است، ممکن است کار نکند یا دارای اشکال باشد، لطفاً هر مشکلی را گزارش دهید!
poweredBy=قدرت گرفته از
yes=بله
no=خیر
@@ -525,6 +585,10 @@ home.addImage.title=افزودن تصویر
home.addImage.desc=افزودن یک تصویر به یک مکان مشخص در PDF
addImage.tags=تصویر،jpg،عکس
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=افزودن واترمارک
home.watermark.desc=افزودن یک واترمارک سفارشی به سند PDF.
watermark.tags=متن،تکراری،برچسب،خود،کپی‌رایت،علامت تجاری،تصویر،jpg،عکس
@@ -1205,6 +1269,12 @@ addImage.everyPage=هر صفحه؟
addImage.upload=افزودن تصویر
addImage.submit=افزودن تصویر
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=ادغام
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=فایل(های) خود را اینجا بکشید و رها کنید
fileChooser.extractPDF=در حال استخراج...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=نسخه‌ها
@@ -142,9 +142,9 @@ multiPdfPrompt=Sélectionnez les PDF
multiPdfDropPrompt=Sélectionnez (ou glissez-déposez) tous les PDF dont vous avez besoin
imgPrompt=Choisir une image
genericSubmit=Envoyer
uploadLimit=Maximum file size:
uploadLimitExceededSingular=is too large. Maximum allowed size is
uploadLimitExceededPlural=are too large. Maximum allowed size is
uploadLimit=Taille maximale du fichier :
uploadLimitExceededSingular=est trop grand. La taille maximale autorisée est de
uploadLimitExceededPlural=sont trop grands. La taille maximale autorisée est de
processTimeWarning=Attention, ce processus peut prendre jusqu'à une minute en fonction de la taille du fichier.
pageOrderPrompt=Ordre des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1) :
pageSelectionPrompt=Sélection des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1) :
@@ -163,13 +163,74 @@ alphabet=Alphabet
downloadPdf=Télécharger le PDF
text=Texte
font=Police
selectFillter=-- Sélectionnez --
selectFilter=-- Sélectionnez --
pageNum=Numéro de page
sizes.small=Petit
sizes.medium=Moyen
sizes.large=Grand
sizes.x-large=Très grand
error.pdfPassword=Le document PDF est protégé par un mot de passe qui n'a pas été fourni ou était incorrect
error.pdfCorrupted=Le fichier PDF semble être corrompu ou endommagé. Veuillez d'abord utiliser la fonction « Réparer » pour corriger le fichier avant de poursuivre cette opération.
error.pdfCorruptedMultiple=Un ou plusieurs fichiers PDF semblent être corrompus ou endommagés. Veuillez utiliser la fonction « Réparer » sur chaque fichier avant d'essayer de les fusionner.
error.pdfCorruptedDuring=Erreur {0} : le fichier PDF semble être corrompu ou endommagé. Veuillez d'abord utiliser la fonction « Réparer » pour corriger le fichier avant de poursuivre cette opération.
# Frontend corruption error messages
error.pdfInvalid=Le fichier PDF « {0} » semble être corrompu ou avoir une structure invalide. Veuillez utiliser la fonction « Réparer » pour corriger le fichier avant de continuer.
error.tryRepair=Essayez d'utiliser la fonction « Réparer » pour corriger les fichiers corrompus.
# Additional error messages
error.pdfEncryption=Le PDF semble contenir des données de chiffrement corrompues. Cela peut se produire si le PDF a été créé avec des méthodes de chiffrement incompatibles. Veuillez d'abord utiliser la fonction « Réparer », ou contactez le créateur du document pour obtenir une nouvelle copie.
error.fileProcessing=Une erreur est survenue lors du traitement du fichier pendant l'opération {0} : {1}
# Generic error message templates
error.toolNotInstalled={0} n'est pas installé
error.toolRequired={0} est requis pour {1}
error.conversionFailed=Échec de la conversion {0}
error.commandFailed=Échec de la commande {0}
error.algorithmNotAvailable=L'algorithme {0} n'est pas disponible
error.optionsNotSpecified=Les options pour {0} ne sont pas spécifiées
error.fileFormatRequired=Le fichier doit être au format {0}
error.invalidFormat=Format {0} invalide : {1}
error.endpointDisabled=Ce point de terminaison a été désactivé par l'administrateur
error.urlNotReachable=L'URL est inaccessible, veuillez fournir une URL valide
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=La valeur DPI {0} dépasse la limite maximale sécurisée de {1}. Des valeurs DPI trop élevées peuvent provoquer des problèmes de mémoire et des plantages. Veuillez utiliser une valeur DPI plus faible.
error.pageTooBigForDpi=La page PDF {0} est trop grande pour être rendue à {1} DPI. Veuillez essayer une valeur DPI plus faible (recommandé : 150 ou moins).
error.pageTooBigExceedsArray=La page PDF {0} est trop grande pour être rendue à {1} DPI. L'image résultante dépasserait la taille maximale autorisée pour un tableau en Java. Veuillez essayer une valeur DPI plus faible (recommandé : 150 ou moins).
error.pageTooBigFor300Dpi=La page PDF {0} est trop grande pour être rendue à 300 DPI. L'image résultante dépasserait la taille maximale autorisée pour un tableau en Java. Veuillez utiliser une valeur DPI plus faible pour la conversion PDF en image.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=La clé API n'est pas valide.
error.userNotFound=Utilisateur non trouvé.
error.passwordRequired=Le mot de passe ne doit pas être nul.
error.accountLocked=Votre compte a été verrouillé après trop de tentatives de connexion échouées.
error.invalidEmail=Adresses e-mail invalides fournies.
error.emailAttachmentRequired=Une pièce jointe est requise pour envoyer l'e-mail.
error.signatureNotFound=Fichier de signature introuvable.
# File processing messages
error.fileNotFound=Fichier introuvable avec l'ID : {0}
# Database and configuration messages
error.noBackupScripts=Aucun script de sauvegarde trouvé.
error.unsupportedProvider={0} n'est pas actuellement pris en charge.
error.pathTraversalDetected=Tentative de traversée de chemin détectée pour des raisons de sécurité.
# Validation messages
error.invalidArgument=Argument invalide : {0}
error.argumentRequired={0} ne doit pas être nul
error.operationFailed=Échec de l'opération : {0}
error.angleNotMultipleOf90=L'angle doit être un multiple de 90
error.pdfBookmarksNotFound=Aucun signet ou plan PDF trouvé dans le document
error.fontLoadingFailed=Erreur lors du traitement du fichier de police
error.fontDirectoryReadFailed=Échec de la lecture du répertoire de polices
delete=Supprimer
username=Nom d'utilisateur
password=Mot de passe
@@ -181,7 +242,6 @@ red=Rouge
green=Vert
blue=Bleu
custom=Personnalisé…
WorkInProgess=En cours de développement, merci de nous remonter les problèmes que vous pourriez constater!
poweredBy=Propulsé par
yes=Oui
no=Non
@@ -200,7 +260,7 @@ disabledCurrentUserMessage=L'utilisateur actuel ne peut pas être désactivé
downgradeCurrentUserLongMessage=Impossible de rétrograder le rôle de l'utilisateur actuel. Par conséquent, l'utilisateur actuel ne sera pas affiché.
userAlreadyExistsOAuthMessage=L'utilisateur existe déjà en tant qu'utilisateur OAuth2.
userAlreadyExistsWebMessage=L'utilisateur existe déjà en tant qu'utilisateur Web.
invalidRoleMessage=Invalid role.
invalidRoleMessage=Rôle non valide.
error=Erreur
oops=Oups !
help=Aide
@@ -213,27 +273,27 @@ color=Couleur
sponsor=Sponsoriser
info=Informations
pro=Pro
proFeatures=Pro Features
proFeatures=Fonctions pro
page=Page
pages=Pages
loading=Chargement...
addToDoc=Ajouter au Document
reset=Réinitialiser
apply=Appliquer
noFileSelected=No file selected. Please upload one.
view=View
cancel=Cancel
noFileSelected=Aucun fichier sélectionné. Veuillez en télécharger un.
view=Voir
cancel=Annuler
back.toSettings=Back to Settings
back.toHome=Back to Home
back.toAdmin=Back to Admin
back.toSettings=Retour aux paramètres
back.toHome=Retour à l'accueil
back.toAdmin=Retour à l'administration
legal.privacy=Politique de Confidentialité
legal.terms=Conditions Générales
legal.accessibility=Accessibilité
legal.cookie=Politique des Cookies
legal.impressum=Mentions Légales
legal.showCookieBanner=Cookie Preferences
legal.showCookieBanner=Préférences pour les cookies
###############
# Pipeline #
@@ -267,7 +327,7 @@ enterpriseEdition.button=Passer à Pro
enterpriseEdition.warning=Cette fonctionnalité est uniquement disponible pour les utilisateurs Pro.
enterpriseEdition.yamlAdvert=Stirling PDF Pro prend en charge les fichiers de configuration YAML et d'autres fonctionnalités SSO.
enterpriseEdition.ssoAdvert=Vous cherchez plus de fonctionnalités de gestion des utilisateurs ? Découvrez Stirling PDF Pro
enterpriseEdition.proTeamFeatureDisabled=Team management features require a Pro licence or higher
enterpriseEdition.proTeamFeatureDisabled=Les fonctions de gestion d'équipe nécessitent une licence Pro ou supérieure
#################
@@ -348,8 +408,8 @@ account.property=Propriété
account.webBrowserSettings=Paramètres du navigateur
account.syncToBrowser=Synchroniser : Compte → Navigateur
account.syncToAccount=Synchroniser : Compte ← Navigateur
account.adminTitle=Administrator Tools
account.adminNotif=You have admin privileges. Access system settings and user management.
account.adminTitle=Outils d'administrations
account.adminNotif=Vous avez des privilèges d'administrateur. Accédez aux paramètres du système et à la gestion des utilisateurs.
adminUserSettings.title=Administration des paramètres des utilisateurs
@@ -379,75 +439,75 @@ adminUserSettings.activeUsers=Utilisateurs actifs :
adminUserSettings.disabledUsers=Utilisateurs désactivés :
adminUserSettings.totalUsers=Utilisateurs au total :
adminUserSettings.lastRequest=Dernière requête
adminUserSettings.usage=View Usage
adminUserSettings.teams=View/Edit Teams
adminUserSettings.team=Team
adminUserSettings.manageTeams=Manage Teams
adminUserSettings.createTeam=Create Team
adminUserSettings.viewTeam=View Team
adminUserSettings.deleteTeam=Delete Team
adminUserSettings.teamName=Team Name
adminUserSettings.teamExists=Team already exists
adminUserSettings.teamCreated=Team created successfully
adminUserSettings.teamChanged=User's team was updated
adminUserSettings.teamHidden=Hidden
adminUserSettings.totalMembers=Total Members
adminUserSettings.confirmDeleteTeam=Are you sure you want to delete this team?
adminUserSettings.usage=Voir l'utilisation
adminUserSettings.teams=Voir/modifier les équipes
adminUserSettings.team=Équipe
adminUserSettings.manageTeams=Gérer les équipes
adminUserSettings.createTeam=Créer une équipe
adminUserSettings.viewTeam=Voir l'équipe
adminUserSettings.deleteTeam=Supprimer l'équipe
adminUserSettings.teamName=Nom de l'équipe
adminUserSettings.teamExists=L'équipe existe déjà
adminUserSettings.teamCreated=Création réussie d'une équipe
adminUserSettings.teamChanged=Les membres de l'équipe de l'utilisateur ont été mis à jour.
adminUserSettings.teamHidden=Caché
adminUserSettings.totalMembers=Membres totaux
adminUserSettings.confirmDeleteTeam=Êtes-vous sûr de vouloir supprimer cette équipe ?
teamCreated=Team created successfully
teamExists=A team with that name already exists
teamNameExists=Another team with that name already exists
teamNotFound=Team not found
teamDeleted=Team deleted
teamHasUsers=Cannot delete a team with users assigned
teamRenamed=Team renamed successfully
teamCreated=Équipe créée avec succès
teamExists=Une équipe portant ce nom existe déjà
teamNameExists=Une autre équipe portant ce nom existe déjà
teamNotFound=Équipe non trouvée
teamDeleted=Équipe supprimée
teamHasUsers=Impossible de supprimer une équipe à laquelle des membres ont été affectés
teamRenamed=L'équipe a été renommée avec succès
# Team user management
team.addUser=Add User to Team
team.selectUser=Select User
team.warning.moveUser=Warning: This will move the user from "{0}" team to "{1}" team. Are you sure?
team.confirm.moveUser=Are you sure you want to move this user from "{0}" team to "{1}" team?
team.userAdded=User successfully added to team
team.back=Back to Teams
team.internal=Internal Team
team.internalTeamNotAccessible=The Internal team is a system team and cannot be accessed
team.cannotMoveInternalUsers=Users in the Internal team cannot be moved to other teams
team.hidden=Hidden
team.name=Team Name
team.totalMembers=Total Members
team.members=Members
team.username=Username
team.role=Role
team.status=Status
team.enabled=Enabled
team.disabled=Disabled
team.noMembers=This team has no members yet.
team.addUser=Ajouter un membre à l'équipe
team.selectUser=Sélectionner l'utilisateur
team.warning.moveUser=Attention : L'utilisateur passera de l'équipe "{0}" à l'équipe "{1}". Êtes-vous sûr de vous ?
team.confirm.moveUser=Êtes-vous sûr de vouloir déplacer cet utilisateur de l'équipe "{0}" vers l'équipe "{1}" ?
team.userAdded=L'utilisateur a été ajouté avec succès à l'équipe
team.back=Retour aux équipes
team.internal=Équipe interne
team.internalTeamNotAccessible=L'équipe interne est une équipe système et n'est pas accessible.
team.cannotMoveInternalUsers=Les utilisateurs de l'équipe interne ne peuvent pas être déplacés vers d'autres équipes.
team.hidden=Caché
team.name=Nom de l'équipe
team.totalMembers=Membres totaux
team.members=Membres
team.username=Nom d'utilisateur
team.role=Rôle
team.status=Statut
team.enabled=Activé
team.disabled=Désactivé
team.noMembers=Cette équipe n'a pas encore de membres.
endpointStatistics.title=Endpoint Statistics
endpointStatistics.header=Endpoint Statistics
endpointStatistics.title=Statistiques des points de terminaison
endpointStatistics.header=Statistiques des points de terminaison
endpointStatistics.top10=Top 10
endpointStatistics.top20=Top 20
endpointStatistics.all=All
endpointStatistics.refresh=Refresh
endpointStatistics.includeHomepage=Include Homepage ('/')
endpointStatistics.includeLoginPage=Include Login Page ('/login')
endpointStatistics.totalEndpoints=Total Endpoints
endpointStatistics.totalVisits=Total Visits
endpointStatistics.showing=Showing
endpointStatistics.selectedVisits=Selected Visits
endpointStatistics.endpoint=Endpoint
endpointStatistics.visits=Visits
endpointStatistics.percentage=Percentage
endpointStatistics.loading=Loading...
endpointStatistics.failedToLoad=Failed to load endpoint data. Please try refreshing.
endpointStatistics.home=Home
endpointStatistics.login=Login
endpointStatistics.all=Tout
endpointStatistics.refresh=Rafraîchir
endpointStatistics.includeHomepage=Inclure la page d'accueil ('/')
endpointStatistics.includeLoginPage=Inclure la page de connexion ('/login')
endpointStatistics.totalEndpoints=Nombre total de points de terminaison
endpointStatistics.totalVisits=Nombre total de visites
endpointStatistics.showing=Affichage
endpointStatistics.selectedVisits=Visites sélectionnées
endpointStatistics.endpoint=Point de terminaison
endpointStatistics.visits=Visites
endpointStatistics.percentage=Pourcentage
endpointStatistics.loading=Chargement...
endpointStatistics.failedToLoad=Échec du chargement des données des points de terminaisons. Veuillez réessayer.
endpointStatistics.home=Accueil
endpointStatistics.login=Connexion
endpointStatistics.top=Top
endpointStatistics.numberOfVisits=Number of Visits
endpointStatistics.visitsTooltip=Visits: {0} ({1}% of total)
endpointStatistics.retry=Retry
endpointStatistics.numberOfVisits=Nombre de visites
endpointStatistics.visitsTooltip=Visites : {0} ({1}% du total)
endpointStatistics.retry=Réessayer
database.title=Import/Export de la Base de Données
database.header=Import/Export de la Base de Données
@@ -525,6 +585,10 @@ home.addImage.title=Ajouter une image
home.addImage.desc=Ajoutez une image à un emplacement défini sur un PDF.
addImage.tags=img,jpg,image,photo
home.attachments.title=Ajouter des pièces jointes
home.attachments.desc=Ajouter ou supprimer des fichiers intégrés (pièces jointes) dans un PDF
attachments.tags=intégrer,joindre,fichier,pièce,jointe,embed,attach,file,attachment,attachments
home.watermark.title=Ajouter un filigrane
home.watermark.desc=Ajoutez un filigrane personnalisé à votre PDF.
watermark.tags=texte,filigrane,label,propriété,droit d'auteur,marque déposée,img,jpg,image,photo,copyright,trademark
@@ -550,9 +614,9 @@ home.compressPdfs.title=Compresser
home.compressPdfs.desc=Compressez les PDF pour réduire leur tailles.
compressPdfs.tags=compresser,réduire,taille,squish,small,tiny
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=Déverrouiller les formulaires PDF
home.unlockPDFForms.desc=Supprimer la propriété lecture seule des champs de formulaire dans un document PDF
unlockPDFForms.tags=supprimer,propriété,déverrouiller,formulaire,champs,lecture,remove,delete,form,field,readonly
home.changeMetadata.title=Modifier les métadonnées
home.changeMetadata.desc=Modifiez, supprimez ou ajoutez des métadonnées à un PDF.
@@ -676,21 +740,21 @@ home.HTMLToPDF.desc=Convertissez n'importe quel fichier HTML ou ZIP en PDF.
HTMLToPDF.tags=html,markup,contenu Web,transformation,convert
#eml-to-pdf
home.EMLToPDF.title=Email to PDF
home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images
EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail
home.EMLToPDF.title=Email en PDF
home.EMLToPDF.desc=Convertit les fichiers email (EML) en PDF, y compris les en-têtes, le corps et les images intégrées
EMLToPDF.tags=email,conversion,courrier,conversion,eml,message,transformation,convert,mail
EMLToPDF.title=Email To PDF
EMLToPDF.header=Email To PDF
EMLToPDF.submit=Convert
EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF
EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues
EMLToPDF.includeAttachments=Include attachments in PDF
EMLToPDF.maxAttachmentSize=Maximum attachment size (MB)
EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images
EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both
EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code.
EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs
EMLToPDF.title=Email en PDF
EMLToPDF.header=Email en PDF
EMLToPDF.submit=Convertir
EMLToPDF.downloadHtml=Télécharger le fichier HTML intermédiaire au lieu du PDF
EMLToPDF.downloadHtmlHelp=Cela vous permet de voir la version HTML avant la conversion en PDF et peut aider à corriger les problèmes de mise en forme
EMLToPDF.includeAttachments=Inclure les pièces jointes dans le PDF
EMLToPDF.maxAttachmentSize=Taille maximale des pièces jointes (Mo)
EMLToPDF.help=Convertit les fichiers email (EML) en PDF, y compris les en-têtes, le corps et les images intégrées
EMLToPDF.troubleshootingTip1=La conversion Email vers HTML est plus fiable, il est donc recommandé de sauvegarder les deux lors d'un traitement par lot
EMLToPDF.troubleshootingTip2=Avec un petit nombre d'emails, si le PDF est mal formé, vous pouvez télécharger le HTML et corriger manuellement le code HTML/CSS problématique
EMLToPDF.troubleshootingTip3=Les éléments intégrés ne fonctionnent cependant pas avec les fichiers HTML
home.MarkdownToPDF.title=Markdown en PDF
home.MarkdownToPDF.desc=Convertissez n'importe quel fichier Markdown en PDF.
@@ -806,12 +870,12 @@ login.oauth2invalidRequest=Requête invalide
login.oauth2AccessDenied=Accès refusé
login.oauth2InvalidTokenResponse=Réponse contenant le jeton est invalide
login.oauth2InvalidIdToken=Jeton d'identification invalide
login.relyingPartyRegistrationNotFound=No relying party registration found
login.relyingPartyRegistrationNotFound=Aucun enregistrement de partie de confiance trouvé
login.userIsDisabled=L'utilisateur est désactivé, la connexion est actuellement bloquée avec ce nom d'utilisateur. Veuillez contacter l'administrateur.
login.alreadyLoggedIn=Vous êtes déjà connecté sur
login.alreadyLoggedIn2=appareils. Veuillez vous déconnecter des appareils et réessayer.
login.toManySessions=Vous avez trop de sessions actives.
login.logoutMessage=You have been logged out.
login.logoutMessage=Vous avez été déconnecté.
#auto-redact
autoRedact.title=Caviarder automatiquement
@@ -877,28 +941,28 @@ getPdfInfo.title=Récupérer les informations
getPdfInfo.header=Récupérer les informations
getPdfInfo.submit=Récupérer les informations
getPdfInfo.downloadJson=Télécharger le JSON
getPdfInfo.summary=PDF Summary
getPdfInfo.summary.encrypted=This PDF is encrypted so may face issues with some applications
getPdfInfo.summary.permissions=This PDF has {0} restricted permissions which may limit what you can do with it
getPdfInfo.summary.compliance=This PDF complies with the {0} standard
getPdfInfo.summary.basicInfo=Basic Information
getPdfInfo.summary.docInfo=Document Information
getPdfInfo.summary.encrypted.alert=Encrypted PDF - This document is password protected
getPdfInfo.summary.not.encrypted.alert=Unencrypted PDF - No password protection
getPdfInfo.summary.permissions.alert=Restricted Permissions - {0} actions are not allowed
getPdfInfo.summary.all.permissions.alert=All Permissions Allowed
getPdfInfo.summary.compliance.alert={0} Compliant
getPdfInfo.summary.no.compliance.alert=No Compliance Standards
getPdfInfo.summary.security.section=Security Status
getPdfInfo.section.BasicInfo=Basic Information about the PDF document including file size, page count, and language
getPdfInfo.section.Metadata=Document metadata including title, author, creation date and other document properties
getPdfInfo.section.DocumentInfo=Technical details about the PDF document structure and version
getPdfInfo.section.Compliancy=PDF standards compliance information (PDF/A, PDF/X, etc.)
getPdfInfo.section.Encryption=Security and encryption details of the document
getPdfInfo.section.Permissions=Document permission settings that control what actions can be performed
getPdfInfo.section.Other=Additional document components like bookmarks, layers, and embedded files
getPdfInfo.section.FormFields=Interactive form fields present in the document
getPdfInfo.section.PerPageInfo=Detailed information about each page in the document
getPdfInfo.summary=Résumé du PDF
getPdfInfo.summary.encrypted=Ce PDF est chiffré et peut poser des problèmes avec certaines applications
getPdfInfo.summary.permissions=Ce PDF a {0} permissions restreintes, ce qui peut limiter les actions possibles
getPdfInfo.summary.compliance=Ce PDF est conforme à la norme {0}
getPdfInfo.summary.basicInfo=Informations de base
getPdfInfo.summary.docInfo=Informations sur le document
getPdfInfo.summary.encrypted.alert=PDF chiffré - Ce document est protégé par mot de passe
getPdfInfo.summary.not.encrypted.alert=PDF non chiffré - Aucune protection par mot de passe
getPdfInfo.summary.permissions.alert=Permissions restreintes - {0} actions ne sont pas autorisées
getPdfInfo.summary.all.permissions.alert=Toutes les permissions sont autorisées
getPdfInfo.summary.compliance.alert=Conforme à {0}
getPdfInfo.summary.no.compliance.alert=Non conforme à une norme
getPdfInfo.summary.security.section=État de la sécurité
getPdfInfo.section.BasicInfo=Informations de base sur le document PDF, y compris la taille du fichier, le nombre de pages et la langue
getPdfInfo.section.Metadata=Métadonnées du document, y compris le titre, l'auteur, la date de création et d'autres propriétés
getPdfInfo.section.DocumentInfo=Détails techniques sur la structure et la version du document PDF
getPdfInfo.section.Compliancy=Informations sur la conformité aux normes PDF (PDF/A, PDF/X, etc.)
getPdfInfo.section.Encryption=Détails sur la sécurité et le chiffrement du document
getPdfInfo.section.Permissions=Paramètres de permissions du document qui contrôlent les actions autorisées
getPdfInfo.section.Other=Composants supplémentaires du document comme les signets, calques et fichiers intégrés
getPdfInfo.section.FormFields=Champs de formulaire interactifs présents dans le document
getPdfInfo.section.PerPageInfo=Informations détaillées sur chaque page du document
#markdown-to-pdf
@@ -910,9 +974,9 @@ MarkdownToPDF.credit=Utilise WeasyPrint.
#pdf-to-markdown
PDFToMarkdown.title=PDF To Markdown
PDFToMarkdown.header=PDF To Markdown
PDFToMarkdown.submit=Convert
PDFToMarkdown.title=PDF en Markdown
PDFToMarkdown.header=PDF en Markdown
PDFToMarkdown.submit=Convertir
#url-to-pdf
@@ -966,10 +1030,10 @@ sanitizePDF.title=Assainir
sanitizePDF.header=Assainir
sanitizePDF.selectText.1=Supprimer les actions JavaScript
sanitizePDF.selectText.2=Supprimer les fichiers intégrés
sanitizePDF.selectText.3=Remove XMP metadata
sanitizePDF.selectText.3=Supprimer les métadonnées XMP
sanitizePDF.selectText.4=Supprimer les liens
sanitizePDF.selectText.5=Supprimer les polices
sanitizePDF.selectText.6=Remove Document Info Metadata
sanitizePDF.selectText.6=Supprimer les métadonnées d'information du document
sanitizePDF.submit=Assainir
@@ -1019,7 +1083,7 @@ autoSplitPDF.selectText.3=Téléchargez le fichier PDF numérisé et laissez Sti
autoSplitPDF.selectText.4=Les feuilles de séparation sont automatiquement détectées et supprimées, garantissant un document final soigné.
autoSplitPDF.formPrompt=PDF contenant des feuilles de séparation de Stirling PDF :
autoSplitPDF.duplexMode=Mode recto-verso
autoSplitPDF.dividerDownload2=Auto Splitter Divider (with instructions).pdf
autoSplitPDF.dividerDownload2=Feuille de séparation automatique (avec instructions).pdf
autoSplitPDF.submit=Séparer
@@ -1190,8 +1254,8 @@ compress.title=Compresser un PDF
compress.header=Compresser un PDF (lorsque c'est possible!)
compress.credit=Ce service utilise qpdf pour la compression et l'optimisation des PDF.
compress.grayscale.label=Appliquer l'échelle de gris pour la compression
compress.selectText.1=Compression Settings
compress.selectText.1.1=1-3 PDF compression,</br> 4-6 lite image compression,</br> 7-9 intense image compression Will dramatically reduce image quality
compress.selectText.1=Paramètres de compression
compress.selectText.1.1=1-3 compression PDF,</br> 4-6 compression d'image légère,</br> 7-9 compression d'image intense qui réduira considérablement la qualité de l'image
compress.selectText.2=Niveau d'optimisation
compress.selectText.4=Mode automatique ajuste automatiquement la qualité pour obtenir le PDF à la taille exacte
compress.selectText.5=Taille PDF attendue (par exemple, 25MB, 10,8MB, 25KB)
@@ -1205,6 +1269,12 @@ addImage.everyPage=Toutes les pages ?
addImage.upload=Télécharger une image
addImage.submit=Ajouter une image
#attachments
attachments.title=Ajouter des pièces jointes
attachments.header=Ajouter des pièces jointes
attachments.description=Permet d'ajouter des pièces jointes au PDF
attachments.descriptionPlaceholder=Entrez une description pour les pièces jointes...
attachments.addButton=Ajouter des pièces jointes
#merge
merge.title=Fusionner
@@ -1212,7 +1282,7 @@ merge.header=Fusionner plusieurs PDF
merge.sortByName=Trier par nom
merge.sortByDate=Trier par date
merge.removeCertSign=Supprimer la signature numérique dans le fichier fusionné ?
merge.generateToc=Generate table of contents in the merged file?
merge.generateToc=Générer une table des matières dans le fichier fusionné ?
merge.submit=Fusionner
@@ -1231,7 +1301,7 @@ pdfOrganiser.mode.7=Supprimer le premier
pdfOrganiser.mode.8=Supprimer le dernier
pdfOrganiser.mode.9=Supprimer le premier et le dernier
pdfOrganiser.mode.10=Méger Impair-Pair
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.mode.11=Dupliquer toutes les pages
pdfOrganiser.placeholder=(par exemple 1,3,2 ou 4-8,2,10-12 ou 2n-1)
@@ -1257,8 +1327,8 @@ multiTool.moveLeft=Déplacer vers la gauche
multiTool.moveRight=Déplacer vers la droite
multiTool.delete=Supprimer
multiTool.dragDropMessage=Page(s) sélectionnées
multiTool.undo=Undo
multiTool.redo=Redo
multiTool.undo=Annuler
multiTool.redo=Refaire
#decrypt
decrypt.passwordPrompt=Ce fichier est protégé par un mot de passe. Veuillez saisir le mot de passe :
@@ -1274,7 +1344,7 @@ decrypt.success=Fichier déchiffré avec succès.
multiTool-advert.message=Cette fonctionnalité est aussi disponible dans la <a href="{0}">page de l'outil multifonction</a>. Allez-y pour une interface page par page améliorée et des fonctionnalités additionnelles !
#view pdf
viewPdf.title=View/Edit PDF
viewPdf.title=Afficher/modifier un PDF
viewPdf.header=Visualiser un PDF
#pageRemover
@@ -1333,7 +1403,7 @@ pdfToImage.color=Couleur
pdfToImage.grey=Niveaux de gris
pdfToImage.blackwhite=Noir et blanc (peut engendrer une perte de données !)
pdfToImage.submit=Convertir
pdfToImage.info=Python nest pas installé. Nécessaire pour la conversion WebP.
pdfToImage.info=Python n'est pas installé. Nécessaire pour la conversion WebP.
pdfToImage.placeholder=(par exemple : 1,2,8 ou 4,7,12-16 ou 2n-1)
@@ -1422,9 +1492,9 @@ changeMetadata.selectText.5=Ajouter une entrée de métadonnées personnalisée
changeMetadata.submit=Modifier
#unlockPDFForms
unlockPDFForms.title=Remove Read-Only from Form Fields
unlockPDFForms.header=Unlock PDF Forms
unlockPDFForms.submit=Remove
unlockPDFForms.title=Supprimer la lecture seule des champs de formulaire
unlockPDFForms.header=Déverrouiller les formulaires PDF
unlockPDFForms.submit=Supprimer
#pdfToPDFA
pdfToPDFA.title=PDF en PDF/A
@@ -1590,10 +1660,11 @@ splitByChapters.submit=Diviser le PDF
fileChooser.click=Cliquez
fileChooser.or=ou
fileChooser.dragAndDrop=Glisser & Déposer
fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.dragAndDropPDF=Glisser & Déposer un PDF
fileChooser.dragAndDropImage=Glisser & Déposer une image
fileChooser.hoveredDragAndDrop=Glisser & Déposer le(s) fichier(s) ici
fileChooser.extractPDF=Extraction en cours...
fileChooser.addAttachments=Glisser & Déposer les pièces jointes ici
#release notes
releases.footer=Versions
@@ -1638,157 +1709,157 @@ validateSignature.cert.selfSigned=Auto-signé
validateSignature.cert.bits=bits
# Audit Dashboard
audit.dashboard.title=Audit Dashboard
audit.dashboard.systemStatus=Audit System Status
audit.dashboard.status=Status
audit.dashboard.enabled=Enabled
audit.dashboard.disabled=Disabled
audit.dashboard.currentLevel=Current Level
audit.dashboard.retentionPeriod=Retention Period
audit.dashboard.days=days
audit.dashboard.totalEvents=Total Events
audit.dashboard.title=Tableau de bord d'audit
audit.dashboard.systemStatus=État du système d'audit
audit.dashboard.status=Statut
audit.dashboard.enabled=Activé
audit.dashboard.disabled=Désactivé
audit.dashboard.currentLevel=Niveau actuel
audit.dashboard.retentionPeriod=Période de conservation
audit.dashboard.days=jours
audit.dashboard.totalEvents=Nombre total d'événements
# Audit Dashboard Tabs
audit.dashboard.tab.dashboard=Dashboard
audit.dashboard.tab.events=Audit Events
audit.dashboard.tab.export=Export
audit.dashboard.tab.dashboard=Tableau de bord
audit.dashboard.tab.events=Événements d'audit
audit.dashboard.tab.export=Exportation
# Dashboard Charts
audit.dashboard.eventsByType=Events by Type
audit.dashboard.eventsByUser=Events by User
audit.dashboard.eventsOverTime=Events Over Time
audit.dashboard.period.7days=7 Days
audit.dashboard.period.30days=30 Days
audit.dashboard.period.90days=90 Days
audit.dashboard.eventsByType=Événements par type
audit.dashboard.eventsByUser=Événements par utilisateur
audit.dashboard.eventsOverTime=Événements dans le temps
audit.dashboard.period.7days=7 jours
audit.dashboard.period.30days=30 jours
audit.dashboard.period.90days=90 jours
# Events Tab
audit.dashboard.auditEvents=Audit Events
audit.dashboard.filter.eventType=Event Type
audit.dashboard.filter.allEventTypes=All event types
audit.dashboard.filter.user=User
audit.dashboard.filter.userPlaceholder=Filter by user
audit.dashboard.filter.startDate=Start Date
audit.dashboard.filter.endDate=End Date
audit.dashboard.filter.apply=Apply Filters
audit.dashboard.filter.reset=Reset Filters
audit.dashboard.auditEvents=Événements d'audit
audit.dashboard.filter.eventType=Type d'événement
audit.dashboard.filter.allEventTypes=Tous les types d'événements
audit.dashboard.filter.user=Utilisateur
audit.dashboard.filter.userPlaceholder=Filtrer par utilisateur
audit.dashboard.filter.startDate=Date de début
audit.dashboard.filter.endDate=Date de fin
audit.dashboard.filter.apply=Appliquer les filtres
audit.dashboard.filter.reset=Réinitialiser les filtres
# Table Headers
audit.dashboard.table.id=ID
audit.dashboard.table.time=Time
audit.dashboard.table.user=User
audit.dashboard.table.time=Heure
audit.dashboard.table.user=Utilisateur
audit.dashboard.table.type=Type
audit.dashboard.table.details=Details
audit.dashboard.table.viewDetails=View Details
audit.dashboard.table.details=Détails
audit.dashboard.table.viewDetails=Voir les détails
# Pagination
audit.dashboard.pagination.show=Show
audit.dashboard.pagination.entries=entries
audit.dashboard.pagination.show=Afficher
audit.dashboard.pagination.entries=entrées
audit.dashboard.pagination.pageInfo1=Page
audit.dashboard.pagination.pageInfo2=of
audit.dashboard.pagination.totalRecords=Total records:
audit.dashboard.pagination.pageInfo2=de
audit.dashboard.pagination.totalRecords=Nombre total d'enregistrements :
# Modal
audit.dashboard.modal.eventDetails=Event Details
audit.dashboard.modal.eventDetails=Détails de l'événement
audit.dashboard.modal.id=ID
audit.dashboard.modal.user=User
audit.dashboard.modal.user=Utilisateur
audit.dashboard.modal.type=Type
audit.dashboard.modal.time=Time
audit.dashboard.modal.data=Data
audit.dashboard.modal.time=Heure
audit.dashboard.modal.data=Données
# Export Tab
audit.dashboard.export.title=Export Audit Data
audit.dashboard.export.format=Export Format
audit.dashboard.export.csv=CSV (Comma Separated Values)
audit.dashboard.export.json=JSON (JavaScript Object Notation)
audit.dashboard.export.button=Export Data
audit.dashboard.export.infoTitle=Export Information
audit.dashboard.export.infoDesc1=The export will include all audit events matching the selected filters. For large datasets, the export may take a few moments to generate.
audit.dashboard.export.infoDesc2=Exported data will include:
audit.dashboard.export.infoItem1=Event ID
audit.dashboard.export.infoItem2=User
audit.dashboard.export.infoItem3=Event Type
audit.dashboard.export.infoItem4=Timestamp
audit.dashboard.export.infoItem5=Event Data
audit.dashboard.export.title=Exporter les données d'audit
audit.dashboard.export.format=Format d'exportation
audit.dashboard.export.csv=CSV (valeurs séparées par des virgules)
audit.dashboard.export.json=JSON (notation objet JavaScript)
audit.dashboard.export.button=Exporter les données
audit.dashboard.export.infoTitle=Informations sur l'exportation
audit.dashboard.export.infoDesc1=L'exportation inclura tous les événements d'audit correspondant aux filtres sélectionnés. Pour les grands ensembles de données, l'exportation peut prendre quelques instants.
audit.dashboard.export.infoDesc2=Les données exportées incluront :
audit.dashboard.export.infoItem1=ID de l'événement
audit.dashboard.export.infoItem2=Utilisateur
audit.dashboard.export.infoItem3=Type d'événement
audit.dashboard.export.infoItem4=Horodatage
audit.dashboard.export.infoItem5=Données de l'événement
# JavaScript i18n keys
audit.dashboard.js.noEventsFound=No audit events found matching the current filters
audit.dashboard.js.errorLoading=Error loading data:
audit.dashboard.js.errorRendering=Error rendering table:
audit.dashboard.js.loadingPage=Loading page
audit.dashboard.js.noEventsFound=Aucun événement d'audit trouvé correspondant aux filtres actuels
audit.dashboard.js.errorLoading=Erreur lors du chargement des données :
audit.dashboard.js.errorRendering=Erreur lors de l'affichage du tableau :
audit.dashboard.js.loadingPage=Chargement de la page
####################
# 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 youd 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.popUp.title=Comment nous utilisons les cookies
cookieBanner.popUp.description.1=Nous utilisons des cookies et d'autres technologies pour améliorer Stirling PDF pour vous — cela nous aide à perfectionner nos outils et à créer des fonctionnalités que vous allez adorer.
cookieBanner.popUp.description.2=Si vous préférez ne pas les utiliser, cliquer sur « Non merci » n'activera que les cookies essentiels nécessaires au bon fonctionnement du site.
cookieBanner.popUp.acceptAllBtn=D'accord
cookieBanner.popUp.acceptNecessaryBtn=Non merci
cookieBanner.popUp.showPreferencesBtn=Gérer les préférences
cookieBanner.preferencesModal.title=Centre de préférences de consentement
cookieBanner.preferencesModal.acceptAllBtn=Tout accepter
cookieBanner.preferencesModal.acceptNecessaryBtn=Tout refuser
cookieBanner.preferencesModal.savePreferencesBtn=Enregistrer les préférences
cookieBanner.preferencesModal.closeIconLabel=Fermer la fenêtre
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 cant 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.preferencesModal.subtitle=Utilisation des cookies
cookieBanner.preferencesModal.description.1=Stirling PDF utilise des cookies et des technologies similaires pour améliorer votre expérience et comprendre comment nos outils sont utilisés. Cela nous aide à améliorer les performances, développer les fonctionnalités qui vous tiennent à cœur et offrir un support continu.
cookieBanner.preferencesModal.description.2=Stirling PDF ne peut pas — et ne pourra jamais — suivre ou accéder au contenu des documents que vous utilisez.
cookieBanner.preferencesModal.description.3=Votre vie privée et votre confiance sont au cœur de notre démarche.
cookieBanner.preferencesModal.necessary.title.1=Cookies strictement nécessaires
cookieBanner.preferencesModal.necessary.title.2=Toujours activés
cookieBanner.preferencesModal.necessary.description=Ces cookies sont essentiels au bon fonctionnement du site. Ils permettent des fonctionnalités de base comme la gestion de vos préférences de confidentialité, la connexion et le remplissage de formulaires — c'est pourquoi ils ne peuvent pas être désactivés.
cookieBanner.preferencesModal.analytics.title=Analyse
cookieBanner.preferencesModal.analytics.description=Ces cookies nous aident à comprendre comment nos outils sont utilisés, afin que nous puissions nous concentrer sur les fonctionnalités les plus appréciées par notre communauté. Soyez rassuré — Stirling PDF ne peut pas et ne suivra jamais le contenu des documents que vous utilisez.
#fakeScan
fakeScan.title=Fake Scan
fakeScan.header=Fake Scan
fakeScan.description=Create a PDF that looks like it was scanned
fakeScan.selectPDF=Select PDF:
fakeScan.quality=Scan Quality
fakeScan.quality.low=Low
fakeScan.quality.medium=Medium
fakeScan.quality.high=High
fakeScan.rotation=Rotation Angle
fakeScan.rotation.none=None
fakeScan.rotation.slight=Slight
fakeScan.rotation.moderate=Moderate
fakeScan.rotation.severe=Severe
fakeScan.submit=Create Fake Scan
fakeScan.title=Fausse numérisation
fakeScan.header=Fausse numérisation
fakeScan.description=Créer un PDF qui ressemble à une numérisation
fakeScan.selectPDF=Sélectionner un PDF :
fakeScan.quality=Qualité de numérisation
fakeScan.quality.low=Faible
fakeScan.quality.medium=Moyenne
fakeScan.quality.high=Élevée
fakeScan.rotation=Angle de rotation
fakeScan.rotation.none=Aucun
fakeScan.rotation.slight=Léger
fakeScan.rotation.moderate=Modéré
fakeScan.rotation.severe=Sévère
fakeScan.submit=Créer une fausse numérisation
#home.fakeScan
home.fakeScan.title=Fake Scan
home.fakeScan.desc=Create a PDF that looks like it was scanned
fakeScan.tags=scan,simulate,realistic,convert
home.fakeScan.title=Fausse numérisation
home.fakeScan.desc=Créer un PDF qui ressemble à une numérisation
fakeScan.tags=numérisation,simuler,réaliste,convertir,scan,simulate,realistic,convert
# FakeScan advanced settings (frontend)
fakeScan.advancedSettings=Enable Advanced Scan Settings
fakeScan.colorspace=Colorspace
fakeScan.colorspace.grayscale=Grayscale
fakeScan.colorspace.color=Color
fakeScan.border=Border (px)
fakeScan.rotate=Base Rotation (degrees)
fakeScan.rotateVariance=Rotation Variance (degrees)
fakeScan.brightness=Brightness
fakeScan.contrast=Contrast
fakeScan.blur=Blur
fakeScan.noise=Noise
fakeScan.yellowish=Yellowish (simulate old paper)
fakeScan.resolution=Resolution (DPI)
fakeScan.advancedSettings=Activer les paramètres de numérisation avancés
fakeScan.colorspace=Espace colorimétrique
fakeScan.colorspace.grayscale=Niveaux de gris
fakeScan.colorspace.color=Couleur
fakeScan.border=Bordure (px)
fakeScan.rotate=Rotation de base (degrés)
fakeScan.rotateVariance=Variance de rotation (degrés)
fakeScan.brightness=Luminosité
fakeScan.contrast=Contraste
fakeScan.blur=Flou
fakeScan.noise=Bruit
fakeScan.yellowish=Jaunâtre (simuler du vieux papier)
fakeScan.resolution=Résolution (DPI)
# Table of Contents Feature
home.editTableOfContents.title=Edit Table of Contents
home.editTableOfContents.desc=Add or edit bookmarks and table of contents in PDF documents
home.editTableOfContents.title=Modifier la table des matières
home.editTableOfContents.desc=Ajouter ou modifier les signets et la table des matières dans les documents PDF
editTableOfContents.tags=bookmarks,toc,navigation,index,table of contents,chapters,sections,outline
editTableOfContents.title=Edit Table of Contents
editTableOfContents.header=Add or Edit PDF Table of Contents
editTableOfContents.replaceExisting=Replace existing bookmarks (uncheck to append to existing)
editTableOfContents.editorTitle=Bookmark Editor
editTableOfContents.editorDesc=Add and arrange bookmarks below. Click + to add child bookmarks.
editTableOfContents.addBookmark=Add New Bookmark
editTableOfContents.desc.1=This tool allows you to add or edit the table of contents (bookmarks) in a PDF document.
editTableOfContents.desc.2=You can create a hierarchical structure by adding child bookmarks to parent bookmarks.
editTableOfContents.desc.3=Each bookmark requires a title and target page number.
editTableOfContents.submit=Apply Table of Contents
editTableOfContents.tags=signets,tdm,table des matières,chapitres,sections,plan,bookmarks,toc,navigation,index,table of contents,chapters,sections,outline
editTableOfContents.title=Modifier la table des matières
editTableOfContents.header=Ajouter ou modifier la table des matières PDF
editTableOfContents.replaceExisting=Remplacer les signets existants (décocher pour ajouter aux existants)
editTableOfContents.editorTitle=Éditeur de signets
editTableOfContents.editorDesc=Ajoutez et organisez les signets ci-dessous. Cliquez sur + pour ajouter des signets enfants.
editTableOfContents.addBookmark=Ajouter un nouveau signet
editTableOfContents.desc.1=Cet outil vous permet d'ajouter ou de modifier la table des matières (signets) dans un document PDF.
editTableOfContents.desc.2=Vous pouvez créer une structure hiérarchique en ajoutant des signets enfants à des signets parents.
editTableOfContents.desc.3=Chaque signet nécessite un titre et un numéro de page cible.
editTableOfContents.submit=Appliquer la table des matières
@@ -163,13 +163,74 @@ alphabet=Aibítir
downloadPdf=Íoslódáil PDF
text=Téacs
font=Cló
selectFillter=-- Roghnaigh --
selectFilter=-- Roghnaigh --
pageNum=Uimhir an Leathanaigh
sizes.small=Beaga
sizes.medium=Mheán
sizes.large=Mór
sizes.x-large=X-Mór
error.pdfPassword=Tá pasfhocal ar an Doiciméad PDF agus níor soláthraíodh an pasfhocal nó bhí sé mícheart
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Scrios
username=Ainm úsáideora
password=Pasfhocal
@@ -181,7 +242,6 @@ red=Dearg
green=Glas
blue=Gorm
custom=Saincheaptha...
WorkInProgess=Obair idir lámha, Bfhéidir nach n-oibreoidh sí nó nach mbeidh bugaí ann, Tuairiscigh aon fhadhbanna le do thoil!
poweredBy=Cumhachtaithe ag
yes=
no=Níl
@@ -525,6 +585,10 @@ home.addImage.title=Cuir íomhá leis
home.addImage.desc=Cuireann sé íomhá ar shuíomh socraithe ar an PDF
addImage.tags=img, jpg, pictiúr, grianghraf
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Cuir Uisce leis
home.watermark.desc=Cuir comhartha uisce saincheaptha le do dhoiciméad PDF.
watermark.tags=Téacs, athrá, lipéad, úinéireacht, cóipcheart, trádmharc, img, jpg, pictiúr, grianghraf
@@ -1205,6 +1269,12 @@ addImage.everyPage=Gach Leathanach?
addImage.upload=Cuir íomhá leis
addImage.submit=Cuir íomhá leis
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Cumaisc
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Tarraing & Scaoil comhad PDF
fileChooser.dragAndDropImage=Tarraing & Scaoil comhad Íomhá
fileChooser.hoveredDragAndDrop=Tarraing agus scaoil comhad(í) anseo
fileChooser.extractPDF=Ag Aistriú...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Eisiúintí
@@ -163,13 +163,74 @@ alphabet=वर्णमाला
downloadPdf=पीडीएफ डाउनलोड करें
text=टेक्स्ट
font=फ़ॉन्ट
selectFillter=-- चुनें --
selectFilter=-- चुनें --
pageNum=पृष्ठ संख्या
sizes.small=छोटा
sizes.medium=मध्यम
sizes.large=बड़ा
sizes.x-large=बहुत बड़ा
error.pdfPassword=पीडीएफ दस्तावेज़ पासवर्ड से सुरक्षित है और या तो पासवर्ड नहीं दिया गया था या गलत था
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=हटाएं
username=उपयोगकर्ता नाम
password=पासवर्ड
@@ -181,7 +242,6 @@ red=लाल
green=हरा
blue=नीला
custom=कस्टम...
WorkInProgess=कार्य प्रगति पर है, काम नहीं कर सकता है या बग हो सकते हैं, कृपया किसी भी समस्या की रिपोर्ट करें!
poweredBy=द्वारा संचालित
yes=हाँ
no=नहीं
@@ -525,6 +585,10 @@ home.addImage.title=छवि जोड़ें
home.addImage.desc=PDF पर एक निर्धारित स्थान पर छवि जोड़ें
addImage.tags=img,jpg,चित्र,फोटो
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=वॉटरमार्क जोड़ें
home.watermark.desc=अपने PDF दस्तावेज में कस्टम वॉटरमार्क जोड़ें।
watermark.tags=टेक्स्ट,दोहराव,लेबल,स्वयं,कॉपीराइट,ट्रेडमार्क,img,jpg,चित्र,फोटो
@@ -1205,6 +1269,12 @@ addImage.everyPage=हर पृष्ठ?
addImage.upload=छवि जोड़ें
addImage.submit=छवि जोड़ें
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=मर्ज करें
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=PDF फ़ाइल खींचें और छो
fileChooser.dragAndDropImage=छवि फ़ाइल खींचें और छोड़ें
fileChooser.hoveredDragAndDrop=फ़ाइल(ें) यहाँ खींचें और छोड़ें
fileChooser.extractPDF=निकालना...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=रिलीज़
@@ -163,13 +163,74 @@ alphabet=Abeceda
downloadPdf=Preuzmi PDF
text=Tekst
font=Pismo
selectFillter=-- Odaberi --
selectFilter=-- Odaberi --
pageNum=Broj stranice
sizes.small=Malo
sizes.medium=Srednje
sizes.large=Veliko
sizes.x-large=Jako veliko
error.pdfPassword=PDF dokument je šifriran i zaporka nije dana ili je netočna
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Izbriši
username=Korisničko ime
password=Zaporka
@@ -181,7 +242,6 @@ red=Crveno
green=Zeleno
blue=Plavo
custom=Prilagođeno...
WorkInProgess=Radovi u tijeku, u slučaju grešaka molimo prijavite probleme!
poweredBy=Pokreće
yes=Da
no=Ne
@@ -525,6 +585,10 @@ home.addImage.title=Dodaj sliku
home.addImage.desc=Dodaje sliku na zadano mjesto u PDF-u
addImage.tags=img,jpg,slika,foto
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Dodaj vodeni žig
home.watermark.desc=DDodajte prilagođeni vodeni žig svom PDF dokumentu.
watermark.tags=Tekst,ponavljanje,etiketa,vlastiti,autorsko pravo,zaštita, img,jpg,slika,foto
@@ -1205,6 +1269,12 @@ addImage.everyPage=Na svakoj stranici?
addImage.upload=Dodaj sliku
addImage.submit=Dodaj sliku
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Spajanje
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
fileChooser.extractPDF=Extracting...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Releases
@@ -142,7 +142,7 @@ multiPdfPrompt=PDF-fájlok kiválasztása (2+)
multiPdfDropPrompt=Válassza ki (vagy húzza ide) az összes szükséges PDF-fájlt
imgPrompt=Kép kiválasztása
genericSubmit=Küldés
uploadLimit=Maximum file size:
uploadLimit=Maximális fájlméret:
uploadLimitExceededSingular=túl nagy. A maximálisan megengedett méret
uploadLimitExceededPlural=túl nagyok. A maximálisan megengedett méretek
processTimeWarning=Figyelmeztetés: A folyamat akár egy percig is eltarthat a fájlmérettől függően
@@ -163,13 +163,74 @@ alphabet=ABC
downloadPdf=PDF letöltése
text=Szöveg
font=Betűtípus
selectFillter=-- Válasszon --
selectFilter=-- Válasszon --
pageNum=Oldalszám
sizes.small=Kicsi
sizes.medium=Közepes
sizes.large=Nagy
sizes.x-large=Extra nagy
error.pdfPassword=A PDF-dokumentum jelszóval védett, és vagy nem adott meg jelszót, vagy helytelen jelszót adott meg
error.pdfCorrupted=A PDF-fájl sérültnek vagy hibásnak tűnik. Mielőtt folytatná ezt a műveletet, próbálja meg először a 'PDF javítása' funkcióval kijavítani a fájlt.
error.pdfCorruptedMultiple=Egy vagy több PDF-fájl sérültnek vagy hibásnak tűnik. Mielőtt megpróbálná egyesíteni őket, próbálja meg először a 'PDF javítása' funkciót használni minden fájlon.
error.pdfCorruptedDuring=Hiba {0}: A PDF-fájl sérültnek vagy hibásnak tűnik. Mielőtt folytatná ezt a műveletet, próbálja meg először a 'PDF javítása' funkcióval kijavítani a fájlt.
# Frontend corruption error messages
error.pdfInvalid=A(z) "{0}" PDF-fájl sérültnek tűnik, vagy érvénytelen szerkezetű. Kérjük, a folytatás előtt próbálja meg a 'PDF javítása' funkcióval kijavítani a fájlt.
error.tryRepair=Próbálja meg a PDF javítása funkciót a sérült fájlok javításához.
# Additional error messages
error.pdfEncryption=Úgy tűnik, a PDF titkosítási adatai sérültek. Ez akkor fordulhat elő, ha a PDF-et nem kompatibilis titkosítási módszerekkel hozták létre. Kérjük, először próbálja meg a 'PDF javítása' funkciót használni, vagy kérjen új másolatot a dokumentum készítőjétől.
error.fileProcessing=Hiba történt a fájl feldolgozása közben a(z) {0} művelet során: {1}
# Generic error message templates
error.toolNotInstalled=A(z) {0} nincs telepítve
error.toolRequired=A(z) {0} szükséges a(z) {1} művelethez
error.conversionFailed=A(z) {0} konvertálása sikertelen
error.commandFailed=A(z) {0} parancs végrehajtása sikertelen
error.algorithmNotAvailable=A(z) {0} algoritmus nem érhető el
error.optionsNotSpecified=A(z) {0} beállítások nincsenek megadva
error.fileFormatRequired=A fájlnak {0} formátumúnak kell lennie
error.invalidFormat=Érvénytelen {0} formátum: {1}
error.endpointDisabled=Ezt a végpontot a rendszergazda letiltotta
error.urlNotReachable=Az URL nem érhető el, kérjük, adjon meg érvényes URL-t
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=A(z) {0} DPI érték meghaladja a(z) {1} biztonságos maximális határértéket. A magas DPI-értékek memóriaproblémákat és összeomlásokat okozhatnak. Kérjük, használjon alacsonyabb DPI-értéket.
error.pageTooBigForDpi=A(z) {0} PDF-oldal túl nagy a(z) {1} DPI-vel való megjelenítéshez. Kérjük, próbáljon meg alacsonyabb DPI-értéket (ajánlott: 150 vagy kevesebb).
error.pageTooBigExceedsArray=A(z) {0} PDF-oldal túl nagy a(z) {1} DPI-vel való megjelenítéshez. Az eredményül kapott kép meghaladná a Java maximális tömbméretét. Kérjük, próbáljon meg alacsonyabb DPI-értéket (ajánlott: 150 vagy kevesebb).
error.pageTooBigFor300Dpi=A(z) {0} PDF-oldal túl nagy a 300 DPI-vel való megjelenítéshez. Az eredményül kapott kép meghaladná a Java maximális tömbméretét. Kérjük, használjon alacsonyabb DPI-értéket a PDF-kép konverzióhoz.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=Az API-kulcs érvénytelen.
error.userNotFound=A felhasználó nem található.
error.passwordRequired=A jelszó nem lehet üres.
error.accountLocked=Fiókját zároltuk a túl sok sikertelen bejelentkezési kísérlet miatt.
error.invalidEmail=Érvénytelen e-mail címek.
error.emailAttachmentRequired=Az e-mail küldéséhez csatolmány szükséges.
error.signatureNotFound=Az aláírásfájl nem található.
# File processing messages
error.fileNotFound=A fájl nem található azonosítóval: {0}
# Database and configuration messages
error.noBackupScripts=Nem találhatóak biztonsági mentési szkriptek.
error.unsupportedProvider=A(z) {0} jelenleg nem támogatott.
error.pathTraversalDetected=Útvonal-bejárási kísérlet észlelve biztonsági okokból.
# Validation messages
error.invalidArgument=Érvénytelen argumentum: {0}
error.argumentRequired=A(z) {0} nem lehet üres
error.operationFailed=A művelet sikertelen: {0}
error.angleNotMultipleOf90=A szögnek 90-nel oszthatónak kell lennie
error.pdfBookmarksNotFound=Nem található PDF-könyvjelző/vázlat a dokumentumban
error.fontLoadingFailed=Hiba a betűtípusfájl feldolgozása közben
error.fontDirectoryReadFailed=Nem sikerült beolvasni a betűtípus-könyvtárat
delete=Törlés
username=Felhasználónév
password=Jelszó
@@ -181,7 +242,6 @@ red=Piros
green=Zöld
blue=Kék
custom=Egyéni...
WorkInProgess=Fejlesztés alatt álló funkció, hibák előfordulhatnak. Kérjük, jelezze a problémákat!
poweredBy=Üzemelteti:
yes=Igen
no=Nem
@@ -200,7 +260,7 @@ disabledCurrentUserMessage=A jelenlegi felhasználó nem tiltható le
downgradeCurrentUserLongMessage=A jelenlegi felhasználó jogosultsági szintje nem csökkenthető. Ezért a jelenlegi felhasználó nem jelenik meg.
userAlreadyExistsOAuthMessage=A felhasználó már létezik OAuth2 felhasználóként.
userAlreadyExistsWebMessage=A felhasználó már létezik webes felhasználóként.
invalidRoleMessage=Invalid role.
invalidRoleMessage=Érvénytelen szerepkör.
error=Hiba
oops=Hoppá!
help=Súgó
@@ -213,7 +273,7 @@ color=Szín
sponsor=Támogató
info=Információ
pro=Pro
proFeatures=Pro Features
proFeatures=Pro Funkciók
page=Oldal
pages=Oldal
loading=Betöltés...
@@ -267,7 +327,7 @@ enterpriseEdition.button=Váltás Pro verzióra
enterpriseEdition.warning=Ez a funkció csak Pro felhasználók számára érhető el.
enterpriseEdition.yamlAdvert=A Stirling PDF Pro támogatja a YAML konfigurációs fájlokat és egyéb SSO funkciókat.
enterpriseEdition.ssoAdvert=Több felhasználókezelési funkcióra van szüksége? Tekintse meg a Stirling PDF Pro verzióját!
enterpriseEdition.proTeamFeatureDisabled=Team management features require a Pro licence or higher
enterpriseEdition.proTeamFeatureDisabled=A csapatkezelési funkciókhoz Pro licenc vagy magasabb szintű licenc szükséges
#################
@@ -525,6 +585,10 @@ home.addImage.title=Kép hozzáadása
home.addImage.desc=Kép hozzáadása a PDF megadott helyére
addImage.tags=kép,jpg,fotó,fénykép
home.attachments.title=Csatolmányok hozzáadása a PDF-hez
home.attachments.desc=Csatolmányok (beágyazott fájlok) hozzáadása vagy eltávolítása a PDF-ből
attachments.tags=beágyazás,csatolás,fájl,csatolmány,csatolmányok
home.watermark.title=Vízjel hozzáadása
home.watermark.desc=Egyedi vízjel hozzáadása PDF dokumentumhoz
watermark.tags=Szöveg,ismétlődő,címke,egyedi,szerzői jog,védjegy,kép,jpg,fotó,fénykép
@@ -676,7 +740,7 @@ home.HTMLToPDF.desc=HTML fájl vagy ZIP konvertálása PDF-be
HTMLToPDF.tags=jelölőnyelv,webtartalom,átalakítás,konvertálás
#eml-to-pdf
home.EMLToPDF.title=E-mail PDF-be
home.EMLToPDF.title=E-mail konvertálása PDF-be
home.EMLToPDF.desc=E-mail (EML) fájlok konvertálása PDF formátumba, beleértve a fejléceket, törzset és beágyazott képeket
EMLToPDF.tags=e-mail,konverzió,eml,üzenet,átalakítás,konvertálás,levél
@@ -1205,6 +1269,12 @@ addImage.everyPage=Minden oldalra?
addImage.upload=Kép hozzáadása
addImage.submit=Kép hozzáadása
#attachments
attachments.title=Mellékletek hozzáadása
attachments.header=Mellékletek hozzáadása
attachments.description=Lehetővé teszi mellékletek hozzáadását a PDF-hez
attachments.descriptionPlaceholder=Adjon meg egy leírást a mellékletekhez...
attachments.addButton=Mellékletek hozzáadása
#merge
merge.title=Egyesítés
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Húzza ide a PDF fájlt
fileChooser.dragAndDropImage=Húzza ide a képfájlt
fileChooser.hoveredDragAndDrop=Húzza ide a fájl(oka)t
fileChooser.extractPDF=Kinyerés...
fileChooser.addAttachments=Húzza ide a csatolmányokat
#release notes
releases.footer=Kiadási jegyzék
@@ -163,13 +163,74 @@ alphabet=Abjad
downloadPdf=Unduh PDF
text=Teks
font=Jenis huruf
selectFillter=-- Pilih --
selectFilter=-- Pilih --
pageNum=Nomor Halaman
sizes.small=Kecil
sizes.medium=Sedang
sizes.large=Besar
sizes.x-large=Sangat Besar
error.pdfPassword=Dokumen PDF disandikan dan kata sandi tidak diberikan atau kata sandi salah
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Hapus
username=Nama pengguna
password=Kata sandi
@@ -181,7 +242,6 @@ red=Merah
green=Hijau
blue=Biru
custom=Kustom...
WorkInProgess=Pekerjaan sedang diproses, Mungkin tidak berfungsi atau terdapat kutu, Silakan laporkan masalah apa pun!
poweredBy=Ditenagai oleh
yes=Ya
no=Tidak
@@ -525,6 +585,10 @@ home.addImage.title=Tambahkan gambar
home.addImage.desc=Menambahkan gambar ke lokasi yang ditentukan pada PDF
addImage.tags=img,jpg,gambar,foto
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Tambahkan watermark
home.watermark.desc=Menambahkan watermark khusus ke dokumen PDF Anda.
watermark.tags=Teks,berulang,label,sendiri,hak cipta,watermark,img,jpg,picture,photo
@@ -1205,6 +1269,12 @@ addImage.everyPage=Setiap Halaman?
addImage.upload=Tambahkan Gambar
addImage.submit=Tambahkan Gambar
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Gabungkan
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
fileChooser.extractPDF=Extracting...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Releases
@@ -163,13 +163,74 @@ alphabet=Alfabeto
downloadPdf=Scarica PDF
text=Testo
font=Font
selectFillter=-- Seleziona --
selectFilter=-- Seleziona --
pageNum=Numero pagina
sizes.small=Piccolo
sizes.medium=Medio
sizes.large=Grande
sizes.x-large=Extra-Large
error.pdfPassword=Il documento PDF è protetto da password e la password non è stata fornita oppure non era corretta
error.pdfCorrupted=Il file PDF sembra corrotto o danneggiato. Prova a utilizzare la funzione "Ripara PDF" per riparare il file prima di procedere con questa operazione.
error.pdfCorruptedMultiple=Uno o più file PDF sembrano corrotti o danneggiati. Prova a utilizzare la funzione 'Ripara PDF' su ciascun file prima di tentare di unirli.
error.pdfCorruptedDuring=Errore {0}: il file PDF sembra essere corrotto o danneggiato. Provare a utilizzare la funzione 'Ripara PDF' per riparare il file prima di procedere con questa operazione.
# Frontend corruption error messages
error.pdfInvalid=Il file PDF "{0}" sembra essere danneggiato o ha una struttura non valida. Prova a utilizzare la funzione 'Ripara PDF' per correggere il file prima di procedere.
error.tryRepair=Prova a utilizzare la funzionalità Ripara PDF per riparare i file danneggiati.
# Additional error messages
error.pdfEncryption=Il PDF sembra contenere dati di crittografia danneggiati. Questo può accadere quando il PDF è stato creato con metodi di crittografia incompatibili. Prova prima a utilizzare la funzione 'Ripara PDF' o contatta l'autore del documento per ottenere una nuova copia.
error.fileProcessing=Si è verificato un errore durante l'elaborazione del file durante l'operazione {0}: {1}
# Generic error message templates
error.toolNotInstalled={0} non è installato
error.toolRequired={0} è richiesto per {1}
error.conversionFailed={0} conversione fallita
error.commandFailed={0} comando fallito
error.algorithmNotAvailable={0} algoritmo non disponibile
error.optionsNotSpecified={0} le opzioni non sono specificate
error.fileFormatRequired=Il file deve essere nel formato {0}
error.invalidFormat=Formato {0} non valido:{1}
error.endpointDisabled=Questo endpoint è stato disabilitato dall'amministratore
error.urlNotReachable=L'URL non è raggiungibile, inserisci un URL valido
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=Il valore DPI {0} supera il limite massimo di sicurezza di {1}. Valori DPI elevati possono causare problemi di memoria e arresti anomali. Utilizzare un valore DPI inferiore.
error.pageTooBigForDpi=La pagina PDF {0} è troppo grande per essere visualizzata a {1} DPI. Prova un valore DPI inferiore (consigliato: 150 o inferiore).
error.pageTooBigExceedsArray=La pagina PDF {0} è troppo grande per essere visualizzata a {1} DPI. L'immagine risultante supererebbe la dimensione massima dell'array Java. Prova un valore DPI inferiore (consigliato: 150 o inferiore).
error.pageTooBigFor300Dpi=La pagina PDF {0} è troppo grande per essere renderizzata a 300 DPI. L'immagine risultante supererebbe la dimensione massima dell'array Java. Utilizzare un valore DPI inferiore per la conversione da PDF a immagine.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=La chiave API non è valida.
error.userNotFound=Utente non trovato.
error.passwordRequired=La password non deve essere nulla.
error.accountLocked=Il tuo account è stato bloccato a causa di troppi tentativi di accesso non riusciti.
error.invalidEmail=Indirizzi email non validi forniti.
error.emailAttachmentRequired=Per inviare l'email è necessario un allegato.
error.signatureNotFound=File della firma non trovato.
# File processing messages
error.fileNotFound=File non trovato con ID: {0}
# Database and configuration messages
error.noBackupScripts=Non sono stati trovati script di backup.
error.unsupportedProvider={0} non è attualmente supportato.
error.pathTraversalDetected=Per motivi di sicurezza è stato rilevato un attraversamento del percorso.
# Validation messages
error.invalidArgument=Argomento non valido: {0}
error.argumentRequired={0} non deve essere nullo
error.operationFailed=Operazione fallita: {0}
error.angleNotMultipleOf90=L'angolo deve essere un multiplo di 90
error.pdfBookmarksNotFound=Nessun segnalibro/schema PDF trovato nel documento
error.fontLoadingFailed=Errore durante l'elaborazione del font file
error.fontDirectoryReadFailed=Impossibile leggere la directory dei font
delete=Elimina
username=Nome utente
password=Password
@@ -181,7 +242,6 @@ red=Rosso
green=Verde
blue=Blu
custom=Personalizzato
WorkInProgess=Lavori in corso, potrebbe non funzionare o essere difettoso, segnalare eventuali problemi!
poweredBy=Alimentato da
yes=Si
no=No
@@ -525,6 +585,10 @@ home.addImage.title=Aggiungi Immagine
home.addImage.desc=Aggiungi un'immagine in un punto specifico del PDF (Lavori in corso)
addImage.tags=img,jpg,immagine,foto
home.attachments.title=Aggiungi allegati
home.attachments.desc=Aggiungere o rimuovere file incorporati (allegati) da/a un PDF
attachments.tags=incorporare,allegare,file,allegato,allegati
home.watermark.title=Aggiungi Filigrana
home.watermark.desc=Aggiungi una filigrana al tuo PDF.
watermark.tags=Testo,ripetizione,etichetta,proprio,copyright,marchio,img,jpg,immagine,foto
@@ -1199,12 +1263,18 @@ compress.submit=Comprimi
#Add image
addImage.title=Aggiungi Immagine
addImage.title=Aggiungere Immagine
addImage.header=Aggiungi un'immagine ad un PDF
addImage.everyPage=Ogni pagina?
addImage.upload=Aggiungi immagine
addImage.submit=Aggiungi immagine
#attachments
attachments.title=Aggiungere allegati
attachments.header=Aggiungi allegati
attachments.description=Consente di aggiungere allegati al PDF
attachments.descriptionPlaceholder=Inserisci una descrizione per gli allegati...
attachments.addButton=Aggiungi allegati
#merge
merge.title=Unisci
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Trascina & rilascia il file PDF
fileChooser.dragAndDropImage=Trascina & rilascia il file immagine
fileChooser.hoveredDragAndDrop=Trascina & rilascia i file qui
fileChooser.extractPDF=Estraendo...
fileChooser.addAttachments=trascina & rilascia gli allegati qui
#release notes
releases.footer=Rilasci
File diff suppressed because it is too large Load Diff
@@ -163,13 +163,74 @@ alphabet=알파벳
downloadPdf=PDF 다운로드
text=텍스트
font=글꼴
selectFillter=-- 선택 --
selectFilter=-- 선택 --
pageNum=페이지 번호
sizes.small=작게
sizes.medium=중간
sizes.large=크게
sizes.x-large=매우 크게
error.pdfPassword=PDF 문서가 비밀번호로 보호되어 있으며, 비밀번호가 제공되지 않았거나 올바르지 않습니다
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=삭제
username=사용자 이름
password=비밀번호
@@ -181,7 +242,6 @@ red=빨강
green=초록
blue=파랑
custom=사용자 지정...
WorkInProgess=작업 진행 중, 작동하지 않거나 버그가 있을 수 있습니다. 문제가 있으면 신고해 주세요!
poweredBy=제공
yes=
no=아니오
@@ -525,6 +585,10 @@ home.addImage.title=이미지 추가
home.addImage.desc=PDF의 지정된 위치에 이미지 추가
addImage.tags=이미지,jpg,사진
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=워터마크 추가
home.watermark.desc=PDF 문서에 사용자 지정 워터마크를 추가합니다.
watermark.tags=텍스트,반복,레이블,소유,저작권,상표,이미지,jpg,사진
@@ -1205,6 +1269,12 @@ addImage.everyPage=모든 페이지?
addImage.upload=이미지 추가
addImage.submit=이미지 추가
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=병합
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=PDF 파일을 드래그 앤 드롭
fileChooser.dragAndDropImage=이미지 파일을 드래그 앤 드롭
fileChooser.hoveredDragAndDrop=여기에 파일을 드래그 앤 드롭하세요
fileChooser.extractPDF=추출 중...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=릴리스
@@ -163,13 +163,74 @@ alphabet=അക്ഷരമാല
downloadPdf=PDF ഡൗൺലോഡ് ചെയ്യുക
text=ടെക്സ്റ്റ്
font=അക്ഷരം
selectFillter=-- തിരഞ്ഞെടുക്കുക --
selectFilter=-- തിരഞ്ഞെടുക്കുക --
pageNum=പേജ് നമ്പർ
sizes.small=ചെറുത്
sizes.medium=ഇടത്തരം
sizes.large=വലുത്
sizes.x-large=കൂടുതൽ വലുത്
error.pdfPassword=PDF ഡോക്യുമെന്റ് പാസ്വേഡ് ഉപയോഗിച്ച് സംരക്ഷിച്ചിരിക്കുന്നു, പാസ്വേഡ് നൽകിയിട്ടില്ല അല്ലെങ്കിൽ തെറ്റായിരുന്നു
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=മായ്ക്കുക
username=ഉപയോക്തൃനാമം
password=പാസ്വേഡ്
@@ -181,7 +242,6 @@ red=ചുവപ്പ്
green=പച്ച
blue=നീല
custom=ഇഷ്ടാനുസൃതം...
WorkInProgess=നിർമ്മാണത്തിലിരിക്കുന്നു, ശരിയായി പ്രവർത്തിച്ചേക്കില്ല അല്ലെങ്കിൽ ബഗ്ഗുകൾ ഉണ്ടാകാം, ദയവായി പ്രശ്നങ്ങൾ അറിയിക്കുക!
poweredBy=സഹായത്തോടെ
yes=അതെ
no=ഇല്ല
@@ -525,6 +585,10 @@ home.addImage.title=ചിത്രം ചേർക്കുക
home.addImage.desc=PDF-ൽ ഒരു നിശ്ചിത സ്ഥാനത്ത് ഒരു ചിത്രം ചേർക്കുന്നു
addImage.tags=img,jpg,ചിത്രം,ഫോട്ടോ
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=വാട്ടർമാർക്ക് ചേർക്കുക
home.watermark.desc=നിങ്ങളുടെ PDF പ്രമാണത്തിലേക്ക് ഒരു ഇഷ്ടാനുസൃത വാട്ടർമാർക്ക് ചേർക്കുക.
watermark.tags=ടെക്സ്റ്റ്,ആവർത്തിക്കുന്ന,ലേബൽ,സ്വന്തം,പകർപ്പവകാശം,വ്യാപാരമുദ്ര,img,jpg,ചിത്രം,ഫോട്ടോ
@@ -1205,6 +1269,12 @@ addImage.everyPage=എല്ലാ പേജിലും?
addImage.upload=ചിത്രം ചേർക്കുക
addImage.submit=ചിത്രം ചേർക്കുക
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=ലയിപ്പിക്കുക
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=PDF ഫയൽ വലിച്ചിടുക
fileChooser.dragAndDropImage=ചിത്ര ഫയൽ വലിച്ചിടുക
fileChooser.hoveredDragAndDrop=ഫയൽ(കൾ) ഇവിടെ വലിച്ചിടുക
fileChooser.extractPDF=വേർതിരിച്ചെടുക്കുന്നു...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=റിലീസുകൾ
@@ -163,13 +163,74 @@ alphabet=Alfabet
downloadPdf=PDF downloaden
text=Tekst
font=Lettertype
selectFillter=-- Selecteer --
selectFilter=-- Selecteer --
pageNum=Paginanummer
sizes.small=Klein
sizes.medium=Gemiddeld
sizes.large=Groot
sizes.x-large=Extra groot
error.pdfPassword=Het PDF document is beveiligd met een wachtwoord en het wachtwoord is niet ingevoerd of is onjuist
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Verwijderen
username=Gebruikersnaam
password=Wachtwoord
@@ -181,7 +242,6 @@ red=Rood
green=Groen
blue=Blauw
custom=Aangepast...
WorkInProgess=Werk in uitvoering. Werkt mogelijk niet of bevat fouten. Meld eventuele problemen!
poweredBy=Mogelijk gemaakt door
yes=Ja
no=Nee
@@ -525,6 +585,10 @@ home.addImage.title=Afbeelding toevoegen
home.addImage.desc=Voegt een afbeelding toe op een specifieke locatie in de PDF
addImage.tags=img,jpg,foto
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Watermerk toevoegen
home.watermark.desc=Voeg een aangepast watermerk toe aan je PDF-document.
watermark.tags=Tekst,herhalend,label,eigen,copyright,handelsmerk,img,jpg,foto
@@ -1205,6 +1269,12 @@ addImage.everyPage=Elke pagina?
addImage.upload=Afbeelding toevoegen
addImage.submit=Afbeelding toevoegen
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Samenvoegen
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
fileChooser.extractPDF=Extracting...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Releases
@@ -163,13 +163,74 @@ alphabet=Alfabet
downloadPdf=Last ned PDF
text=Tekst
font=Skrifttype
selectFillter=-- Velg --
selectFilter=-- Velg --
pageNum=Sidenummer
sizes.small=Liten
sizes.medium=Middels
sizes.large=Stor
sizes.x-large=Ekstra Stor
error.pdfPassword=PDF-dokumentet er passordbeskyttet og enten ble passordet ikke oppgitt eller var feil
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Slett
username=Brukernavn
password=Passord
@@ -181,7 +242,6 @@ red=Rød
green=Grønn
blue=Blå
custom=Tilpasset...
WorkInProgess=Arbeid pågår, Kan være feil eller buggy, Vennligst rapporter eventuelle problemer!
poweredBy=Drevet av
yes=Ja
no=Nei
@@ -525,6 +585,10 @@ home.addImage.title=Legg til bilde
home.addImage.desc=Legger til et bilde på en angitt plassering i PDF-en
addImage.tags=bilde,jpg,foto
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Legg til Vannmerke
home.watermark.desc=Legg til et tilpasset vannmerke i din PDF-dokument.
watermark.tags=tekst,gjentakende,etikett,egen,opphavsrett,varemerke,bilde,jpg,foto
@@ -1205,6 +1269,12 @@ addImage.everyPage=På hver side?
addImage.upload=Legg til bilde
addImage.submit=Legg til bilde
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Slå sammen
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
fileChooser.extractPDF=Extracting...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Versjoner
@@ -163,13 +163,74 @@ alphabet=Alfabet
downloadPdf=Pobierz PDF
text=Tekst
font=Czcionka
selectFillter=-- Wybierz --
selectFilter=-- Wybierz --
pageNum=Numer strony
sizes.small=mniejszy
sizes.medium=średni
sizes.large=duży
sizes.x-large=bardzo duży
error.pdfPassword=Dokument PDF jest zabezpieczony hasłem, musisz podać prawidłowe hasło.
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=usuń
username=nazwa użytkownika
password=hasło
@@ -181,7 +242,6 @@ red=czerwony
green=zielony
blue=niebieski
custom=Własny...
WorkInProgess=Praca w toku, proszę zgłaszać błędy!
poweredBy=Zasilany
yes=tak
no=nie
@@ -525,6 +585,10 @@ home.addImage.title=Dodaj obraz
home.addImage.desc=Dodaje obraz w wybranym miejscu w dokumencie PDF
addImage.tags=img,jpg,obraz,zdjęcie
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Dodaj znak wodny
home.watermark.desc=Dodaj niestandardowy znak wodny do dokumentu PDF.
watermark.tags=Tekst,powtarzanie,etykieta,własne,prawa autorskie,znak wodny,img,jpg,obraz,zdjęcie
@@ -1205,6 +1269,12 @@ addImage.everyPage=Każda strona?
addImage.upload=Dodaj obraz
addImage.submit=Dodaj obraz
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Połącz
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Przeciągnij i upuść plik PDF
fileChooser.dragAndDropImage=Przeciągnij i upuść plik obrazu
fileChooser.hoveredDragAndDrop=Przeciągnij i upuść plik(i) tutaj
fileChooser.extractPDF=Trwa wyodrębnianie...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Wydania
@@ -163,13 +163,74 @@ alphabet=Alfabeto
downloadPdf=Baixar PDF
text=Texto
font=Fonte
selectFillter=-- Selecione --
selectFilter=-- Selecione --
pageNum=Número da Página
sizes.small=Pequeno
sizes.medium=Médio
sizes.large=Grande
sizes.x-large=Extra grande
error.pdfPassword=O PDF está protegido por senha e a senha não foi fornecida ou está incorreta
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Apagar
username=Usuário
password=Senha
@@ -181,7 +242,6 @@ red=Vermelho
green=Verde
blue=Azul
custom=Personalizado...
WorkInProgess=Trabalho em progresso, talvez não funcione ou apresente erros, Por favor, reporte qualquer problema!
poweredBy=Distribuído por
yes=Sim
no=Não
@@ -525,6 +585,10 @@ home.addImage.title=Adicionar Imagem
home.addImage.desc=Adicionar imagens em um local definido no PDF.
addImage.tags=img,jpg,imagem,foto
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Adicionar Marca d'água
home.watermark.desc=Adicionar uma marca d'água personalizada ao seu PDF.
watermark.tags=Texto,repetindo,rótulo,próprio,direitos autorais,marca registrada,img,jpg,imagem,foto
@@ -1205,6 +1269,12 @@ addImage.everyPage=Para cada página?
addImage.upload=Carregar imagem
addImage.submit=Adicionar imagem
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Mesclar
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Arraste & Solte PDF(s)
fileChooser.dragAndDropImage=Arraste & Solte Imagem(ns)
fileChooser.hoveredDragAndDrop=Arraste & Solte arquivo(s) aqui
fileChooser.extractPDF=Extraindo...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Versões
@@ -163,13 +163,74 @@ alphabet=Alfabeto
downloadPdf=Transferir PDF
text=Texto
font=Tipo de letra
selectFillter=-- Selecionar --
selectFilter=-- Selecionar --
pageNum=Número da Página
sizes.small=Pequeno
sizes.medium=Médio
sizes.large=Grande
sizes.x-large=Extra Grande
error.pdfPassword=O documento PDF está protegido por palavra-passe e ou não foi fornecida ou está incorreta
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Eliminar
username=Nome de utilizador
password=Palavra-passe
@@ -181,7 +242,6 @@ red=Vermelho
green=Verde
blue=Azul
custom=Personalizar...
WorkInProgess=Trabalho em progresso, pode não funcionar ou ter erros, Por favor reporte quaisquer problemas!
poweredBy=Desenvolvido por
yes=Sim
no=Não
@@ -525,6 +585,10 @@ home.addImage.title=Adicionar imagem
home.addImage.desc=Adiciona uma imagem numa localização definida no PDF
addImage.tags=img,jpg,imagem,foto
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Adicionar Marca de Água
home.watermark.desc=Adicionar uma marca de água personalizada ao seu documento PDF.
watermark.tags=Texto,repetindo,etiqueta,próprio,copyright,marca registada,img,jpg,imagem,foto
@@ -1205,6 +1269,12 @@ addImage.everyPage=Todas as Páginas?
addImage.upload=Adicionar imagem
addImage.submit=Adicionar imagem
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Juntar
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Arrastar e Largar ficheiro PDF
fileChooser.dragAndDropImage=Arrastar e Largar ficheiro de Imagem
fileChooser.hoveredDragAndDrop=Arrastar e Largar ficheiro(s) aqui
fileChooser.extractPDF=Extraindo...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Lançamentos
@@ -163,13 +163,74 @@ alphabet=Alfabet
downloadPdf=Descarcă PDF
text=Text
font=Font
selectFillter=-- Selectează --
selectFilter=-- Selectează --
pageNum=Numărul paginii
sizes.small=Mic
sizes.medium=Mediu
sizes.large=Mare
sizes.x-large=Foarte Mare
error.pdfPassword=Documentul PDF este protejat cu parolă și fie parola nu a fost furnizată, fie a fost incorectă
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Șterge
username=Nume de utilizator
password=Parolă
@@ -181,7 +242,6 @@ red=Roșu
green=Verde
blue=Albastru
custom=Personalizat...
WorkInProgess=Lucru în curs, S-ar putea să nu funcționeze sau să aibă erori, Vă rugăm să raportați orice probleme!
poweredBy=Propulsat de
yes=Da
no=Nu
@@ -525,6 +585,10 @@ home.addImage.title=Adaugă imagine
home.addImage.desc=Adaugă o imagine într-o locație specifică pe PDF (în curs de dezvoltare)
addImage.tags=img,jpg,poză,fotografie
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Adaugă Filigran
home.watermark.desc=Adaugă un filigran personalizat la documentul PDF.
watermark.tags=Text,repetitiv,etichetă,propriu,drepturi de autor,marcă comercială,img,jpg,poză,fotografie
@@ -1205,6 +1269,12 @@ addImage.everyPage=Pe fiecare pagină?
addImage.upload=Adăugare imagine
addImage.submit=Adăugare imagine
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Unire
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
fileChooser.extractPDF=Extracting...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Releases
@@ -163,13 +163,74 @@ alphabet=Алфавит
downloadPdf=Скачать PDF
text=Текст
font=Шрифт
selectFillter=-- Выбрать --
selectFilter=-- Выбрать --
pageNum=Номер страницы
sizes.small=Малый
sizes.medium=Средний
sizes.large=Большой
sizes.x-large=Очень большой
error.pdfPassword=PDF-документ защищен паролем, и пароль не был предоставлен или был неверным
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Удалить
username=Имя пользователя
password=Пароль
@@ -181,7 +242,6 @@ red=Красный
green=Зеленый
blue=Синий
custom=Пользовательский...
WorkInProgess=В разработке, возможны ошибки и сбои, пожалуйста, сообщайте о любых проблемах!
poweredBy=Работает на
yes=Да
no=Нет
@@ -525,6 +585,10 @@ home.addImage.title=Добавить изображение
home.addImage.desc=Добавляет изображение в указанное место PDF
addImage.tags=изображение,jpg,картинка,фото
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Добавить водяной знак
home.watermark.desc=Добавьте собственный водяной знак в ваш PDF-документ.
watermark.tags=текст,повторяющийся,метка,собственный,авторское право,торговая марка,изображение,jpg,картинка,фото
@@ -1205,6 +1269,12 @@ addImage.everyPage=Каждая страница?
addImage.upload=Добавить изображение
addImage.submit=Добавить изображение
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Объединить
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Перетащите PDF-файл
fileChooser.dragAndDropImage=Перетащите файл изображения
fileChooser.hoveredDragAndDrop=Перетащите файл(ы) сюда
fileChooser.extractPDF=Извлечение...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Релизы
@@ -163,13 +163,74 @@ alphabet=Abeceda
downloadPdf=Stiahnuť PDF
text=Text
font=Font
selectFillter=-- Vyberte --
selectFilter=-- Vyberte --
pageNum=Číslo stránky
sizes.small=Malé
sizes.medium=Stredné
sizes.large=Veľké
sizes.x-large=Veľmi veľké
error.pdfPassword=PDF dokument je chránený heslom a buď heslo nebolo zadané, alebo bolo nesprávne
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Vymazať
username=Používateľské meno
password=Heslo
@@ -181,7 +242,6 @@ red=Červená
green=Zelená
blue=Modrá
custom=Vlastné...
WorkInProgess=Práca prebieha, nemusí fungovať alebo môže byť chybová, prosím nahláste akékoľvek problémy!
poweredBy=Poskytované
yes=Áno
no=Nie
@@ -525,6 +585,10 @@ home.addImage.title=Pridať obrázok
home.addImage.desc=Pridať obrázok na zadané miesto v PDF
addImage.tags=img,jpg,obrázok,fotografia
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Pridať vodotlač
home.watermark.desc=Pridať vlastnú vodotlač do vášho PDF dokumentu.
watermark.tags=Text,opakujúci sa,označenie,vlastné,autorské práva,ochranná známka,img,jpg,obrázok,fotografia
@@ -1205,6 +1269,12 @@ addImage.everyPage=Každá stránka?
addImage.upload=Pridať obrázok
addImage.submit=Pridať obrázok
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Zlúčiť
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
fileChooser.extractPDF=Extracting...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Releases
@@ -163,13 +163,74 @@ alphabet=Abeceda
downloadPdf=Prenesi PDF
text=Besedilo
font=Pisava
selectFillter=-- Izberite --
selectFilter=-- Izberite --
pageNum=Številka strani
sizes.small=Majhen
sizes.medium=Srednje
sizes.large=Veliko
sizes.x-large=X-Velik
error.pdfPassword=Dokument PDF je zaščiten z geslom in geslo ni bilo vneseno ali pa je bilo napačno
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Izbriši
username=Uporabniško ime
password=Geslo
@@ -181,7 +242,6 @@ red=rdeča
green=zelena
blue=modra
custom=Po meri...
WorkInProgess=Delo je v teku, morda ne bo delovalo ali bo hroščalo, prosimo, prijavite morebitne težave!
poweredBy=Poganja
yes=Da
no=Ne
@@ -525,6 +585,10 @@ home.addImage.title=Dodaj sliko
home.addImage.desc=Doda sliko na določeno mesto v PDF-ju
addImage.tags=img,jpg,slika,fotografija
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Dodaj vodni žig
home.watermark.desc=V dokument PDF dodajte vodni žig po meri.
watermark.tags=Besedilo, ponavljajoče se, oznaka, lastno, avtorske pravice, blagovna znamka, img, jpg, slika, fotografija
@@ -1205,6 +1269,12 @@ addImage.everyPage=Vsaka stran?
addImage.upload=Dodaj sliko
addImage.submit=Dodaj sliko
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Združi
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Povleci in spusti datoteko PDF
fileChooser.dragAndDropImage=Povleci in spusti slikovno datoteko
fileChooser.hoveredDragAndDrop=Povleci in spusti datoteko(e) sem
fileChooser.extractPDF=Izvlečenje...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Izdaje
File diff suppressed because it is too large Load Diff
@@ -163,13 +163,74 @@ alphabet=Alfabet
downloadPdf=Ladda ner PDF
text=Text
font=Teckensnitt
selectFillter=-- Välj --
selectFilter=-- Välj --
pageNum=Sidnummer
sizes.small=Liten
sizes.medium=Mellan
sizes.large=Stor
sizes.x-large=Extra stor
error.pdfPassword=PDF-dokumentet är lösenordsskyddat och antingen har lösenordet inte angetts eller är felaktigt
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Radera
username=Användarnamn
password=Lösenord
@@ -181,7 +242,6 @@ red=Röd
green=Grön
blue=Blå
custom=Anpassad...
WorkInProgess=Pågående arbete, kan vara icke fungerande eller buggigt. Rapportera eventuella problem!
poweredBy=Drivs av
yes=Ja
no=Nej
@@ -525,6 +585,10 @@ home.addImage.title=Lägg till bild
home.addImage.desc=Lägger till en bild på en angiven plats i PDF:en (pågår arbete)
addImage.tags=img,jpg,bild,foto
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Lägg till vattenstämpel
home.watermark.desc=Lägg till en anpassad vattenstämpel till ditt PDF-dokument.
watermark.tags=Text,upprepande,etikett,egen,upphovsrätt,varumärke,img,jpg,bild,foto
@@ -1205,6 +1269,12 @@ addImage.everyPage=Varje sida?
addImage.upload=Lägg till bild
addImage.submit=Lägg till bild
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Sammanfoga
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Dra & Släpp PDF fil
fileChooser.dragAndDropImage=Dra & Släpp bildfil
fileChooser.hoveredDragAndDrop=Dra & Släpp fil(er) här
fileChooser.extractPDF=Extraherar...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Utgåvor
@@ -163,13 +163,74 @@ alphabet=ตัวอักษร
downloadPdf=ดาวน์โหลด PDF
text=ข้อความ
font=ฟอนต์
selectFillter=-- เลือก --
selectFilter=-- เลือก --
pageNum=หมายเลขหน้า
sizes.small=เล็ก
sizes.medium=กลาง
sizes.large=ใหญ่
sizes.x-large=ใหญ่มาก
error.pdfPassword=เอกสาร PDF มีรหัสผ่าน และไม่ได้ระบุรหัสผ่านหรือรหัสผ่านไม่ถูกต้อง
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=ลบ
username=ชื่อผู้ใช้
password=รหัสผ่าน
@@ -181,7 +242,6 @@ red=แดง
green=เขียว
blue=น้ำเงิน
custom=ปรับแต่ง...
WorkInProgess=กำลังดำเนินการ อาจไม่ทำงานหรือมีบั๊ก โปรดรายงานปัญหาใด ๆ!
poweredBy=ขับเคลื่อนโดย
yes=ใช่
no=ไม่
@@ -525,6 +585,10 @@ home.addImage.title=เพิ่มรูปภาพ
home.addImage.desc=เพิ่มรูปภาพไปยังตำแหน่งที่กำหนดใน PDF
addImage.tags=รูปภาพ, JPG, ภาพ, รูปถ่าย
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=เพิ่มลายน้ำ
home.watermark.desc=เพิ่มลายน้ำที่กำหนดเองลงในเอกสาร PDF ของคุณ
watermark.tags=ข้อความ, ซ้ำ, ป้าย, ของคุณเอง, ลิขสิทธิ์, เครื่องหมายการค้า, รูปภาพ, JPG, ภาพ, รูปถ่าย
@@ -1205,6 +1269,12 @@ addImage.everyPage=ทุกหน้า?
addImage.upload=เพิ่มรูปภาพ
addImage.submit=เพิ่มรูปภาพ
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=รวม
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
fileChooser.extractPDF=Extracting...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Releases
@@ -163,13 +163,74 @@ alphabet=Alfabe
downloadPdf=PDF İndir
text=Metin
font=Yazı tipi
selectFillter=-- Seçiniz --
selectFilter=-- Seçiniz --
pageNum=Sayfa Numarası
sizes.small=Küçük
sizes.medium=Orta
sizes.large=Büyük
sizes.x-large=Çok Büyük
error.pdfPassword=PDF belgesi şifreli ve şifre ya sağlanmadı ya da yanlış.
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Sil
username=Kullanıcı Adı
password=Parola
@@ -181,7 +242,6 @@ red=Kırmızı
green=Yeşil
blue=Mavi
custom=Özel
WorkInProgess=Çalışmalar devam ediyor, Çalışmayabilir veya hatalı olabilir, Lütfen herhangi bir sorunu bildirin!
poweredBy=Tarafından desteklenmektedir
yes=Evet
no=Hayır
@@ -525,6 +585,10 @@ home.addImage.title=Resim Ekle
home.addImage.desc=PDF'e belirli bir konuma resim ekler
addImage.tags=img,jpg,fotoğraf,resim
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Filigran Ekle
home.watermark.desc=PDF belgenize özel bir filigran ekleyin.
watermark.tags=Metin,tekrarlayan,etiket,kendi,telif hakkı,marka,img,jpg,fotoğraf,resim
@@ -1205,6 +1269,12 @@ addImage.everyPage=Her Sayfa mı?
addImage.upload=Resim ekle
addImage.submit=Resim ekle
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Birleştir
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=PDF dosyasını Sürükle & Bırak
fileChooser.dragAndDropImage=Görsel dosyasını Sürükle & Bırak
fileChooser.hoveredDragAndDrop=Dosya(lar)ı buraya sürükleyip bırakın
fileChooser.extractPDF=PDF Çıkarılıyor...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Sürümler
@@ -163,13 +163,74 @@ alphabet=Алфавіт
downloadPdf=Завантажити PDF
text=Текст
font=Шрифт
selectFillter=-- Вибрати --
selectFilter=-- Вибрати --
pageNum=номер сторінки
sizes.small=Малий
sizes.medium=Середній
sizes.large=Великий
sizes.x-large=Дуже великий
error.pdfPassword=Документ PDF захищено паролем, і пароль не був наданий або був невірним
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Видалити
username=Ім'я користувача
password=Пароль
@@ -181,7 +242,6 @@ red=Червоний
green=Зелений
blue=Синій
custom=Звичай...
WorkInProgess=Робота триває, може не працювати або глючити, будь ласка, повідомляйте про будь-які проблеми!
poweredBy=Працює на
yes=Так
no=Ні
@@ -525,6 +585,10 @@ home.addImage.title=Додати зображення
home.addImage.desc=Додає зображення у вказане місце в PDF (в розробці)
addImage.tags=зображення,jpg,картинка,фото
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Додати водяний знак
home.watermark.desc=Додайте свій водяний знак до документа PDF.
watermark.tags=текст,повторний,мітка,власний,авторське право,торговельна марка,зображення,jpg,картинка,фото
@@ -1205,6 +1269,12 @@ addImage.everyPage=Кожна сторінка?
addImage.upload=Додати зображення
addImage.submit=Додати зображення
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Об'єднати
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Перетащите PDF-файл
fileChooser.dragAndDropImage=Перетащите файл зображення
fileChooser.hoveredDragAndDrop=Перетащите файл(и) сюда
fileChooser.extractPDF=Видобування...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Релізи
@@ -163,13 +163,74 @@ alphabet=Bảng chữ cái
downloadPdf=Tải xuống PDF
text=Văn bản
font=Phông chữ
selectFillter=-- Chọn --
selectFilter=-- Chọn --
pageNum=Số trang
sizes.small=Nhỏ
sizes.medium=Trung bình
sizes.large=Lớn
sizes.x-large=Rất lớn
error.pdfPassword=Tài liệu PDF được bảo vệ bằng mật khẩu và mật khẩu không được cung cấp hoặc không chính xác
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=Xóa
username=Tên người dùng
password=Mật khẩu
@@ -181,7 +242,6 @@ red=Đỏ
green=Xanh lá
blue=Xanh dương
custom=Tùy chỉnh...
WorkInProgess=Đang trong quá trình phát triển, Có thể không hoạt động hoặc có lỗi, Vui lòng báo cáo mọi vấn đề!
poweredBy=Được hỗ trợ bởi
yes=
no=Không
@@ -525,6 +585,10 @@ home.addImage.title=Thêm hình ảnh
home.addImage.desc=Thêm hình ảnh vào vị trí cố định trên PDF
addImage.tags=img,jpg,hình ảnh,ảnh
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=Thêm hình mờ
home.watermark.desc=Thêm hình mờ tùy chỉnh vào tài liệu PDF của bạn.
watermark.tags=Văn bản,lặp lại,nhãn,riêng,bản quyền,thương hiệu,img,jpg,hình ảnh,ảnh
@@ -1205,6 +1269,12 @@ addImage.everyPage=Mọi trang?
addImage.upload=Thêm hình ảnh
addImage.submit=Thêm hình ảnh
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=Trộn
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
fileChooser.extractPDF=Extracting...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=Releases
@@ -163,13 +163,74 @@ alphabet=字母表
downloadPdf=下载 PDF
text=文本
font=字体
selectFillter=-- 选择--
selectFilter=-- 选择--
pageNum=页码
sizes.small=小型尺寸
sizes.medium=中型尺寸
sizes.large=大型尺寸
sizes.x-large=超大型尺寸
error.pdfPassword=PDF文档有密码,未提供密码或密码不正确
error.pdfCorrupted=PDF文件似乎已损坏或损坏。在继续此操作之前,请先尝试使用“修复PDF”功能修复文件。
error.pdfCorruptedMultiple=一个或多个PDF文件似乎已损坏或损坏。请先对单个文件使用“修复PDF”功能,然后再尝试合并它们。
error.pdfCorruptedDuring=错误 {0} :PDF文件似乎已损坏或损坏。在继续此操作之前,请先尝试使用“修复PDF”功能修复文件。
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} 未被安装
error.toolRequired={1} 依赖于 {0}
error.conversionFailed={0} 转换失败
error.commandFailed={0} 执行命令失败
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=该端点被管理员禁用
error.urlNotReachable=URL无法访问,请提供有效的URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI值 {0} 超过 {1} 的最大安全限值。高DPI值可能导致内存溢出或崩溃。请尝试较低的DPI值。
error.pageTooBigForDpi=PDF页面 {0} 太大,无法以 {1} DPI呈现。请尝试较低的DPI值(建议:150或更低)。
error.pageTooBigExceedsArray=PDF页面 {0} 太大,无法以 {1} DPI呈现。生成的图像将超过Java的最大数组大小。请尝试较低的DPI值(建议:150或更低)。
error.pageTooBigFor300Dpi=PDF页面 {0} 太大,无法以300 DPI呈现。生成的图像将超过Java的最大数组大小。请使用较低的DPI值进行pdf到图像的转换。
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API秘钥无效。
error.userNotFound=用户未找到。
error.passwordRequired=密码不应为空。
error.accountLocked=由于过多的失败登录尝试,你的账户被锁定。
error.invalidEmail=提供了无效的电子邮件地址。
error.emailAttachmentRequired=发送该电子邮件需要附件。
error.signatureNotFound=证书文件未找到。
# File processing messages
error.fileNotFound=具有此ID的文件未找到: {0}
# Database and configuration messages
error.noBackupScripts=未找到备份脚本。
error.unsupportedProvider={0} 当前不被支持。
error.pathTraversalDetected=检测到存在安全问题的路径遍历操作。
# Validation messages
error.invalidArgument=不合法的参数: {0}
error.argumentRequired={0} 不应当为空
error.operationFailed=操作失败: {0}
error.angleNotMultipleOf90=角度应当为90°的倍数
error.pdfBookmarksNotFound=文档中没有找到PDF书签/大纲
error.fontLoadingFailed=处理字体文件出错
error.fontDirectoryReadFailed=无法读取字体目录
delete=删除
username=用户名
password=密码
@@ -181,7 +242,6 @@ red=红色
green=绿色
blue=蓝色
custom=自定义...
WorkInProgess=工作正在进行中,可能无法工作或有错误,请报告任何问题!
poweredBy=服务来源:
yes=
no=
@@ -200,7 +260,7 @@ disabledCurrentUserMessage=无法禁用当前用户。
downgradeCurrentUserLongMessage=无法降级当前用户的角色。因此,当前用户将不会显示。
userAlreadyExistsOAuthMessage=该用户已作为 OAuth2 用户存在。
userAlreadyExistsWebMessage=该用户已作为 Web 用户存在。
invalidRoleMessage=Invalid role.
invalidRoleMessage=无效角色。
error=错误
oops=哎呀!
help=帮助
@@ -212,8 +272,8 @@ donate=捐款
color=颜色
sponsor=赞助
info=信息
pro=专业版
proFeatures=Pro Features
pro=Pro版本
proFeatures=Pro版本功能
page=页面
pages=页码
loading=加载中...
@@ -221,11 +281,11 @@ addToDoc=添加至文件
reset=重置
apply=应用
noFileSelected=未选择文件,请上传一个文件。
view=View
cancel=Cancel
view=预览
cancel=取消
back.toSettings=Back to Settings
back.toHome=Back to Home
back.toSettings=回到设置
back.toHome=回到主页
back.toAdmin=Back to Admin
legal.privacy=隐私政策
@@ -390,17 +450,17 @@ adminUserSettings.teamName=团队名称
adminUserSettings.teamExists=该团队已存在
adminUserSettings.teamCreated=团队成功创建
adminUserSettings.teamChanged=用户所属团队已更新
adminUserSettings.teamHidden=Hidden
adminUserSettings.teamHidden=隐藏
adminUserSettings.totalMembers=成员总数
adminUserSettings.confirmDeleteTeam=您确定要删除此团队吗?
teamCreated=Team created successfully
teamExists=A team with that name already exists
teamNameExists=Another team with that name already exists
teamNotFound=Team not found
teamDeleted=Team deleted
teamHasUsers=Cannot delete a team with users assigned
teamRenamed=Team renamed successfully
teamCreated=团队创建成功
teamExists=同名称的团队已存在
teamNameExists=同名称的团队已存在
teamNotFound=未找到团队
teamDeleted=团队被删除
teamHasUsers=不能删除已经被分配用户的团队
teamRenamed=团队重命名成功
# Team user management
team.addUser=添加用户到团队
@@ -412,16 +472,16 @@ team.back=返回团队列表
team.internal=内部团队
team.internalTeamNotAccessible=内部团队为系统预设,无法访问
team.cannotMoveInternalUsers=内部团队中的用户无法转移至其他团队
team.hidden=Hidden
team.name=Team Name
team.totalMembers=Total Members
team.members=Members
team.username=Username
team.role=Role
team.status=Status
team.enabled=Enabled
team.disabled=Disabled
team.noMembers=This team has no members yet.
team.hidden=隐藏
team.name=团队名称
team.totalMembers=总人数
team.members=成员
team.username=用户名
team.role=角色
team.status=状态
team.enabled=启用
team.disabled=禁用
team.noMembers=这个团队还没有成员。
@@ -525,6 +585,10 @@ home.addImage.title=在 PDF 中添加图片
home.addImage.desc=将图像添加到 PDF 的指定位置。
addImage.tags=图像、JPG、图片、照片
home.attachments.title=添加附件
home.attachments.desc=在 PDF 中添加或删除嵌入文件(附件)
attachments.tags=嵌入、附件、文件、附加
home.watermark.title=添加水印
home.watermark.desc=在 PDF 中添加自定义水印。
watermark.tags=文本、重复、标签、自定义、版权、商标、图像、JPG、图片、照片
@@ -660,8 +724,8 @@ home.crop.desc=裁剪 PDF 以减小其文件大小(保留文本!)
crop.tags=修剪、缩小、编辑、形状
home.autoSplitPDF.title=自动拆分页面
home.autoSplitPDF.desc=使用物理扫描页面分割器 QR 代码自动拆分扫描的 PDF
autoSplitPDF.tags=基于 QR 码、分离、扫描分割、整理
home.autoSplitPDF.desc=使用物理扫描页面分割器二维码自动拆分扫描的 PDF
autoSplitPDF.tags=基于二维码、分离、扫描分割、整理
home.sanitizePdf.title=清理
home.sanitizePdf.desc=从 PDF 文件中删除脚本和其他元素
@@ -767,11 +831,11 @@ validateSignature.tags=签名,验证,验证,PDF,证书,数字签名,
replace-color.title=替换-反转-颜色
replace-color.header=替换-反转 PDF 颜色
home.replaceColorPdf.title=替换和反转颜色
home.replaceColorPdf.desc=替换 PDF 中文本和背景的颜色,并将PDF全色反转以减小文件大小
home.replaceColorPdf.desc=替换 PDF 中文本和背景的颜色,并将PDF反转颜色以减小文件大小
replaceColorPdf.tags=更换颜色,页面操作,后端,服务器端
replace-color.selectText.1=替换或反转颜色选项
replace-color.selectText.2=默认(默认高对比度颜色)
replace-color.selectText.3=定制(定制的颜色)
replace-color.selectText.3=定制定制的颜色
replace-color.selectText.4=全反转(反转所有颜色)
replace-color.selectText.5=高对比度颜色选项
replace-color.selectText.6=黑底白字
@@ -1205,6 +1269,12 @@ addImage.everyPage=每一页?
addImage.upload=添加图片
addImage.submit=添加图片
#attachments
attachments.title=添加附件
attachments.header=添加附件
attachments.description=允许您向PDF添加附件
attachments.descriptionPlaceholder=为附件输入描述…
attachments.addButton=添加附件
#merge
merge.title=合并
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=拖放PDF文件
fileChooser.dragAndDropImage=拖放图片文件
fileChooser.hoveredDragAndDrop=拖放文件到此处
fileChooser.extractPDF=处理中...
fileChooser.addAttachments=拖放附件到此处
#release notes
releases.footer=版本
@@ -1651,14 +1722,14 @@ audit.dashboard.totalEvents=Total Events
# Audit Dashboard Tabs
audit.dashboard.tab.dashboard=Dashboard
audit.dashboard.tab.events=Audit Events
audit.dashboard.tab.export=Export
audit.dashboard.tab.export=导出
# Dashboard Charts
audit.dashboard.eventsByType=Events by Type
audit.dashboard.eventsByUser=Events by User
audit.dashboard.eventsOverTime=Events Over Time
audit.dashboard.period.7days=7 Days
audit.dashboard.period.30days=30 Days
audit.dashboard.period.90days=90 Days
audit.dashboard.period.7days=7
audit.dashboard.period.30days=30
audit.dashboard.period.90days=90
# Events Tab
audit.dashboard.auditEvents=Audit Events
@@ -1673,11 +1744,11 @@ audit.dashboard.filter.reset=Reset Filters
# Table Headers
audit.dashboard.table.id=ID
audit.dashboard.table.time=Time
audit.dashboard.table.user=User
audit.dashboard.table.type=Type
audit.dashboard.table.details=Details
audit.dashboard.table.viewDetails=View Details
audit.dashboard.table.time=时间
audit.dashboard.table.user=用户
audit.dashboard.table.type=类型
audit.dashboard.table.details=详情
audit.dashboard.table.viewDetails=查看详情
# Pagination
audit.dashboard.pagination.show=Show
@@ -163,13 +163,74 @@ alphabet=字母表
downloadPdf=下載 PDF
text=文字
font=字型
selectFillter=-- 選擇 --
selectFilter=-- 選擇 --
pageNum=頁碼
sizes.small=
sizes.medium=
sizes.large=
sizes.x-large=特大
error.pdfPassword=PDF 檔案已加密,但未提供密碼或密碼不正確
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
# Frontend corruption error messages
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
# Additional error messages
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
# Generic error message templates
error.toolNotInstalled={0} is not installed
error.toolRequired={0} is required for {1}
error.conversionFailed={0} conversion failed
error.commandFailed={0} command failed
error.algorithmNotAvailable={0} algorithm not available
error.optionsNotSpecified={0} options are not specified
error.fileFormatRequired=File must be in {0} format
error.invalidFormat=Invalid {0} format: {1}
error.endpointDisabled=This endpoint has been disabled by the admin
error.urlNotReachable=URL is not reachable, please provide a valid URL
# DPI and image rendering messages - used by frontend for dynamic translation
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
# Frontend parses this and replaces with localized versions using these keys
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
# URL and website conversion messages
# System requirements messages
# Authentication and security messages
error.apiKeyInvalid=API key is not valid.
error.userNotFound=User not found.
error.passwordRequired=Password must not be null.
error.accountLocked=Your account has been locked due to too many failed login attempts.
error.invalidEmail=Invalid email addresses provided.
error.emailAttachmentRequired=An attachment is required to send the email.
error.signatureNotFound=Signature file not found.
# File processing messages
error.fileNotFound=File not found with ID: {0}
# Database and configuration messages
error.noBackupScripts=No backup scripts were found.
error.unsupportedProvider={0} is not currently supported.
error.pathTraversalDetected=Path traversal detected for security reasons.
# Validation messages
error.invalidArgument=Invalid argument: {0}
error.argumentRequired={0} must not be null
error.operationFailed=Operation failed: {0}
error.angleNotMultipleOf90=Angle must be a multiple of 90
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
error.fontLoadingFailed=Error processing font file
error.fontDirectoryReadFailed=Failed to read font directory
delete=刪除
username=使用者名稱
password=密碼
@@ -181,7 +242,6 @@ red=紅色
green=綠色
blue=藍色
custom=自訂...
WorkInProgess=工作正在進行中,可能無法工作或有問題,請報告任何問題!
poweredBy=Powered by
yes=
no=
@@ -525,6 +585,10 @@ home.addImage.title=新增圖片
home.addImage.desc=在 PDF 的指定位置新增圖片
addImage.tags=img,jpg,圖片,照片
home.attachments.title=Add Attachments
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
attachments.tags=embed,attach,file,attachment,attachments
home.watermark.title=新增浮水印
home.watermark.desc=在您的 PDF 檔案中新增自訂浮水印。
watermark.tags=文字,重複,標籤,自有,版權,商標,img,jpg,圖片,照片
@@ -1205,6 +1269,12 @@ addImage.everyPage=每一頁?
addImage.upload=新增圖片
addImage.submit=新增圖片
#attachments
attachments.title=Add Attachments
attachments.header=Add attachments
attachments.description=Allows you to add attachments to the PDF
attachments.descriptionPlaceholder=Enter a description for the attachments...
attachments.addButton=Add Attachments
#merge
merge.title=合併
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=拖放 PDF 檔案
fileChooser.dragAndDropImage=拖放圖片檔案
fileChooser.hoveredDragAndDrop=將檔案拖放至此
fileChooser.extractPDF=處理中...
fileChooser.addAttachments=drag & drop attachments here
#release notes
releases.footer=版本資訊
@@ -62,7 +62,7 @@ security:
premium:
key: 00000000-0000-0000-0000-000000000000
enabled: true # Enable license key checks for pro/enterprise features
enabled: false # Enable license key checks for pro/enterprise features
proFeatures:
database: true # Enable database features
SSOAutoLogin: false
@@ -164,6 +164,8 @@ processExecutor:
weasyPrintSessionLimit: 16
installAppSessionLimit: 1
calibreSessionLimit: 1
ghostscriptSessionLimit: 8
ocrMyPdfSessionLimit: 2
timeoutMinutes: # Process executor timeout in minutes
libreOfficetimeoutMinutes: 30
pdfToHtmltimeoutMinutes: 20
@@ -172,3 +174,6 @@ processExecutor:
installApptimeoutMinutes: 60
calibretimeoutMinutes: 30
tesseractTimeoutMinutes: 30
qpdfTimeoutMinutes: 30
ghostscriptTimeoutMinutes: 30
ocrMyPdfTimeoutMinutes: 30
@@ -283,7 +283,7 @@
{
"moduleName": "com.opencsv:opencsv",
"moduleUrl": "http://opencsv.sf.net",
"moduleVersion": "5.11.1",
"moduleVersion": "5.11.2",
"moduleLicense": "Apache 2",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
},
@@ -649,7 +649,7 @@
{
"moduleName": "io.swagger.core.v3:swagger-annotations-jakarta",
"moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-annotations",
"moduleVersion": "2.2.33",
"moduleVersion": "2.2.34",
"moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
},
@@ -663,7 +663,7 @@
{
"moduleName": "io.swagger.core.v3:swagger-core-jakarta",
"moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-core",
"moduleVersion": "2.2.33",
"moduleVersion": "2.2.34",
"moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
},
@@ -677,7 +677,7 @@
{
"moduleName": "io.swagger.core.v3:swagger-models-jakarta",
"moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-models",
"moduleVersion": "2.2.33",
"moduleVersion": "2.2.34",
"moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
},
@@ -800,13 +800,6 @@
"moduleLicense": "GPL2 w/ CPE",
"moduleLicenseUrl": "https://oss.oracle.com/licenses/CDDL+GPL-1.1"
},
{
"moduleName": "junit:junit",
"moduleUrl": "http://junit.org",
"moduleVersion": "4.13.2",
"moduleLicense": "Eclipse Public License 1.0",
"moduleLicenseUrl": "http://www.eclipse.org/legal/epl-v10.html"
},
{
"moduleName": "me.friwi:gluegen-rt",
"moduleUrl": "http://jogamp.org/gluegen/www/",
@@ -1069,13 +1062,13 @@
},
{
"moduleName": "org.commonmark:commonmark",
"moduleVersion": "0.24.0",
"moduleVersion": "0.25.0",
"moduleLicense": "BSD-2-Clause",
"moduleLicenseUrl": "https://opensource.org/licenses/BSD-2-Clause"
},
{
"moduleName": "org.commonmark:commonmark-ext-gfm-tables",
"moduleVersion": "0.24.0",
"moduleVersion": "0.25.0",
"moduleLicense": "BSD-2-Clause",
"moduleLicenseUrl": "https://opensource.org/licenses/BSD-2-Clause"
},
@@ -1093,6 +1086,13 @@
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
},
{
"moduleName": "org.eclipse.angus:angus-mail",
"moduleUrl": "https://www.eclipse.org",
"moduleVersion": "2.0.3",
"moduleLicense": "GPL2 w/ CPE",
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
},
{
"moduleName": "org.eclipse.angus:jakarta.mail",
"moduleUrl": "https://www.eclipse.org",
@@ -1303,20 +1303,6 @@
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
},
{
"moduleName": "org.hamcrest:hamcrest",
"moduleUrl": "http://hamcrest.org/JavaHamcrest/",
"moduleVersion": "3.0",
"moduleLicense": "BSD-3-Clause",
"moduleLicenseUrl": "https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE"
},
{
"moduleName": "org.hamcrest:hamcrest-core",
"moduleUrl": "http://hamcrest.org/JavaHamcrest/",
"moduleVersion": "3.0",
"moduleLicense": "BSD-3-Clause",
"moduleLicenseUrl": "https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE"
},
{
"moduleName": "org.hdrhistogram:HdrHistogram",
"moduleUrl": "http://hdrhistogram.github.io/HdrHistogram/",
@@ -1372,34 +1358,6 @@
"moduleLicense": "The Apache License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
},
{
"moduleName": "org.junit.platform:junit-platform-commons",
"moduleUrl": "https://junit.org/junit5/",
"moduleVersion": "1.12.2",
"moduleLicense": "Eclipse Public License v2.0",
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html"
},
{
"moduleName": "org.junit.platform:junit-platform-engine",
"moduleUrl": "https://junit.org/junit5/",
"moduleVersion": "1.12.2",
"moduleLicense": "Eclipse Public License v2.0",
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html"
},
{
"moduleName": "org.junit.vintage:junit-vintage-engine",
"moduleUrl": "https://junit.org/junit5/",
"moduleVersion": "5.12.2",
"moduleLicense": "Eclipse Public License v2.0",
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html"
},
{
"moduleName": "org.junit:junit-bom",
"moduleUrl": "https://junit.org/junit5/",
"moduleVersion": "5.12.2",
"moduleLicense": "Eclipse Public License v2.0",
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html"
},
{
"moduleName": "org.latencyutils:LatencyUtils",
"moduleUrl": "http://latencyutils.github.io/LatencyUtils/",
@@ -1509,13 +1467,6 @@
"moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
},
{
"moduleName": "org.opentest4j:opentest4j",
"moduleUrl": "https://github.com/ota4j-team/opentest4j",
"moduleVersion": "1.3.0",
"moduleLicense": "The Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
},
{
"moduleName": "org.ow2.asm:asm",
"moduleUrl": "http://asm.ow2.org",
@@ -98,6 +98,61 @@
font-weight: bold;
}
/* Responsive text sizing for drag & drop area */
#fileInputText {
font-size: 16px;
font-weight: bold;
color: var(--md-sys-color-on-surface);
max-width: 100%;
padding: 0 10px;
box-sizing: border-box;
}
/* Progressive font size reduction for high zoom levels */
@media only screen and (max-width: 1280px) {
#fileInputText {
font-size: 15px;
}
}
@media only screen and (max-width: 960px) {
#fileInputText {
font-size: 14px;
}
}
@media only screen and (max-width: 768px) {
#fileInputText {
font-size: 13px;
}
}
@media only screen and (max-width: 640px) {
#fileInputText {
font-size: 12px;
}
}
@media only screen and (max-width: 480px) {
#fileInputText {
font-size: 11px;
line-height: 1.3;
}
}
@media only screen and (max-width: 384px) {
#fileInputText {
font-size: 10px;
line-height: 1.4;
}
/* Also scale the container at ultra-high zoom */
.input-container {
height: 130px;
padding: 5px;
}
}
.file-input-btn {
display: inline-block;
@@ -11,6 +11,7 @@
align-items: center; /* Center children horizontally */
flex-grow: 1;
flex-direction: column;
margin-top: 1rem;;
}
.footer-powered-by {
@@ -57,4 +58,4 @@
.footer-link-list{
flex-direction: column; /* Stack links vertically on smaller screens */
}
}
}
@@ -16,9 +16,8 @@
.navbar {
height: auto;
/* Adjusts height automatically based on content */
white-space: nowrap;
/* Prevents wrapping of navbar contents */
width: 100vw;
}
/* TODO enable later
@@ -30,6 +29,7 @@
margin-right: auto;
}*/
html[dir="ltr"] * {
direction: ltr;
}
@@ -3,7 +3,7 @@
background-color: var(--md-sys-color-surface-container-low);
width: 100%;
font-size: 16px;
margin-bottom: 2rem;
margin-bottom: 0.5rem;
padding: 0.75rem 3.5rem;
border: 1px solid var(--md-sys-color-outline-variant);
border-radius: 3rem;
@@ -91,7 +91,8 @@
}
.newfeature{
min-width:12rem;
display: flex;
width:fit-content
}
.recent-features{
display: flex;
@@ -1,8 +1,11 @@
/* Base Container Styles */
.multi-tool-container {
max-width: 95vw;
margin: 0 auto;
max-width: 100vw;
margin: 0;
padding: 0 20px;
}
/* Form Elements */
label {
text-align: left;
display: block;
@@ -17,6 +20,7 @@ label {
flex-grow: 5;
}
/* Action Bar Styles */
.mt-action-bar {
display: flex;
gap: 10px;
@@ -28,16 +32,17 @@ label {
padding: 1.25rem;
border-radius: 2rem;
margin: 0px 25px;
justify-content:center;
justify-content: center;
}
.mt-action-bar>* {
.mt-action-bar > * {
padding-bottom: 0.5rem;
}
.mt-file-uploader {
width:100%
width: 100%;
}
.mt-action-bar svg,
.mt-action-btn svg {
width: 20px;
@@ -50,20 +55,21 @@ label {
gap: 10px;
}
/* Action Button Styles */
.mt-action-btn {
position: sticky;
bottom: 10%;
margin: auto;
margin-bottom: 25px;
position: fixed;
bottom: 80px;
left: 50%;
transform: translateX(-50%);
border-radius: 2rem;
z-index: 12;
background-color: var(--md-sys-color-surface-container-low) ;
background-color: var(--md-sys-color-surface-container-low);
display: flex;
gap: 10px;
padding: 12px 0px 0px;
width: fit-content;
justify-content: center;
padding: 10px 20px
padding: 10px 20px;
transition: all 0.3s ease-in-out;
}
.mt-action-btn .btn {
@@ -71,68 +77,132 @@ label {
height: 3.5rem;
border-radius: 20px;
padding: 0;
position: relative;
}
/* Card and Container Styles */
.bg-card {
background-color: var(--md-sys-color-surface-5);
border-radius: 3rem;
padding: 25px 0;
padding: 15px 0;
margin-left: 55px;
margin-right: 20px;
display: flex;
flex-direction: column;
align-items: stretch;
}
#pages-container-wrapper {
width: 100%;
display: flex;
flex-direction: column;
padding: 1rem;
justify-content: center;
padding: 0.75rem;
border-radius: 25px;
min-height: 275px;
margin: 0 0 30px 0;
margin: 0 0 20px 0;
}
#pages-container {
margin: 0 auto;
width: 95%;
font-size: 0;
display: inline-flex;
flex-wrap: wrap;
gap: 20px;
justify-content: flex-start;
width: fit-content;
max-width: 100%;
}
/* width */
/* Scrollbar Styles */
#pages-container-wrapper::-webkit-scrollbar {
width: 10px;
height: 10px;
}
/* Track */
#pages-container-wrapper::-webkit-scrollbar-track {
background: var(--scroll-bar-color);
}
/* Handle */
#pages-container-wrapper::-webkit-scrollbar-thumb {
border-radius: 10px;
background: var(--scroll-bar-thumb);
}
/* Handle on hover */
#pages-container-wrapper::-webkit-scrollbar-thumb:hover {
background: var(--scroll-bar-thumb-hover);
}
/* Page Container Base Styles */
.page-container {
display: inline-block;
list-style-type: none;
width: 250px;
height: 250px;
width: 260px;
height: 260px;
line-height: 50px;
margin: 15px 25px;
margin-top: 15px;
box-sizing: border-box;
text-align: center;
aspect-ratio: 1;
position: relative;
user-select: none;
transition: width 1s linear;
transition: width 0.3s ease-in-out;
}
/* Responsive Page Container Sizes */
@media only screen and (max-width: 480px) {
.page-container {
width: calc(100vw - 90px);
height: calc(100vw - 90px);
max-width: 300px;
max-height: 300px;
margin: 5px auto;
}
#pages-container { gap: 10px; }
}
@media only screen and (min-width: 481px) and (max-width: 768px) {
.page-container {
width: calc((100vw - 120px - 12px) / 2);
height: calc((100vw - 120px - 12px) / 2);
max-width: 250px;
max-height: 250px;
margin: 6px;
}
#pages-container { gap: 12px; }
}
@media only screen and (min-width: 769px) and (max-width: 1199px) {
.page-container {
width: calc((100vw - 140px - 45px) / 3);
height: calc((100vw - 140px - 45px) / 3);
max-width: 220px;
max-height: 220px;
margin: 7px;
}
#pages-container { gap: 15px; }
}
@media only screen and (min-width: 1200px) and (max-width: 1280px) {
.page-container {
width: calc((100vw - 160px - 60px) / 4);
height: calc((100vw - 160px - 60px) / 4);
max-width: 200px;
max-height: 200px;
margin: 8px;
}
#pages-container { gap: 17px; }
}
@media only screen and (min-width: 1281px) {
.page-container {
width: calc((100vw - 180px - 80px) / 5);
height: calc((100vw - 180px - 80px) / 5);
max-width: 190px;
max-height: 190px;
margin: 10px;
}
#pages-container { gap: 20px; }
}
/* Split Page Styles */
.page-container.split-before {
border-left: 1px dashed var(--md-sys-color-on-surface);
padding-left: -1px;
@@ -146,56 +216,35 @@ label {
display: none;
}
/* RTL Language Support */
.page-container:last-child:lang(ar),
/* Arabic */
.page-container:last-child:lang(he),
/* Hebrew */
.page-container:last-child:lang(fa),
/* Persian */
.page-container:last-child:lang(ur),
/* Urdu */
.page-container:last-child:lang(ckb),
/* Sorani Kurdish */
.page-container:last-child:lang(ks),
/* Kashmiri */
.page-container:last-child:lang(kk),
/* Kazakh */
.page-container:last-child:lang(uz),
/* Uzbek */
.page-container:last-child:lang(ky),
/* Kyrgyz */
.page-container:last-child:lang(bal),
/* Baluchi */
.page-container:last-child:lang(dv),
/* Divehi */
.page-container:last-child:lang(ps),
/* Pashto */
.page-container:last-child:lang(sdg),
/* Southern Kurdish */
.page-container:last-child:lang(syr),
/* Syriac */
.page-container:last-child:lang(mzn),
/* Mazanderani */
.page-container:last-child:lang(tgl),
/* Tagalog */
.page-container:last-child:lang(pnb),
/* Western Punjabi */
.page-container:last-child:lang(ug),
/* Uyghur */
.page-container:last-child:lang(nqo),
/* N'Ko */
.page-container:last-child:lang(bqi)
/* Bakhtiari */
{
.page-container:last-child:lang(bqi) {
margin-left: auto !important;
margin-right: 0 !important;
}
/* Page Image Styles */
.page-container img {
max-width: calc(100% - 15px);
max-height: calc(100% - 15px);
max-width: calc(100% - 8px);
max-height: calc(100% - 8px);
display: block;
position: absolute;
left: 50%;
@@ -206,10 +255,7 @@ label {
transition: rotate 0.3s;
}
#add-pdf-button {
margin: 0 auto;
}
/* Page Number Styles */
.page-number {
position: absolute;
top: 5px;
@@ -224,14 +270,20 @@ label {
font-weight: 450;
}
/* Tool Header and Button Styles */
.tool-header {
margin: 0.5rem 1rem 2rem;
margin: 0.5rem 1rem 1rem;
}
#select-pages-button {
opacity: 0.5;
}
#add-pdf-button {
margin: 0 auto;
}
/* Selected Pages Container Styles */
.selected-pages-container {
background-color: var(--md-sys-color-surface);
border-radius: 16px;
@@ -247,12 +299,42 @@ label {
margin-bottom: 10px;
}
.selected-pages-header {
margin-bottom: 15px;
}
.selected-pages-header h5 {
margin: 0 0 8px 0 !important;
font-size: 1.1rem;
font-weight: 600;
color: var(--md-sys-color-on-surface);
}
.selected-pages-header #csv-input {
width: 100%;
height: 2.5rem;
border-radius: 8px;
border: 1px solid var(--md-sys-color-outline);
background-color: var(--md-sys-color-surface);
color: var(--md-sys-color-on-surface);
padding: 0 12px;
font-size: 0.95rem;
}
.selected-pages-header #csv-input:focus {
outline: none;
border-color: var(--md-sys-color-primary);
box-shadow: 0 0 0 2px rgba(var(--md-sys-color-primary-rgb), 0.2);
}
/* Pages List Styles */
.pages-list {
display: flex;
flex-wrap: wrap;
gap: 10px;
padding: 0;
list-style: none;
min-height: 0;
max-height: 10rem;
overflow: auto;
}
@@ -293,12 +375,251 @@ label {
font-size: medium;
}
.btn {
position: relative;
/* Zoom Level Responsive Styles */
@media only screen and (min-width: 2000px) {
.mt-action-btn {
gap: 12px;
padding: 12px 24px;
border-radius: 2.5rem;
}
.mt-action-btn .btn {
width: 4rem;
height: 4rem;
border-radius: 22px;
}
.mt-action-btn .btn .material-symbols-rounded {
font-size: 1.7rem;
}
}
@media only screen and (max-width: 767px) { #pages-container { width:300px; } }
@media only screen and (min-width: 768px) and (max-width: 991px) { #pages-container { width: 600px; } }
@media only screen and (min-width: 992px) and (max-width: 1199px) { #pages-container { width: 900px; } }
@media only screen and (min-width: 1200px) and (max-width: 1399px) { #pages-container { width: 900px; } }
@media only screen and (min-width: 1399px) { #pages-container { width: 1200px; } }
@media only screen and (min-width: 2560px) {
.mt-action-btn {
gap: 15px;
padding: 15px 30px;
border-radius: 3rem;
}
.mt-action-btn .btn {
width: 5rem;
height: 5rem;
border-radius: 28px;
}
.mt-action-btn .btn .material-symbols-rounded {
font-size: 2.1rem;
}
}
@media only screen and (min-width: 3840px) {
.mt-action-btn {
gap: 20px;
padding: 20px 40px;
border-radius: 4rem;
}
.mt-action-btn .btn {
width: 7rem;
height: 7rem;
border-radius: 40px;
}
.mt-action-btn .btn .material-symbols-rounded {
font-size: 3rem;
}
}
@media only screen and (min-width: 7680px) {
.mt-action-btn {
gap: 40px;
padding: 40px 80px;
border-radius: 8rem;
}
.mt-action-btn .btn {
width: 14rem;
height: 14rem;
border-radius: 80px;
}
.mt-action-btn .btn .material-symbols-rounded {
font-size: 6rem;
}
}
/* Zoom-responsive Sidebar Styles */
@media only screen and (max-width: 1280px) {
.container {
position: relative;
}
.mt-action-btn {
position: fixed !important;
left: 10px !important;
top: 80px !important;
bottom: 20px !important;
margin: 0 !important;
transform: none !important;
border-radius: 16px !important;
background-color: var(--md-sys-color-surface-container-low);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
backdrop-filter: blur(8px);
display: flex !important;
flex-direction: column !important;
align-items: center !important;
justify-content: center !important;
height: calc(100vh - 100px) !important;
overflow-y: auto !important;
scrollbar-width: none !important;
-ms-overflow-style: none !important;
z-index: 12;
width: 70px !important;
gap: 8px !important;
padding: 12px 8px !important;
box-sizing: border-box !important;
}
.mt-action-btn:has(.btn:nth-last-child(n+7)) {
justify-content: flex-start !important;
}
.mt-action-btn::-webkit-scrollbar {
display: none !important;
}
.mt-action-btn .btn {
width: 48px !important;
height: 48px !important;
border-radius: 12px !important;
padding: 0 !important;
margin: 0 !important;
flex-shrink: 0;
font-size: 16px !important;
box-sizing: border-box !important;
}
.mt-action-btn .btn .material-symbols-rounded {
font-size: 20px !important;
line-height: 1 !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
width: 100% !important;
height: 100% !important;
font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 !important;
}
.multi-tool-container {
margin-left: 0 !important;
max-width: 100% !important;
}
.mt-action-bar {
margin-left: 25px !important;
margin-right: 25px !important;
}
.mt-action-btn:not(:has(*:nth-child(6))) {
justify-content: center !important;
}
}
/* Mobile and High Zoom Responsive Styles */
@media only screen and (max-width: 960px) {
.mt-action-btn {
left: 8px !important;
top: 75px !important;
bottom: 15px !important;
height: calc(100vh - 90px) !important;
}
}
@media only screen and (max-width: 768px) {
.mt-action-btn {
left: 5px !important;
width: 60px !important;
top: calc(var(--navbar-height, 60px) + 10px) !important;
bottom: 10px !important;
height: calc(100vh - var(--navbar-height, 60px) - 20px) !important;
}
.mt-action-btn .btn {
width: 40px !important;
height: 40px !important;
box-sizing: border-box !important;
}
.mt-action-btn .btn .material-symbols-rounded {
font-size: 16px !important;
}
#pages-container {
margin: 0 auto !important;
display: flex !important;
flex-wrap: wrap !important;
justify-content: center !important;
width: 100% !important;
}
.page-container {
width: calc(100vw - 55px) !important;
height: calc(100vw - 60px) !important;
max-width: 350px !important;
max-height: 350px !important;
margin: 5px auto !important;
}
}
@media only screen and (max-width: 480px) {
.mt-action-btn {
left: 2px !important;
top: calc(var(--navbar-height, 60px) + 5px) !important;
bottom: 5px !important;
height: calc(100vh - var(--navbar-height, 60px) - 10px) !important;
width: 50px !important;
gap: 6px !important;
padding: 10px 6px !important;
}
.mt-action-btn .btn {
width: 32px !important;
height: 32px !important;
border-radius: 10px !important;
box-sizing: border-box !important;
}
.mt-action-btn .btn .material-symbols-rounded {
font-size: 14px !important;
}
}
@media only screen and (max-width: 384px) {
.mt-action-btn {
left: 2px !important;
top: calc(var(--navbar-height, 60px) + 5px) !important;
bottom: 5px !important;
height: calc(100vh - var(--navbar-height, 60px) - 10px) !important;
width: 40px !important;
gap: 4px !important;
padding: 8px 4px !important;
}
.mt-action-btn .btn {
width: 28px !important;
height: 28px !important;
border-radius: 8px !important;
box-sizing: border-box !important;
}
.mt-action-btn .btn .material-symbols-rounded {
font-size: 12px !important;
}
.page-container {
width: calc(100vw - 55px) !important;
height: calc(100vw - 60px) !important;
max-width: 280px !important;
max-height: 280px !important;
margin: 3px auto !important;
}
.page-container img {
max-width: calc(100% - 4px) !important;
max-height: calc(100% - 4px) !important;
}
}
@@ -63,6 +63,79 @@
transform: translateY(-2px);
}
/* Responsive navbar brand - prevent hamburger from wrapping */
.navbar-brand {
display: flex !important;
align-items: center;
gap: 8px;
min-width: 0; /* Allow shrinking */
}
.navbar-brand .icon-text {
font-size: 1.5rem;
font-weight: bold;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Progressive text shrinking to prevent hamburger wrap */
@media only screen and (max-width: 480px) {
.navbar-brand .icon-text {
font-size: 1.3rem;
}
.main-icon {
width: 32px;
height: 32px;
}
}
@media only screen and (max-width: 420px) {
.navbar-brand .icon-text {
font-size: 1.1rem;
}
.main-icon {
width: 28px;
height: 28px;
}
}
@media only screen and (max-width: 380px) {
.navbar-brand .icon-text {
font-size: 1rem;
}
.main-icon {
width: 24px;
height: 24px;
}
}
@media only screen and (max-width: 340px) {
.navbar-brand .icon-text {
font-size: 0.9rem;
}
.main-icon {
width: 20px;
height: 20px;
}
}
/* Ultra-small screens - hide text, keep icon */
@media only screen and (max-width: 320px) {
.navbar-brand .icon-text {
display: none;
}
.main-icon {
width: 24px;
height: 24px;
}
}
.nav-icon {
vertical-align: middle;
font-size: 2rem !important;
@@ -86,7 +159,8 @@
.scalable-languages-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); /* Auto-fill columns, with a minimum width of 180px */
/* Auto-fill columns, with a minimum width of 180px */
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
}
.scalable-languages-container:not(:has(> :nth-child(4))) .lang-dropdown-item-wrapper:last-child {
@@ -106,15 +180,15 @@
}
html[dir="ltr"] .lang-dropdown-item-wrapper {
border-right: 2px solid var(--md-nav-color-on-seperator);
border-right: 2px solid var(--md-nav-color-on-separator);
}
html[dir="rtl"] .lang-dropdown-item-wrapper {
border-left: 2px solid var(--md-nav-color-on-seperator);
border-left: 2px solid var(--md-nav-color-on-separator);
}
/* Responsive adjustments */
@media (min-width: 1200px){
@media (min-width: 1200px) {
.lang-dropdown-item-wrapper .dropdown-item {
min-width: 200px
}
@@ -124,9 +198,11 @@ html[dir="rtl"] .lang-dropdown-item-wrapper {
.scalable-languages-container {
grid-template-columns: repeat(2, 1fr);
}
.scalable-languages-container:not(:has(> :nth-child(2))){
.scalable-languages-container:not(:has(> :nth-child(2))) {
grid-template-columns: repeat(var(--count), 1fr) !important;
}
.scalable-languages-container .lang-dropdown-item-wrapper:nth-child(2n) {
border: 0px
}
@@ -136,9 +212,11 @@ html[dir="rtl"] .lang-dropdown-item-wrapper {
.scalable-languages-container {
grid-template-columns: repeat(3, 1fr);
}
.scalable-languages-container:not(:has(> :nth-child(3))){
.scalable-languages-container:not(:has(> :nth-child(3))) {
grid-template-columns: repeat(var(--count), 1fr) !important;
}
.scalable-languages-container .lang-dropdown-item-wrapper:nth-child(3n) {
border: 0px
}
@@ -149,12 +227,12 @@ html[dir="rtl"] .lang-dropdown-item-wrapper {
grid-template-columns: repeat(4, 1fr);
}
.scalable-languages-container:not(:has(> :nth-child(4))){
.scalable-languages-container:not(:has(> :nth-child(4))) {
grid-template-columns: repeat(var(--count), 1fr) !important;
}
.scalable-languages-container .lang-dropdown-item-wrapper:nth-child(4n) {
border: 0px
border: 0px
}
}
@@ -269,7 +347,9 @@ span.icon-text::after {
/* Mega Menu */
.dropdown-mega .dropdown-menu {
width: 98%;
width: 100%;
left: 0 !important;
right: auto !important;
}
.dropdown-mega .title {
@@ -382,19 +462,7 @@ html[dir="rtl"] .dropdown-menu {
right: auto;
}
html[dir="ltr"] .dropdown-menu[data-bs-popper] {
top: auto;
left: auto;
right: 0;
margin-top: 0 !important;
}
html[dir="rtl"] .dropdown-menu[data-bs-popper] {
top: auto;
left: 0;
right: auto;
margin-top: 0 !important;
}
/* Bootstrap Popper positioning overrides removed - dropdowns now position naturally relative to their buttons */
.dropdown-menu-wrapper {
padding: 1.5rem 0;
@@ -477,9 +545,8 @@ html[dir="rtl"] .dropdown-menu[data-bs-popper] {
display: flex;
gap: 30px;
justify-content: center;
width: 140%;
width: 100%;
position: relative;
left: -20%;
}
.feature-group {
@@ -1,79 +1,79 @@
:root {
/* Colors */
--md-sys-color-primary: rgb(162 201 255);
--md-sys-color-surface-tint: rgb(162 201 255);
--md-sys-color-on-primary: rgb(0 49 92);
--md-sys-color-primary-container: rgb(0 118 208);
--md-sys-color-on-primary-container: rgb(255 255 255);
--md-sys-color-secondary: rgb(169 201 246);
--md-sys-color-on-secondary: rgb(12 49 87);
--md-sys-color-secondary-container: rgb(29 62 100);
--md-sys-color-on-secondary-container: rgb(180 210 255);
--md-sys-color-tertiary: rgb(193 194 248);
--md-sys-color-on-tertiary: rgb(42 44 88);
--md-sys-color-tertiary-container: rgb(110 112 161);
--md-sys-color-on-tertiary-container: rgb(255 255 255);
--md-sys-color-error: rgb(255 180 171);
--md-sys-color-on-error: rgb(105 0 5);
--md-sys-color-error-container: rgb(147 0 10);
--md-sys-color-on-error-container: rgb(255 218 214);
--md-sys-color-background: rgb(15 20 26);
--md-sys-color-on-background: rgb(223 226 235);
--md-sys-color-surface: rgb(15 20 26);
--md-sys-color-on-surface: rgb(223 226 235);
--md-sys-color-surface-variant: rgb(64 71 83);
--md-sys-color-on-surface-variant: rgb(192 199 213);
--md-sys-color-outline: rgb(138 145 158);
--md-sys-color-outline-variant: rgb(64 71 83);
--md-sys-color-shadow: rgb(0 0 0);
--md-sys-color-scrim: rgb(0 0 0);
--md-sys-color-inverse-surface: rgb(223 226 235);
--md-sys-color-inverse-on-surface: rgb(45 49 55);
--md-sys-color-inverse-primary: rgb(0 96 170);
--md-sys-color-primary-fixed: rgb(211 228 255);
--md-sys-color-on-primary-fixed: rgb(0 28 56);
--md-sys-color-primary-fixed-dim: rgb(162 201 255);
--md-sys-color-on-primary-fixed-variant: rgb(0 72 130);
--md-sys-color-secondary-fixed: rgb(211 228 255);
--md-sys-color-on-secondary-fixed: rgb(0 28 56);
--md-sys-color-secondary-fixed-dim: rgb(169 201 246);
--md-sys-color-on-secondary-fixed-variant: rgb(40 72 111);
--md-sys-color-tertiary-fixed: rgb(225 224 255);
--md-sys-color-on-tertiary-fixed: rgb(20 22 66);
--md-sys-color-tertiary-fixed-dim: rgb(193 194 248);
--md-sys-color-on-tertiary-fixed-variant: rgb(64 67 112);
--md-sys-color-surface-dim: rgb(15 20 26);
--md-sys-color-surface-bright: rgb(53 57 64);
--md-sys-color-surface-container-lowest: rgb(10 14 20);
--md-sys-color-surface-container-low: rgb(24 28 34);
--md-sys-color-surface-container: rgb(28 32 38);
--md-sys-color-surface-container-high: rgb(38 42 49);
--md-sys-color-surface-container-highest: rgb(49 53 60);
/* Tools Color */
--md-nav-section-color-opacity: 1;
--md-nav-on-section-color-opacity: 1;
--md-nav-section-color-sign: rgba(25, 101, 212, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-sign: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-organize: rgba(120, 130, 255, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-organize: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-convert: rgba(25, 177, 212, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-convert: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-convertto: rgba(104, 220, 149, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-convertto: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-security: rgba(255, 120, 146, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-security: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-other: rgba(72, 189, 84, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-other: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-advance: rgba(245, 84, 84, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-advance: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-image: rgba(212, 172, 25, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-image: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-word: rgba(61, 153, 245, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-word: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-ppt: rgba(255, 128, 0, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-ppt: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-color-on-seperator: rgb(24 28 34);
--md-nav-background: rgb(15 20 26);
--favourite-add: #9ed18c;
--favourite-remove: palevioletred;
}
/* Colors */
--md-sys-color-primary: rgb(162 201 255);
--md-sys-color-surface-tint: rgb(162 201 255);
--md-sys-color-on-primary: rgb(0 49 92);
--md-sys-color-primary-container: rgb(0 118 208);
--md-sys-color-on-primary-container: rgb(255 255 255);
--md-sys-color-secondary: rgb(169 201 246);
--md-sys-color-on-secondary: rgb(12 49 87);
--md-sys-color-secondary-container: rgb(29 62 100);
--md-sys-color-on-secondary-container: rgb(180 210 255);
--md-sys-color-tertiary: rgb(193 194 248);
--md-sys-color-on-tertiary: rgb(42 44 88);
--md-sys-color-tertiary-container: rgb(110 112 161);
--md-sys-color-on-tertiary-container: rgb(255 255 255);
--md-sys-color-error: rgb(255 180 171);
--md-sys-color-on-error: rgb(105 0 5);
--md-sys-color-error-container: rgb(147 0 10);
--md-sys-color-on-error-container: rgb(255 218 214);
--md-sys-color-background: rgb(15 20 26);
--md-sys-color-on-background: rgb(223 226 235);
--md-sys-color-surface: rgb(15 20 26);
--md-sys-color-on-surface: rgb(223 226 235);
--md-sys-color-surface-variant: rgb(64 71 83);
--md-sys-color-on-surface-variant: rgb(192 199 213);
--md-sys-color-outline: rgb(138 145 158);
--md-sys-color-outline-variant: rgb(64 71 83);
--md-sys-color-shadow: rgb(0 0 0);
--md-sys-color-scrim: rgb(0 0 0);
--md-sys-color-inverse-surface: rgb(223 226 235);
--md-sys-color-inverse-on-surface: rgb(45 49 55);
--md-sys-color-inverse-primary: rgb(0 96 170);
--md-sys-color-primary-fixed: rgb(211 228 255);
--md-sys-color-on-primary-fixed: rgb(0 28 56);
--md-sys-color-primary-fixed-dim: rgb(162 201 255);
--md-sys-color-on-primary-fixed-variant: rgb(0 72 130);
--md-sys-color-secondary-fixed: rgb(211 228 255);
--md-sys-color-on-secondary-fixed: rgb(0 28 56);
--md-sys-color-secondary-fixed-dim: rgb(169 201 246);
--md-sys-color-on-secondary-fixed-variant: rgb(40 72 111);
--md-sys-color-tertiary-fixed: rgb(225 224 255);
--md-sys-color-on-tertiary-fixed: rgb(20 22 66);
--md-sys-color-tertiary-fixed-dim: rgb(193 194 248);
--md-sys-color-on-tertiary-fixed-variant: rgb(64 67 112);
--md-sys-color-surface-dim: rgb(15 20 26);
--md-sys-color-surface-bright: rgb(53 57 64);
--md-sys-color-surface-container-lowest: rgb(10 14 20);
--md-sys-color-surface-container-low: rgb(24 28 34);
--md-sys-color-surface-container: rgb(28 32 38);
--md-sys-color-surface-container-high: rgb(38 42 49);
--md-sys-color-surface-container-highest: rgb(49 53 60);
/* Tools Color */
--md-nav-section-color-opacity: 1;
--md-nav-on-section-color-opacity: 1;
--md-nav-section-color-sign: rgba(25, 101, 212, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-sign: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-organize: rgba(120, 130, 255, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-organize: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-convert: rgba(25, 177, 212, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-convert: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-convertto: rgba(104, 220, 149, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-convertto: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-security: rgba(255, 120, 146, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-security: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-other: rgba(72, 189, 84, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-other: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-advance: rgba(245, 84, 84, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-advance: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-image: rgba(212, 172, 25, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-image: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-word: rgba(61, 153, 245, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-word: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-ppt: rgba(255, 128, 0, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-ppt: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
--md-nav-color-on-separator: rgb(24 28 34);
--md-nav-background: rgb(15 20 26);
--favourite-add: #9ed18c;
--favourite-remove: palevioletred;
}
@@ -72,8 +72,8 @@
--md-nav-on-section-color-word: rgba(255, 251, 254, var(--md-nav-on-section-color-opacity));
--md-nav-section-color-ppt: rgba(255, 128, 0, var(--md-nav-section-color-opacity));
--md-nav-on-section-color-ppt: rgba(255, 251, 254, var(--md-nav-on-section-color-opacity));
--md-nav-color-on-seperator: rgb(174, 178, 179);
--md-nav-color-on-separator: rgb(174, 178, 179);
--md-nav-background: rgb(248 249 255);
--favourite-add: #25ab6c;
--favourite-remove: rgb(222, 94, 137);
}
}
@@ -125,6 +125,16 @@ export class DecryptFile {
} else if (error.code === pdfjsLib.PasswordResponses.INCORRECT_PASSWORD) {
return {isEncrypted: true, requiresPassword: false};
}
} else if (error.name === 'InvalidPDFException' ||
(error.message && error.message.includes('Invalid PDF structure'))) {
// Handle corrupted PDF files
console.error('Corrupted PDF detected:', error);
this.showErrorBanner(
`${window.stirlingPDF.pdfCorruptedMessage.replace('{0}', file.name)}`,
error.stack || '',
`${window.stirlingPDF.tryRepairMessage}`
);
throw new Error('PDF file is corrupted.');
}
console.error('Error checking encryption:', error);
@@ -2,6 +2,13 @@
if (window.isDownloadScriptInitialized) return; // Prevent re-execution
window.isDownloadScriptInitialized = true;
// Global PDF processing count tracking for survey system
window.incrementPdfProcessingCount = function() {
let pdfProcessingCount = parseInt(localStorage.getItem('pdfProcessingCount') || '0');
pdfProcessingCount++;
localStorage.setItem('pdfProcessingCount', pdfProcessingCount.toString());
};
const {
pdfPasswordPrompt,
multipleInputsForSingleRequest,
@@ -193,13 +200,13 @@
if (error.name === 'PasswordException' && error.code === 1) {
console.log(`PDF requires password: ${file.name}`, error);
console.log(`Attempting to remove password from PDF: ${file.name} with password.`);
const password = prompt(`${window.translations.decrypt.passwordPrompt}`);
const password = prompt(`${window.decrypt.passwordPrompt}`);
if (!password) {
console.error(`No password provided for encrypted PDF: ${file.name}`);
showErrorBanner(
`${window.translations.decrypt.noPassword.replace('{0}', file.name)}`,
`${window.translations.decrypt.unexpectedError}`
`${window.decrypt.noPassword.replace('{0}', file.name)}`,
`${window.decrypt.unexpectedError}`
);
throw error;
}
@@ -233,11 +240,20 @@
} catch (decryptError) {
console.error(`Failed to decrypt PDF: ${file.name}`, decryptError);
showErrorBanner(
`${window.translations.invalidPasswordHeader.replace('{0}', file.name)}`,
`${window.translations.invalidPassword}`
`${window.decrypt.invalidPasswordHeader.replace('{0}', file.name)}`,
`${window.decrypt.invalidPassword}`
);
throw decryptError;
}
} else if (error.name === 'InvalidPDFException' ||
(error.message && error.message.includes('Invalid PDF structure'))) {
// Handle corrupted PDF files
console.log(`Corrupted PDF detected: ${file.name}`, error);
showErrorBanner(
`${window.stirlingPDF.pdfCorruptedMessage.replace('{0}', file.name)}`,
`${window.stirlingPDF.tryRepairMessage}`
);
throw error;
} else {
console.log(`Error loading PDF: ${file.name}`, error);
throw error;
@@ -303,6 +319,11 @@
pdf_pages: pageCount,
});
}
// Increment PDF processing count for survey tracking
if (success && typeof window.incrementPdfProcessingCount === 'function') {
window.incrementPdfProcessingCount();
}
}
}
@@ -226,7 +226,8 @@ function setupFileInput(chooser) {
try {
const { isEncrypted, requiresPassword } = await decryptFile.checkFileEncrypted(file);
if (file.type === 'application/pdf' && isEncrypted) {
if (file.type === 'application/pdf' && isEncrypted &&
!window.location.pathname.includes('remove-password')) {
decryptedFile = await decryptFile.decryptFile(file, requiresPassword);
if (!decryptedFile) throw new Error('File decryption failed.');
}
@@ -235,6 +236,13 @@ function setupFileInput(chooser) {
} catch (error) {
console.error(`Error decrypting file: ${file.name}`, error);
// Check if this is a PDF corruption error
if (error.message && error.message.includes('PDF file is corrupted')) {
// The error banner is already shown by DecryptFiles.js, just continue with the file
console.warn(`Continuing with corrupted PDF file: ${file.name}`);
}
if (!file.uniqueId) file.uniqueId = UUID.uuidv4();
return file;
}
@@ -271,6 +271,11 @@ class PdfContainer {
pdf_pages: pageCount,
});
}
// Increment PDF processing count for survey tracking
if (success && typeof window.incrementPdfProcessingCount === 'function') {
window.incrementPdfProcessingCount();
}
} catch { }
}
@@ -66,19 +66,16 @@ document.addEventListener('DOMContentLoaded', function () {
const dontShowAgain = document.getElementById('dontShowAgain');
const takeSurveyButton = document.getElementById('takeSurvey');
const viewThresholds = [5, 10, 15, 22, 30, 50, 75, 100, 150, 200];
const pdfProcessingThresholds = [8, 15, 22, 35, 50, 75, 100, 150];
// Check if survey version changed and reset page views if it did
// Check if survey version changed and reset PDF processing count if it did
const storedVersion = localStorage.getItem('surveyVersion');
if (storedVersion && storedVersion !== surveyVersion) {
localStorage.setItem('pageViews', '0');
localStorage.setItem('pdfProcessingCount', '0');
localStorage.setItem('surveyVersion', surveyVersion);
}
let pageViews = parseInt(localStorage.getItem('pageViews') || '0');
pageViews++;
localStorage.setItem('pageViews', pageViews.toString());
let pdfProcessingCount = parseInt(localStorage.getItem('pdfProcessingCount') || '0');
function shouldShowSurvey() {
if(!window.showSurvey) {
@@ -90,11 +87,11 @@ document.addEventListener('DOMContentLoaded', function () {
}
// If survey version changed and we hit a threshold, show the survey
if (localStorage.getItem('surveyVersion') !== surveyVersion && viewThresholds.includes(pageViews)) {
if (localStorage.getItem('surveyVersion') !== surveyVersion && pdfProcessingThresholds.includes(pdfProcessingCount)) {
return true;
}
return viewThresholds.includes(pageViews);
return pdfProcessingThresholds.includes(pdfProcessingCount);
}
if (shouldShowSurvey()) {
@@ -1838,7 +1838,7 @@
height: 100%;
}
.annotationEditorLayer freeTextEditor .overlay.enabled {
.annotationEditorLayer .freeTextEditor .overlay.enabled {
display: block;
}
@@ -1852,7 +1852,7 @@
height:100%;
}
.annotationEditorLayer freeTextEditor .overlay.enabled{
.annotationEditorLayer .freeTextEditor .overlay.enabled{
display:block;
}
@@ -206,7 +206,7 @@
<div class="data-form-group">
<label for="username" class="data-form-label" th:text="#{username}">Username</label>
<select name="username" id="username" class="data-form-control" required>
<option value="" disabled selected th:text="#{selectFillter}">-- Select --</option>
<option value="" disabled selected th:text="#{selectFilter}">-- Select --</option>
<option th:each="user : ${users}" th:if="${user.username != currentUsername}" th:value="${user.username}" th:text="${user.username}">Username</option>
</select>
</div>
@@ -214,7 +214,7 @@
<div class="data-form-group">
<label for="role" class="data-form-label" th:text="#{adminUserSettings.role}">Role</label>
<select name="role" id="role" class="data-form-control" required>
<option value="" disabled selected th:text="#{selectFillter}">-- Select --</option>
<option value="" disabled selected th:text="#{selectFilter}">-- Select --</option>
<option th:each="roleDetail : ${roleDetails}" th:value="${roleDetail.key}" th:text="#{${roleDetail.value}}">Role</option>
</select>
</div>
@@ -222,7 +222,7 @@
<div class="data-form-group">
<label for="team" class="data-form-label" th:text="#{adminUserSettings.team}">Team</label>
<select name="teamId" id="team" class="data-form-control" required>
<option value="" th:text="#{selectFillter}">-- Select --</option>
<option value="" th:text="#{selectFilter}">-- Select --</option>
<option th:each="team : ${teams}" th:value="${team.id}" th:text="${team.name}"></option>
</select>
</div>
@@ -279,7 +279,7 @@
<div class="data-form-group">
<label for="role" class="data-form-label" th:text="#{adminUserSettings.role}">Role</label>
<select name="role" class="data-form-control" id="role" required>
<option value="" disabled selected th:text="#{selectFillter}">-- Select --</option>
<option value="" disabled selected th:text="#{selectFilter}">-- Select --</option>
<option th:each="roleDetail : ${roleDetails}" th:value="${roleDetail.key}" th:text="#{${roleDetail.value}}">Role</option>
</select>
</div>
@@ -287,7 +287,7 @@
<div class="data-form-group">
<label for="team" class="data-form-label" th:text="#{adminUserSettings.team}">Team</label>
<select name="teamId" class="data-form-control" required>
<option value="" th:text="#{selectFillter}">-- Select --</option>
<option value="" th:text="#{selectFilter}">-- Select --</option>
<option th:each="team : ${teams}" th:value="${team.id}" th:text="${team.name}"></option>
</select>
</div>
@@ -23,6 +23,102 @@
<script>
window.stirlingPDF = window.stirlingPDF || {};
// Capture true system DPI at page load (before any zoom interactions)
const systemDPR = window.devicePixelRatio || 1;
// Determine if this is actually a high DPI screen at page load
const isHighDPI = systemDPR > 1.4;
function scaleNav() {
const currentDPR = window.devicePixelRatio || 1;
const browserZoom = currentDPR / systemDPR;
// Counter-scale to maintain same visual size
const isMobile = window.innerWidth <= 768 && /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
let baseScale = isMobile ? 3 : (isHighDPI ? 2.2 : 1.1); // Prioritize mobile scaling over high DPI
const navScale = baseScale / currentDPR;
// Dropdowns at 80% (20% smaller)
const dropdownScale = 0.8;
const navbar = document.querySelector('.navbar');
if (navbar) {
// RTL support - check document direction
const isRTL = document.documentElement.dir === 'rtl' || document.documentElement.getAttribute('dir') === 'rtl';
const translateX = isRTL ? '50%' : '-50%';
navbar.style.transform = `translateX(${translateX}) scale(${navScale})`;
navbar.style.transformOrigin = 'top center';
navbar.style.width = `${100 / navScale}%`;
if (isRTL) {
navbar.style.right = '50%';
navbar.style.left = 'auto';
} else {
navbar.style.left = '50%';
navbar.style.right = 'auto';
}
// Adjust bottom margin based on scale to prevent overlap/gaps
const baseHeight = 60; // Assume base navbar height
const scaledHeight = baseHeight * navScale;
const marginAdjustment = scaledHeight - baseHeight;
navbar.style.marginBottom = `${marginAdjustment}px`;
// Adjust responsive breakpoint based on effective width after scaling
const effectiveWidth = window.innerWidth / navScale;
if (effectiveWidth >= 1200) {
navbar.classList.add('navbar-expand-lg');
navbar.classList.remove('navbar-expand-xl');
} else {
navbar.classList.add('navbar-expand-xl');
navbar.classList.remove('navbar-expand-lg');
}
console.log('DPR:', currentDPR, 'isHighDPI:', isHighDPI, 'baseScale:', baseScale, 'navScale:', navScale, 'effective width:', effectiveWidth);
}
// Set CSS custom property for mobile navbar scaling (for sidebar positioning)
// Use the ACTUAL scaled height, not a fixed assumption
const baseHeight = 60;
const actualScaledHeight = baseHeight * navScale;
document.documentElement.style.setProperty('--navbar-height', `${actualScaledHeight}px`);
setTimeout(() => {
const dropdowns = document.querySelectorAll('.dropdown-menu');
dropdowns.forEach(dropdown => {
dropdown.style.transform = `scale(${dropdownScale})`;
// Use different transform origins based on dropdown position
const parentItem = dropdown.closest('.nav-item');
const navbar = dropdown.closest('.navbar-nav');
// Check if this is a right-aligned dropdown (language, favorites, search, etc.)
const isRightAligned = navbar && navbar.classList.contains('flex-nowrap') &&
!parentItem?.closest('.dropdown-mega');
dropdown.style.transformOrigin = isRightAligned ? 'top right' : 'top left';
});
console.log('Applied dropdown scale:', dropdownScale);
}, 100);
}
let lastDPR = window.devicePixelRatio;
document.addEventListener('DOMContentLoaded', scaleNav);
window.addEventListener('resize', scaleNav);
setInterval(() => {
const currentDPR = window.devicePixelRatio;
if (Math.abs(currentDPR - lastDPR) > 0.01) {
lastDPR = currentDPR;
scaleNav();
}
}, 100);
</script>
<script th:src="@{'/js/thirdParty/pdf-lib.min.js'}"></script>
<script th:src="@{'/js/fetch-utils.js'}"></script>
@@ -250,6 +346,8 @@
window.stirlingPDF.uploadLimit = /*[[${@uploadLimitService.getUploadLimit()}]]*/ 0;
window.stirlingPDF.uploadLimitExceededSingular = /*[[#{uploadLimitExceededSingular}]]*/ 'is too large. Maximum allowed size is';
window.stirlingPDF.uploadLimitExceededPlural = /*[[#{uploadLimitExceededPlural}]]*/ 'are too large. Maximum allowed size is';
window.stirlingPDF.pdfCorruptedMessage = /*[[#{error.pdfInvalid}]]*/ 'The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the \'Repair PDF\' feature to fix the file before proceeding.';
window.stirlingPDF.tryRepairMessage = /*[[#{error.tryRepair}]]*/ 'Try using the Repair PDF feature to fix corrupted files.';
})();
</script>
<script type="module" th:src="@{'/pdfjs-legacy/pdf.mjs'}"></script>
@@ -287,10 +385,10 @@
Browse
</label>
<div class="d-flex flex-column align-items-center">
<div class="d-flex justify-content-start align-items-center" id="fileInputText">
<div th:text="#{fileChooser.click}" style="margin-right: 5px"></div>
<div th:text="#{fileChooser.or}" style="margin-right: 5px"></div>
<div th:text="#{fileChooser.dragAndDrop}" id="dragAndDrop"></div>
<div class="text-center" id="fileInputText" style="word-wrap: break-word; hyphens: auto; line-height: 1.2;">
<span th:text="#{fileChooser.click}"></span>
<span th:text="#{fileChooser.or}" style="margin: 0 5px;"></span>
<span th:text="#{fileChooser.dragAndDrop}" id="dragAndDrop"></span>
</div>
<hr th:if="${@GoogleDriveEnabled == true}" class="horizontal-divider" >
</div>
@@ -325,4 +423,4 @@
window.stirlingPDF.GoogleDriveAppId = /*[[${@GoogleDriveConfig.getAppId()}]]*/ null;
</script>
</div>
</th:block>
</th:block>
@@ -1,7 +1,7 @@
<footer th:fragment="footer" id="footer" class="text-center pt-5">
<footer th:fragment="footer" id="footer" class="text-center">
<script type="module" th:src="@{'/js/thirdParty/cookieconsent-config.js'}"></script>
<div class="footer-center pb-4">
<div class="footer-center">
<!-- Links section -->
<div class="d-flex justify-content-center">
<ul class="list-unstyled footer-link-list">
@@ -22,8 +22,8 @@
background: var(--md-nav-background);
border-bottom-style: solid;
border-bottom-width: 1px;
border-color: var(--md-nav-color-on-seperator)">
<div class="container ">
border-color: var(--md-nav-color-on-separator)">
<div class="container " style="max-width: 100%;">
<a class="navbar-brand" th:href="${@contextPath}" style="display: flex;">
<img class="main-icon" th:src="@{'/favicon.svg'}" alt="icon">
<span class="icon-text" th:text="${@navBarText}"></span>
@@ -7,10 +7,9 @@
</head>
<body>
<div id="page-container">
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
<div style="transform-origin: top;"
id="scale-wrap">
<div class="page-container" style="max-height:100vh;">
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
<div style="transform-origin: center top; flex:0 1 auto; display:flex; flex-direction:column; align-items:center; justify-content:flex-start;" id="scale-wrap">
<br class="d-md-none">
<!-- Features -->
<script th:src="@{'/js/homecard.js'}"></script>
@@ -27,9 +26,9 @@
<div
style="display:flex; flex-direction: column; justify-content: center; width:100%; margin-bottom:1rem">
<div style="width:fit-content; margin: 0 auto; padding: 0 3rem">
<p class="lead fs-4"
<div class="lead fs-4"
th:text="${@homeText != 'null' and @homeText != null and @homeText != ''} ? ${@homeText} : #{home.desc}">
</p>
</div>
</div>
<div id="groupRecent" style="width: fit-content; margin: 0 auto">
<div
@@ -37,10 +36,10 @@
</div>
<div class="recent-features">
<div class="newfeature"
th:insert="~{fragments/navbarEntryCustom :: navbarEntry('redact', '/images/redact-manual.svg#icon-redact-manual', 'home.redact.title', 'home.redact.desc', 'redact.tags', 'security')}">
th:insert="~{fragments/navbarEntry :: navbarEntry('add-attachments', 'attachment', 'home.attachments.title', 'home.attachments.desc', 'attachments.tags', 'other')}">
</div>
<div class="newfeature"
th:insert="~{fragments/navbarEntry :: navbarEntry ('multi-tool', 'construction', 'home.multiTool.title', 'home.multiTool.desc', 'multiTool.tags', 'organize')}">
th:insert="~{fragments/navbarEntry :: navbarEntry('fake-scan', 'scanner', 'fakeScan.title', 'fakeScan.description', 'fakeScan.tags', 'advance')}">
</div>
<div class="newfeature"
th:insert="~{fragments/navbarEntry :: navbarEntry('compress-pdf', 'zoom_in_map', 'home.compressPdfs.title', 'home.compressPdfs.desc', 'compressPDFs.tags', 'advance')}">
@@ -53,10 +52,9 @@
</div>
</div>
<span class="material-symbols-rounded search-icon">
search
</span>
<input type="text" id="searchBar" onkeyup="filterCards()" th:placeholder="#{home.searchBar}" autofocus>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<input type="text" id="searchBar" onkeyup="filterCards()" th:placeholder="#{home.searchBar}" autofocus>
</div>
<div style="display: flex; column-gap: 3rem; flex-wrap: wrap; margin-left:1rem">
<div
@@ -70,7 +68,7 @@
</select>
</div>
<div
style="display: flex; align-items: center; flex-wrap: wrap; align-content: flex-start; width: fit-content; max-width: 100%; gap:2rem; justify-content: center;">
style="display: flex; align-items: center; flex-wrap: wrap; align-content: flex-start; width: fit-content; max-width: 100%; gap:2rem; justify-content: center;" >
<div th:title="#{home.setFavorites}" style="display: flex; align-items: center; cursor: pointer;"
onclick="toggleFavoritesMode()">
<span class="material-symbols-rounded toggle-favourites"
@@ -101,9 +99,10 @@
</div>
<div>
</div>
<div style="width:100%; overflow-x:visible;">
<div class="features-container" style=" border-top: 1px;
border-top-style: solid;
border-color: var(--md-nav-color-on-seperator);
border-color: var(--md-nav-color-on-separator);
margin-top: 1rem;
">
<div class="feature-rows">
@@ -117,9 +116,10 @@
</div>
</div>
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div>
</div>
</div>
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div>
</div>
@@ -218,21 +218,77 @@
</script>
<script th:src="@{'/js/pages/home.js'}" th:inline="javascript"></script>
<script>
function applyScale() {
const baseWidth = 1440;
const baseHeight = 1000;
const scaleX = window.innerWidth / baseWidth;
const scaleY = window.innerHeight / baseHeight;
const scale = Math.max(0.9, Math.min(scaleX, scaleY)); // keep aspect ratio, honor minScale
const ui = document.getElementById('scale-wrap');
ui.style.transform = `scale(${scale*0.75})`;
function scaleStuff() {
const w = 1440;
const h = 1000;
const sx = window.innerWidth / w;
const sy = window.innerHeight / h;
const s = Math.max(0.9, Math.min(sx, sy));
const el = document.getElementById('scale-wrap');
const container = document.querySelector('.page-container');
const nav = document.querySelector('.navbar, nav');
const navH = nav ? nav.offsetHeight : 0;
const space = container.offsetHeight - navH;
const origH = el.scrollHeight;
// Progressive bonus based on how tall the screen is
const aspectRatio = window.innerWidth / window.innerHeight;
const tallScreenBonus = Math.max(0, (1.8 - aspectRatio) * 0.15); // More bonus for taller screens
let finalS = Math.min(s * 0.75, (space * (0.98 + tallScreenBonus)) / origH);
finalS = Math.max(0.7, Math.min(1.0, finalS)); // Never scale above 100%
el.style.transform = `scale(${finalS})`;
el.style.transformOrigin = 'top center';
el.style.height = `${origH * finalS}px`;
// Dynamically adjust features container width based on scale
const featuresContainer = document.querySelector('.features-container');
if (featuresContainer) {
const isRTL = document.documentElement.dir === 'rtl' || document.documentElement.getAttribute('dir') === 'rtl';
const dynamicWidth = Math.min(120, 100 / finalS);
const offset = (dynamicWidth - 100) / 2;
featuresContainer.style.width = `${dynamicWidth}%`;
if (isRTL) {
featuresContainer.style.right = `-${offset}%`;
featuresContainer.style.left = 'auto';
} else {
featuresContainer.style.left = `-${offset}%`;
featuresContainer.style.right = 'auto';
}
}
}
window.addEventListener('resize', applyScale);
window.addEventListener('load', applyScale);
let prevW = window.innerWidth;
let prevH = window.innerHeight;
let prevDPR = window.devicePixelRatio;
function onResize() {
const w = window.innerWidth;
const h = window.innerHeight;
const dpr = window.devicePixelRatio;
if (w !== prevW || h !== prevH) {
if (dpr === prevDPR) {
scaleStuff();
}
}
prevW = w;
prevH = h;
prevDPR = dpr;
}
window.addEventListener('load', () => {
setTimeout(scaleStuff, 100);
});
window.addEventListener('resize', onResize);
</script>
</body>
</html>
@@ -65,7 +65,7 @@
<label th:text="#{ocr.selectText.10}"></label>
<select class="form-control" name="ocrType">
<option value="skip-text" th:text="#{ocr.selectText.6}"></option>
<option value="force-ocr" th:text="#{ocr.selectText.7}"></option>
<option selected value="force-ocr" th:text="#{ocr.selectText.7}"></option>
<option value="Normal" th:text="#{ocr.selectText.8}"></option>
</select>
</div>
@@ -79,6 +79,30 @@
</select>
</div>
<br>
<div class="mb-3" th:if="${@endpointConfiguration.isGroupEnabled('OCRmyPDF')}">
<label class="form-label">OCR Options</label>
<div class="form-check">
<input type="checkbox" class="form-check-input" id="sidecar" name="sidecar" value="true">
<label class="form-check-label" for="sidecar">Include OCR text in sidecar text file</label>
</div>
<div class="form-check">
<input type="checkbox" class="form-check-input" id="deskew" name="deskew" value="true">
<label class="form-check-label" for="deskew">Deskew input file</label>
</div>
<div class="form-check">
<input type="checkbox" class="form-check-input" id="clean" name="clean" value="true">
<label class="form-check-label" for="clean">Clean input file</label>
</div>
<div class="form-check">
<input type="checkbox" class="form-check-input" id="cleanFinal" name="cleanFinal" value="true">
<label class="form-check-label" for="cleanFinal">Clean final output</label>
</div>
<div class="form-check">
<input type="checkbox" class="form-check-input" id="removeImagesAfter" name="removeImagesAfter" value="true">
<label class="form-check-label" for="removeImagesAfter">Remove images from output PDF</label>
</div>
</div>
<br>
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{ocr.submit}"></button>
</form>
<script th:inline="javascript">

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