From 9fbb0325b52bd27f01c62eeca3bd937200619c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= <127139797+Balazs-Szucs@users.noreply.github.com> Date: Sun, 8 Jun 2025 22:26:01 +0200 Subject: [PATCH 1/4] Add EML to PDF conversion functionality (#3650) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This pull request introduces a new feature for converting EML (email) files to PDF format, along with various customization options. It includes backend support for the conversion process, frontend integration for user interaction, and updates to localization and navigation. ### Backend Changes: * **Added EML to PDF Conversion Logic**: Implemented a new controller `ConvertEmlToPDF` with an endpoint `/api/v1/convert/eml/pdf` to handle EML-to-PDF conversion requests. This includes validation, support for HTML intermediate files, and enhanced options such as attachment handling and size limits. (`src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEmlToPDF.java`) * **New Model for Conversion Requests**: Introduced `EmlToPdfRequest` class to encapsulate request parameters like attachment inclusion, maximum attachment size, and HTML download options. (`common/src/main/java/stirling/software/common/model/api/converters/EmlToPdfRequest.java`) * **Dependency Update**: Added `jakarta.mail:jakarta.mail-api:2.1.3` to the project dependencies for handling EML files. (`common/build.gradle`) ![image](https://github.com/user-attachments/assets/34c5755a-d58d-4fc6-8a51-e83ac9f4afae) ### Frontend Changes: * **New Web Form**: Created a new HTML page `eml-to-pdf.html` for the EML-to-PDF conversion tool, allowing users to upload EML files and configure options. (`src/main/resources/templates/convert/eml-to-pdf.html`) * **Navigation Update**: Added a navigation entry for the EML-to-PDF tool in the sidebar. (`src/main/resources/templates/fragments/navElements.html`) ![image](https://github.com/user-attachments/assets/afbd929d-7745-4d52-8aeb-a88d21662ca6) ### Localization and UI Enhancements: * **Localization Strings**: Added support for the EML-to-PDF tool in the `messages_en_GB.properties` file, including titles, descriptions, and help texts. (`src/main/resources/messages_en_GB.properties`) * **Web Controller Update**: Added a new route `/eml-to-pdf` in `ConverterWebController` to serve the EML-to-PDF form. (`src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java`) ### Highlights: * Attachment support: and Attachment section is created with fully working PDFAnnotations, which enable users to click paperclip and redirects to the attachment. (Requires PDF.js) * If attachments are present creates a catalog of attachments * Encoding support inside the body and header for local charachters e.g: ö,ő,ü etc.. * Optional: Users can download HTMLs, aswell as PDFs * Advanced features for conversion that: keep links, keep as much formatting as possible, keep images incl relative sizes, popular fonts and many more. ### Known limitations * Generally EML-to-HTML is very reliable however emails with complicated layout cause problem for Weasyprint, so not all emails can reliably converted to PDF. * Users need PDF.js and PDFCatalog support for best attachment/embedding support (but is not strict requirement) ### Challanges * Embedding was a large headache, not the Embedding itself per se more so the additional niceties such as: links, the catalog, consistent symbols (replaced the paperclip that is generated by pdf viewer with emoji paperclip that is consistent for everybody) and it was generally prone all sorts of hard to diagnose issues. * Encoding issues * Formatting issues However I think addressed these so shouldn't cause any additional headache. :) ### Examples: ![image](https://github.com/user-attachments/assets/9b560216-984d-4b9f-9ae7-8975723c894d) ![image](https://github.com/user-attachments/assets/98c7a67d-82d4-4f5a-bf42-8ebc4be18b42) ![image](https://github.com/user-attachments/assets/30a53fc9-9636-4090-b5b0-0866cc054c6c) ![image](https://github.com/user-attachments/assets/80c2d109-5259-4d3f-b97a-00b513d547e9) Closes #503 --- ## Checklist ### General - [x] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [x] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [x] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [x] I have performed a self-review of my own code - [x] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [x] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [x] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- common/build.gradle | 2 +- .../model/api/converters/EmlToPdfRequest.java | 39 + .../software/common/util/EmlToPdf.java | 1565 +++++++++++++++++ .../api/converters/ConvertEmlToPDF.java | 157 ++ .../web/ConverterWebController.java | 8 +- src/main/resources/messages_en_GB.properties | 16 + .../templates/convert/eml-to-pdf.html | 93 + .../templates/fragments/navElements.html | 3 + 8 files changed, 1881 insertions(+), 2 deletions(-) create mode 100644 common/src/main/java/stirling/software/common/model/api/converters/EmlToPdfRequest.java create mode 100644 common/src/main/java/stirling/software/common/util/EmlToPdf.java create mode 100644 src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEmlToPDF.java create mode 100644 src/main/resources/templates/convert/eml-to-pdf.html diff --git a/common/build.gradle b/common/build.gradle index b4c51c2f8..871ba43f9 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -43,7 +43,7 @@ dependencies { api 'jakarta.servlet:jakarta.servlet-api:6.1.0' api 'org.snakeyaml:snakeyaml-engine:2.9' api "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.8" - + api 'jakarta.mail:jakarta.mail-api:2.1.3' compileOnly "org.projectlombok:lombok:$lombokVersion" annotationProcessor "org.projectlombok:lombok:$lombokVersion" diff --git a/common/src/main/java/stirling/software/common/model/api/converters/EmlToPdfRequest.java b/common/src/main/java/stirling/software/common/model/api/converters/EmlToPdfRequest.java new file mode 100644 index 000000000..97ea125ad --- /dev/null +++ b/common/src/main/java/stirling/software/common/model/api/converters/EmlToPdfRequest.java @@ -0,0 +1,39 @@ +package stirling.software.common.model.api.converters; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.common.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper = true) +public class EmlToPdfRequest extends PDFFile { + + // fileInput is inherited from PDFFile + + @Schema( + description = "Include email attachments in the PDF output", + requiredMode = Schema.RequiredMode.NOT_REQUIRED, + example = "false") + private boolean includeAttachments = false; + + @Schema( + description = "Maximum attachment size in MB to include (default 10MB, range: 1-100)", + requiredMode = Schema.RequiredMode.NOT_REQUIRED, + example = "10", + minimum = "1", + maximum = "100") + private int maxAttachmentSizeMB = 10; + + @Schema( + description = "Download HTML intermediate file instead of PDF", + requiredMode = Schema.RequiredMode.NOT_REQUIRED, + example = "false") + private boolean downloadHtml = false; + + @Schema( + description = "Include CC and BCC recipients in header (if available)", + requiredMode = Schema.RequiredMode.NOT_REQUIRED, + example = "true") + private boolean includeAllRecipients = true; +} diff --git a/common/src/main/java/stirling/software/common/util/EmlToPdf.java b/common/src/main/java/stirling/software/common/util/EmlToPdf.java new file mode 100644 index 000000000..6e00b746c --- /dev/null +++ b/common/src/main/java/stirling/software/common/util/EmlToPdf.java @@ -0,0 +1,1565 @@ +package stirling.software.common.util; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Base64; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.pdfbox.cos.COSDictionary; +import org.apache.pdfbox.cos.COSName; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDDocumentCatalog; +import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary; +import org.apache.pdfbox.pdmodel.PDEmbeddedFilesNameTreeNode; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification; +import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationFileAttachment; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import lombok.Data; +import lombok.Getter; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; +import stirling.software.common.model.api.converters.EmlToPdfRequest; + +@Slf4j +@UtilityClass +public class EmlToPdf { + + private static final class StyleConstants { + // Font and layout constants + static final int DEFAULT_FONT_SIZE = 12; + static final String DEFAULT_FONT_FAMILY = "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif"; + static final float DEFAULT_LINE_HEIGHT = 1.4f; + static final String DEFAULT_ZOOM = "1.0"; + + // Color constants - aligned with application theme + static final String DEFAULT_TEXT_COLOR = "#202124"; + static final String DEFAULT_BACKGROUND_COLOR = "#ffffff"; + static final String DEFAULT_BORDER_COLOR = "#e8eaed"; + static final String ATTACHMENT_BACKGROUND_COLOR = "#f9f9f9"; + static final String ATTACHMENT_BORDER_COLOR = "#eeeeee"; + + // Size constants for PDF annotations + static final float ATTACHMENT_ICON_WIDTH = 12f; + static final float ATTACHMENT_ICON_HEIGHT = 14f; + static final float ANNOTATION_X_OFFSET = 2f; + static final float ANNOTATION_Y_OFFSET = 10f; + + // Content validation constants + static final int EML_CHECK_LENGTH = 8192; + static final int MIN_HEADER_COUNT_FOR_VALID_EML = 2; + + private StyleConstants() { + // Utility class - prevent instantiation + } + } + + private static final class MimeConstants { + static final Pattern MIME_ENCODED_PATTERN = Pattern.compile("=\\?([^?]+)\\?([BbQq])\\?([^?]*)\\?="); + static final String PAPERCLIP_EMOJI = "\uD83D\uDCCE"; // 📎 + static final String ATTACHMENT_ICON_PLACEHOLDER = "icon"; + + private MimeConstants() { + // Utility class - prevent instantiation + } + } + + private static final class FileSizeConstants { + static final long BYTES_IN_KB = 1024L; + static final long BYTES_IN_MB = BYTES_IN_KB * 1024L; + static final long BYTES_IN_GB = BYTES_IN_MB * 1024L; + + private FileSizeConstants() { + // Utility class - prevent instantiation + } + } + + // Cached Jakarta Mail availability check + private static Boolean jakartaMailAvailable = null; + + private static boolean isJakartaMailAvailable() { + if (jakartaMailAvailable == null) { + try { + Class.forName("jakarta.mail.internet.MimeMessage"); + Class.forName("jakarta.mail.Session"); + jakartaMailAvailable = true; + log.debug("Jakarta Mail libraries are available"); + } catch (ClassNotFoundException e) { + jakartaMailAvailable = false; + log.debug("Jakarta Mail libraries are not available, using basic parsing"); + } + } + return jakartaMailAvailable; + } + + public static String convertEmlToHtml(byte[] emlBytes, EmlToPdfRequest request) throws IOException { + validateEmlInput(emlBytes); + + if (isJakartaMailAvailable()) { + return convertEmlToHtmlAdvanced(emlBytes, request); + } else { + return convertEmlToHtmlBasic(emlBytes, request); + } + } + + public static byte[] convertEmlToPdf( + String weasyprintPath, + EmlToPdfRequest request, + byte[] emlBytes, + String fileName, + boolean disableSanitize, + stirling.software.common.service.CustomPDFDocumentFactory pdfDocumentFactory) + throws IOException, InterruptedException { + + validateEmlInput(emlBytes); + + try { + // Generate HTML representation + EmailContent emailContent = null; + String htmlContent; + + if (isJakartaMailAvailable()) { + emailContent = extractEmailContentAdvanced(emlBytes, request); + htmlContent = generateEnhancedEmailHtml(emailContent, request); + } else { + htmlContent = convertEmlToHtmlBasic(emlBytes, request); + } + + // Convert HTML to PDF + byte[] pdfBytes = convertHtmlToPdf(weasyprintPath, request, htmlContent, disableSanitize); + + // Attach files if available and requested + if (shouldAttachFiles(emailContent, request)) { + pdfBytes = attachFilesToPdf(pdfBytes, emailContent.getAttachments(), pdfDocumentFactory); + } + + return pdfBytes; + + } catch (IOException | InterruptedException e) { + log.error("Failed to convert EML to PDF for file: {}", fileName, e); + throw e; + } catch (Exception e) { + log.error("Unexpected error during EML to PDF conversion for file: {}", fileName, e); + throw new IOException("Conversion failed: " + e.getMessage(), e); + } + } + + private static void validateEmlInput(byte[] emlBytes) throws IOException { + if (emlBytes == null || emlBytes.length == 0) { + throw new IllegalArgumentException("EML file is empty or null"); + } + + if (isInvalidEmlFormat(emlBytes)) { + throw new IllegalArgumentException("Invalid EML file format"); + } + } + + private static boolean shouldAttachFiles(EmailContent emailContent, EmlToPdfRequest request) { + return emailContent != null + && request != null + && request.isIncludeAttachments() + && !emailContent.getAttachments().isEmpty(); + } + + private static byte[] convertHtmlToPdf(String weasyprintPath, EmlToPdfRequest request, + String htmlContent, boolean disableSanitize) + throws IOException, InterruptedException { + + stirling.software.common.model.api.converters.HTMLToPdfRequest htmlRequest = createHtmlRequest(request); + + try { + return FileToPdf.convertHtmlToPdf( + weasyprintPath, + htmlRequest, + htmlContent.getBytes(StandardCharsets.UTF_8), + "email.html", + disableSanitize); + } catch (IOException | InterruptedException e) { + log.warn("Initial HTML to PDF conversion failed, trying with simplified HTML"); + // Try with simplified HTML + String simplifiedHtml = simplifyHtmlContent(htmlContent); + return FileToPdf.convertHtmlToPdf( + weasyprintPath, + htmlRequest, + simplifiedHtml.getBytes(StandardCharsets.UTF_8), + "email.html", + disableSanitize); + } + } + + private static String simplifyHtmlContent(String htmlContent) { + String simplified = htmlContent.replaceAll("(?i)]*>.*?", ""); + simplified = simplified.replaceAll("(?i)]*>.*?", ""); + return simplified; + } + + private static String generateUniqueAttachmentId(String filename) { + return "attachment_" + filename.hashCode() + "_" + System.nanoTime(); + } + + private static String convertEmlToHtmlBasic( + byte[] emlBytes, EmlToPdfRequest request) { + if (emlBytes == null || emlBytes.length == 0) { + throw new IllegalArgumentException("EML file is empty or null"); + } + + String emlContent = new String(emlBytes, StandardCharsets.UTF_8); + + // Basic email parsing + String subject = extractBasicHeader(emlContent, "Subject:"); + String from = extractBasicHeader(emlContent, "From:"); + String to = extractBasicHeader(emlContent, "To:"); + String cc = extractBasicHeader(emlContent, "Cc:"); + String bcc = extractBasicHeader(emlContent, "Bcc:"); + String date = extractBasicHeader(emlContent, "Date:"); + + // Try to extract HTML content + String htmlBody = extractHtmlBody(emlContent); + if (htmlBody == null) { + String textBody = extractTextBody(emlContent); + htmlBody = + convertTextToHtml( + textBody != null ? textBody : "Email content could not be parsed"); + } + + // Generate HTML with custom styling based on request + StringBuilder html = new StringBuilder(); + html.append("\n"); + html.append("\n"); + html.append("").append(escapeHtml(subject)).append("\n"); + html.append("\n"); + html.append("\n"); + + html.append("
\n"); + html.append("
\n"); + html.append("

").append(escapeHtml(subject)).append("

\n"); + html.append("
\n"); + html.append("
From: ").append(escapeHtml(from)).append("
\n"); + html.append("
To: ").append(escapeHtml(to)).append("
\n"); + + // Include CC and BCC if present and requested + if (request != null && request.isIncludeAllRecipients()) { + if (!cc.trim().isEmpty()) { + html.append("
CC: ").append(escapeHtml(cc)).append("
\n"); + } + if (!bcc.trim().isEmpty()) { + html.append("
BCC: ") + .append(escapeHtml(bcc)) + .append("
\n"); + } + } + + if (!date.trim().isEmpty()) { + html.append("
Date: ").append(escapeHtml(date)).append("
\n"); + } + html.append("
\n"); + + html.append("
\n"); + html.append(processEmailHtmlBody(htmlBody)); + html.append("
\n"); + + // Add attachment information - always check for and display attachments + String attachmentInfo = extractAttachmentInfo(emlContent); + if (!attachmentInfo.isEmpty()) { + html.append("
\n"); + html.append("

Attachments

\n"); + html.append(attachmentInfo); + + // Add status message about attachment inclusion + if (request != null && request.isIncludeAttachments()) { + html.append("
\n"); + html.append( + "

Note: Attachments are saved as external files and linked in this PDF. Click the links to open files externally.

\n"); + html.append("
\n"); + } else { + html.append("
\n"); + html.append( + "

Attachment information displayed - files not included in PDF. Enable 'Include attachments' to embed files.

\n"); + html.append("
\n"); + } + + html.append("
\n"); + } + + // Show advanced features status if requested + assert request != null; + if (request != null && request.getFileInput().isEmpty()) { + html.append("
\n"); + html.append( + "

Note: Some advanced features require Jakarta Mail dependencies.

\n"); + html.append("
\n"); + } + + html.append("
\n"); + html.append(""); + + return html.toString(); + } + + private static EmailContent extractEmailContentAdvanced( + byte[] emlBytes, EmlToPdfRequest request) { + try { + // Use Jakarta Mail for processing + Class sessionClass = Class.forName("jakarta.mail.Session"); + Class mimeMessageClass = Class.forName("jakarta.mail.internet.MimeMessage"); + + Method getDefaultInstance = + sessionClass.getMethod("getDefaultInstance", Properties.class); + Object session = getDefaultInstance.invoke(null, new Properties()); + + Constructor mimeMessageConstructor = + mimeMessageClass.getConstructor(sessionClass, InputStream.class); + Object message = + mimeMessageConstructor.newInstance(session, new ByteArrayInputStream(emlBytes)); + + + return extractEmailContentAdvanced(message, request); + + } catch (ReflectiveOperationException e) { + // Create basic EmailContent from basic processing + EmailContent content = new EmailContent(); + content.setHtmlBody(convertEmlToHtmlBasic(emlBytes, request)); + return content; + } + } + + private static String convertEmlToHtmlAdvanced( + byte[] emlBytes, EmlToPdfRequest request) { + EmailContent content = extractEmailContentAdvanced(emlBytes, request); + return generateEnhancedEmailHtml(content, request); + } + + private static String extractAttachmentInfo(String emlContent) { + StringBuilder attachmentInfo = new StringBuilder(); + try { + String[] lines = emlContent.split("\r?\n"); + boolean inHeaders = true; + String currentContentType = ""; + String currentDisposition = ""; + String currentFilename = ""; + String currentEncoding = ""; + boolean inMultipart = false; + String boundary = ""; + + // First pass: find boundary for multipart messages + for (String line : lines) { + String lowerLine = line.toLowerCase().trim(); + if (lowerLine.startsWith("content-type:") && lowerLine.contains("multipart")) { + if (lowerLine.contains("boundary=")) { + int boundaryStart = lowerLine.indexOf("boundary=") + 9; + String boundaryPart = line.substring(boundaryStart).trim(); + if (boundaryPart.startsWith("\"")) { + boundary = boundaryPart.substring(1, boundaryPart.indexOf("\"", 1)); + } else { + int spaceIndex = boundaryPart.indexOf(" "); + boundary = + spaceIndex > 0 + ? boundaryPart.substring(0, spaceIndex) + : boundaryPart; + } + inMultipart = true; + break; + } + } + if (line.trim().isEmpty()) break; + } + + // Second pass: extract attachment information + for (String line : lines) { + String lowerLine = line.toLowerCase().trim(); + + // Check for boundary markers in multipart messages + if (inMultipart && line.trim().startsWith("--" + boundary)) { + // Reset for new part + currentContentType = ""; + currentDisposition = ""; + currentFilename = ""; + currentEncoding = ""; + inHeaders = true; + continue; + } + + if (inHeaders && line.trim().isEmpty()) { + inHeaders = false; + + // Process accumulated attachment info + if (isAttachment(currentDisposition, currentFilename, currentContentType)) { + addAttachmentToInfo( + attachmentInfo, + currentFilename, + currentContentType, + currentEncoding); + + // Reset for next attachment + currentContentType = ""; + currentDisposition = ""; + currentFilename = ""; + currentEncoding = ""; + } + continue; + } + + if (!inHeaders) continue; // Skip body content + + // Parse headers + if (lowerLine.startsWith("content-type:")) { + currentContentType = line.substring(13).trim(); + } else if (lowerLine.startsWith("content-disposition:")) { + currentDisposition = line.substring(20).trim(); + // Extract filename if present + currentFilename = extractFilenameFromDisposition(currentDisposition); + } else if (lowerLine.startsWith("content-transfer-encoding:")) { + currentEncoding = line.substring(26).trim(); + } else if (line.startsWith(" ") || line.startsWith("\t")) { + // Continuation of previous header + if (currentDisposition.contains("filename=")) { + currentDisposition += " " + line.trim(); + currentFilename = extractFilenameFromDisposition(currentDisposition); + } else if (!currentContentType.isEmpty()) { + currentContentType += " " + line.trim(); + } + } + } + + if (isAttachment(currentDisposition, currentFilename, currentContentType)) { + addAttachmentToInfo( + attachmentInfo, currentFilename, currentContentType, currentEncoding); + } + + } catch (RuntimeException e) { + log.warn("Error extracting attachment info: {}", e.getMessage()); + } + return attachmentInfo.toString(); + } + + private static boolean isAttachment(String disposition, String filename, String contentType) { + return (disposition.toLowerCase().contains("attachment") && !filename.isEmpty()) + || (!filename.isEmpty() && !contentType.toLowerCase().startsWith("text/")) + || (contentType.toLowerCase().contains("application/") && !filename.isEmpty()); + } + + private static String extractFilenameFromDisposition(String disposition) { + if (disposition.contains("filename=")) { + int filenameStart = disposition.toLowerCase().indexOf("filename=") + 9; + int filenameEnd = disposition.indexOf(";", filenameStart); + if (filenameEnd == -1) filenameEnd = disposition.length(); + String filename = disposition.substring(filenameStart, filenameEnd).trim(); + filename = filename.replaceAll("^\"|\"$", ""); + // Apply MIME decoding to handle encoded filenames + return safeMimeDecode(filename); + } + return ""; + } + + private static void addAttachmentToInfo( + StringBuilder attachmentInfo, String filename, String contentType, String encoding) { + // Create attachment info with paperclip emoji before filename + attachmentInfo + .append("
") + .append("").append(MimeConstants.ATTACHMENT_ICON_PLACEHOLDER).append(" ") + .append("").append(escapeHtml(filename)).append(""); + + // Add content type and encoding info + if (!contentType.isEmpty() || !encoding.isEmpty()) { + attachmentInfo.append(" ("); + if (!contentType.isEmpty()) { + attachmentInfo.append(escapeHtml(contentType)); + } + if (!encoding.isEmpty()) { + if (!contentType.isEmpty()) attachmentInfo.append(", "); + attachmentInfo.append("encoding: ").append(escapeHtml(encoding)); + } + attachmentInfo.append(")"); + } + attachmentInfo.append("
\n"); + } + + private static boolean isInvalidEmlFormat(byte[] emlBytes) { + try { + int checkLength = Math.min(emlBytes.length, StyleConstants.EML_CHECK_LENGTH); + String content = new String(emlBytes, 0, checkLength, StandardCharsets.UTF_8); + String lowerContent = content.toLowerCase(); + + boolean hasFrom = lowerContent.contains("from:") || lowerContent.contains("return-path:"); + boolean hasSubject = lowerContent.contains("subject:"); + boolean hasMessageId = lowerContent.contains("message-id:"); + boolean hasDate = lowerContent.contains("date:"); + boolean hasTo = lowerContent.contains("to:") + || lowerContent.contains("cc:") + || lowerContent.contains("bcc:"); + boolean hasMimeStructure = lowerContent.contains("multipart/") + || lowerContent.contains("text/plain") + || lowerContent.contains("text/html") + || lowerContent.contains("boundary="); + + int headerCount = 0; + if (hasFrom) headerCount++; + if (hasSubject) headerCount++; + if (hasMessageId) headerCount++; + if (hasDate) headerCount++; + if (hasTo) headerCount++; + + return headerCount < StyleConstants.MIN_HEADER_COUNT_FOR_VALID_EML && !hasMimeStructure; + + } catch (RuntimeException e) { + return false; + } + } + + private static String extractBasicHeader(String emlContent, String headerName) { + try { + String[] lines = emlContent.split("\r?\n"); + for (int i = 0; i < lines.length; i++) { + String line = lines[i]; + if (line.toLowerCase().startsWith(headerName.toLowerCase())) { + StringBuilder value = + new StringBuilder(line.substring(headerName.length()).trim()); + // Handle multi-line headers + for (int j = i + 1; j < lines.length; j++) { + if (lines[j].startsWith(" ") || lines[j].startsWith("\t")) { + value.append(" ").append(lines[j].trim()); + } else { + break; + } + } + // Apply MIME header decoding + return safeMimeDecode(value.toString()); + } + if (line.trim().isEmpty()) break; + } + } catch (RuntimeException e) { + log.warn("Error extracting header '{}': {}", headerName, e.getMessage()); + } + return ""; + } + + private static String extractHtmlBody(String emlContent) { + try { + String lowerContent = emlContent.toLowerCase(); + int htmlStart = lowerContent.indexOf("content-type: text/html"); + if (htmlStart == -1) return null; + + return getString(emlContent, htmlStart); + + } catch (Exception e) { + return null; + } + } + + @Nullable + private static String getString(String emlContent, int htmlStart) { + int bodyStart = emlContent.indexOf("\r\n\r\n", htmlStart); + if (bodyStart == -1) bodyStart = emlContent.indexOf("\n\n", htmlStart); + if (bodyStart == -1) return null; + + bodyStart += (emlContent.charAt(bodyStart + 1) == '\r') ? 4 : 2; + int bodyEnd = findPartEnd(emlContent, bodyStart); + + return emlContent.substring(bodyStart, bodyEnd).trim(); + } + + private static String extractTextBody(String emlContent) { + try { + String lowerContent = emlContent.toLowerCase(); + int textStart = lowerContent.indexOf("content-type: text/plain"); + if (textStart == -1) { + int bodyStart = emlContent.indexOf("\r\n\r\n"); + if (bodyStart == -1) bodyStart = emlContent.indexOf("\n\n"); + if (bodyStart != -1) { + bodyStart += (emlContent.charAt(bodyStart + 1) == '\r') ? 4 : 2; + int bodyEnd = findPartEnd(emlContent, bodyStart); + return emlContent.substring(bodyStart, bodyEnd).trim(); + } + return null; + } + + return getString(emlContent, textStart); + + } catch (RuntimeException e) { + return null; + } + } + + private static int findPartEnd(String content, int start) { + String[] lines = content.substring(start).split("\r?\n"); + StringBuilder result = new StringBuilder(); + + for (String line : lines) { + if (line.startsWith("--") && line.length() > 10) break; + result.append(line).append("\n"); + } + + return start + result.length(); + } + + private static String convertTextToHtml(String textBody) { + if (textBody == null) return ""; + + String html = escapeHtml(textBody); + html = html.replace("\r\n", "\n").replace("\r", "\n"); + html = html.replace("\n", "
\n"); + + html = + html.replaceAll( + "(https?://[\\w\\-._~:/?#\\[\\]@!$&'()*+,;=%]+)", + "$1"); + + html = + html.replaceAll( + "([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,63})", + "$1"); + + return html; + } + + private static String processEmailHtmlBody(String htmlBody) { + if (htmlBody == null) return ""; + + String processed = htmlBody; + + // Remove problematic CSS + processed = processed.replaceAll("(?i)\\s*position\\s*:\\s*fixed[^;]*;?", ""); + processed = processed.replaceAll("(?i)\\s*position\\s*:\\s*absolute[^;]*;?", ""); + + return processed; + } + + private static void appendEnhancedStyles(StringBuilder html, EmlToPdfRequest request) { + int fontSize = StyleConstants.DEFAULT_FONT_SIZE; + String textColor = StyleConstants.DEFAULT_TEXT_COLOR; + String backgroundColor = StyleConstants.DEFAULT_BACKGROUND_COLOR; + String borderColor = StyleConstants.DEFAULT_BORDER_COLOR; + + html.append("body {\n"); + html.append(" font-family: ").append(StyleConstants.DEFAULT_FONT_FAMILY).append(";\n"); + html.append(" font-size: ").append(fontSize).append("px;\n"); + html.append(" line-height: ").append(StyleConstants.DEFAULT_LINE_HEIGHT).append(";\n"); + html.append(" color: ").append(textColor).append(";\n"); + html.append(" margin: 0;\n"); + html.append(" padding: 16px;\n"); + html.append(" background-color: ").append(backgroundColor).append(";\n"); + html.append("}\n\n"); + + html.append(".email-container {\n"); + html.append(" width: 100%;\n"); + html.append(" max-width: 100%;\n"); + html.append(" margin: 0 auto;\n"); + html.append("}\n\n"); + + html.append(".email-header {\n"); + html.append(" padding-bottom: 10px;\n"); + html.append(" border-bottom: 1px solid ").append(borderColor).append(";\n"); + html.append(" margin-bottom: 10px;\n"); + html.append("}\n\n"); + html.append(".email-header h1 {\n"); + html.append(" margin: 0 0 10px 0;\n"); + html.append(" font-size: ").append(fontSize + 4).append("px;\n"); + html.append(" font-weight: bold;\n"); + html.append("}\n\n"); + html.append(".email-meta div {\n"); + html.append(" margin-bottom: 2px;\n"); + html.append(" font-size: ").append(fontSize - 1).append("px;\n"); + html.append("}\n\n"); + + + html.append(".email-body {\n"); + html.append(" word-wrap: break-word;\n"); + html.append("}\n\n"); + + + html.append(".attachment-section {\n"); + html.append(" margin-top: 15px;\n"); + html.append(" padding: 10px;\n"); + html.append(" background-color: ").append(StyleConstants.ATTACHMENT_BACKGROUND_COLOR).append(";\n"); + html.append(" border: 1px solid ").append(StyleConstants.ATTACHMENT_BORDER_COLOR).append(";\n"); + html.append(" border-radius: 3px;\n"); + html.append("}\n\n"); + html.append(".attachment-section h3 {\n"); + html.append(" margin: 0 0 8px 0;\n"); + html.append(" font-size: ").append(fontSize + 1).append("px;\n"); + html.append("}\n\n"); + html.append(".attachment-item {\n"); + html.append(" padding: 5px 0;\n"); + html.append("}\n\n"); + html.append(".attachment-icon {\n"); + html.append(" margin-right: 5px;\n"); + html.append("}\n\n"); + html.append(".attachment-details, .attachment-type {\n"); + html.append(" font-size: ").append(fontSize - 2).append("px;\n"); + html.append(" color: #555555;\n"); + html.append("}\n\n"); + html.append(".attachment-inclusion-note, .attachment-info-note {\n"); + html.append(" margin-top: 8px;\n"); + html.append(" padding: 6px;\n"); + html.append(" font-size: ").append(fontSize - 2).append("px;\n"); + html.append(" border-radius: 3px;\n"); + html.append("}\n\n"); + html.append(".attachment-inclusion-note {\n"); + html.append(" background-color: #e6ffed;\n"); + html.append(" border: 1px solid #d4f7dc;\n"); + html.append(" color: #006420;\n"); + html.append("}\n\n"); + html.append(".attachment-info-note {\n"); + html.append(" background-color: #fff9e6;\n"); + html.append(" border: 1px solid #fff0c2;\n"); + html.append(" color: #664d00;\n"); + html.append("}\n\n"); + html.append(".attachment-link-container {\n"); + html.append(" display: flex;\n"); + html.append(" align-items: center;\n"); + html.append(" padding: 8px;\n"); + html.append(" background-color: #f8f9fa;\n"); + html.append(" border: 1px solid #dee2e6;\n"); + html.append(" border-radius: 4px;\n"); + html.append(" margin: 4px 0;\n"); + html.append("}\n\n"); + html.append(".attachment-link-container:hover {\n"); + html.append(" background-color: #e9ecef;\n"); + html.append("}\n\n"); + html.append(".attachment-note {\n"); + html.append(" font-size: ").append(fontSize - 3).append("px;\n"); + html.append(" color: #6c757d;\n"); + html.append(" font-style: italic;\n"); + html.append(" margin-left: 8px;\n"); + html.append("}\n\n"); + + + // Basic image styling: ensure images are responsive but not overly constrained. + html.append("img {\n"); + html.append(" max-width: 100%;\n"); // Make images responsive to container width + html.append(" height: auto;\n"); // Maintain aspect ratio + html.append(" display: block;\n"); // Avoid extra space below images + html.append("}\n\n"); + } + + private static String escapeHtml(String text) { + if (text == null) return ""; + return text.replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace("\"", """) + .replace("'", "'"); + } + + private static stirling.software.common.model.api.converters.HTMLToPdfRequest createHtmlRequest( + EmlToPdfRequest request) { + stirling.software.common.model.api.converters.HTMLToPdfRequest htmlRequest = + new stirling.software.common.model.api.converters.HTMLToPdfRequest(); + + if (request != null) { + htmlRequest.setFileInput(request.getFileInput()); + } + + // Set default zoom level + htmlRequest.setZoom(Float.parseFloat(StyleConstants.DEFAULT_ZOOM)); + + return htmlRequest; + } + + private static EmailContent extractEmailContentAdvanced( + Object message, EmlToPdfRequest request) { + EmailContent content = new EmailContent(); + + try { + Class messageClass = message.getClass(); + + // Extract headers via reflection + java.lang.reflect.Method getSubject = messageClass.getMethod("getSubject"); + String subject = (String) getSubject.invoke(message); + content.setSubject(subject != null ? safeMimeDecode(subject) : "No Subject"); + + java.lang.reflect.Method getFrom = messageClass.getMethod("getFrom"); + Object[] fromAddresses = (Object[]) getFrom.invoke(message); + content.setFrom( + fromAddresses != null && fromAddresses.length > 0 + ? safeMimeDecode(fromAddresses[0].toString()) + : ""); + + java.lang.reflect.Method getAllRecipients = messageClass.getMethod("getAllRecipients"); + Object[] recipients = (Object[]) getAllRecipients.invoke(message); + content.setTo( + recipients != null && recipients.length > 0 ? safeMimeDecode(recipients[0].toString()) : ""); + + java.lang.reflect.Method getSentDate = messageClass.getMethod("getSentDate"); + content.setDate((Date) getSentDate.invoke(message)); + + // Extract content + java.lang.reflect.Method getContent = messageClass.getMethod("getContent"); + Object messageContent = getContent.invoke(message); + + if (messageContent instanceof String stringContent) { + java.lang.reflect.Method getContentType = messageClass.getMethod("getContentType"); + String contentType = (String) getContentType.invoke(message); + if (contentType != null && contentType.toLowerCase().contains("text/html")) { + content.setHtmlBody(stringContent); + } else { + content.setTextBody(stringContent); + } + } else { + // Handle multipart content + try { + Class multipartClass = Class.forName("jakarta.mail.Multipart"); + if (multipartClass.isInstance(messageContent)) { + processMultipartAdvanced(messageContent, content, request); + } + } catch (Exception e) { + log.warn("Error processing multipart content: {}", e.getMessage()); + } + } + + } catch (Exception e) { + content.setSubject("Email Conversion"); + content.setFrom("Unknown"); + content.setTo("Unknown"); + content.setTextBody("Email content could not be parsed with advanced processing"); + } + + return content; + } + + private static void processMultipartAdvanced( + Object multipart, EmailContent content, EmlToPdfRequest request) { + try { + Class multipartClass = multipart.getClass(); + java.lang.reflect.Method getCount = multipartClass.getMethod("getCount"); + int count = (Integer) getCount.invoke(multipart); + + java.lang.reflect.Method getBodyPart = + multipartClass.getMethod("getBodyPart", int.class); + + for (int i = 0; i < count; i++) { + Object part = getBodyPart.invoke(multipart, i); + processPartAdvanced(part, content, request); + } + + } catch (Exception e) { + content.setTextBody("Email content could not be parsed with advanced processing"); + } + } + + private static void processPartAdvanced( + Object part, EmailContent content, EmlToPdfRequest request) { + try { + Class partClass = part.getClass(); + java.lang.reflect.Method isMimeType = partClass.getMethod("isMimeType", String.class); + java.lang.reflect.Method getContent = partClass.getMethod("getContent"); + java.lang.reflect.Method getDisposition = partClass.getMethod("getDisposition"); + java.lang.reflect.Method getFileName = partClass.getMethod("getFileName"); + java.lang.reflect.Method getContentType = partClass.getMethod("getContentType"); + java.lang.reflect.Method getHeader = partClass.getMethod("getHeader", String.class); + + Object disposition = getDisposition.invoke(part); + String filename = (String) getFileName.invoke(part); + String contentType = (String) getContentType.invoke(part); + + if ((Boolean) isMimeType.invoke(part, "text/plain") && disposition == null) { + content.setTextBody((String) getContent.invoke(part)); + } else if ((Boolean) isMimeType.invoke(part, "text/html") && disposition == null) { + content.setHtmlBody((String) getContent.invoke(part)); + } else if ("attachment".equalsIgnoreCase((String) disposition) + || (filename != null && !filename.trim().isEmpty())) { + + content.setAttachmentCount(content.getAttachmentCount() + 1); + + // Always extract basic attachment metadata for display + if (filename != null && !filename.trim().isEmpty()) { + // Create attachment with metadata only + EmailAttachment attachment = new EmailAttachment(); + // Apply MIME decoding to filename to handle encoded attachment names + attachment.setFilename(safeMimeDecode(filename)); + attachment.setContentType(contentType); + + // Check if it's an embedded image + String[] contentIdHeaders = (String[]) getHeader.invoke(part, "Content-ID"); + if (contentIdHeaders != null && contentIdHeaders.length > 0) { + attachment.setEmbedded(true); + } + + // Extract attachment data only if attachments should be included + if (request != null && request.isIncludeAttachments()) { + try { + Object attachmentContent = getContent.invoke(part); + byte[] attachmentData = null; + + if (attachmentContent instanceof java.io.InputStream inputStream) { + try { + attachmentData = inputStream.readAllBytes(); + } catch (IOException e) { + log.warn("Failed to read InputStream attachment: {}", e.getMessage()); + } + } else if (attachmentContent instanceof byte[] byteArray) { + attachmentData = byteArray; + } else if (attachmentContent instanceof String stringContent) { + attachmentData = + stringContent.getBytes(StandardCharsets.UTF_8); + } + + if (attachmentData != null) { + // Check size limit (use default 10MB if request is null) + long maxSizeMB = request.getMaxAttachmentSizeMB(); + long maxSizeBytes = maxSizeMB * 1024 * 1024; + + if (attachmentData.length <= maxSizeBytes) { + attachment.setData(attachmentData); + attachment.setSizeBytes(attachmentData.length); + } else { + // Still show attachment info even if too large + attachment.setSizeBytes(attachmentData.length); + } + } + } catch (Exception e) { + log.warn("Error extracting attachment data: {}", e.getMessage()); + } + } + + // Add attachment to the list for display (with or without data) + content.getAttachments().add(attachment); + } + } else if ((Boolean) isMimeType.invoke(part, "multipart/*")) { + // Handle nested multipart content + try { + Object multipartContent = getContent.invoke(part); + Class multipartClass = Class.forName("jakarta.mail.Multipart"); + if (multipartClass.isInstance(multipartContent)) { + processMultipartAdvanced(multipartContent, content, request); + } + } catch (Exception e) { + log.warn("Error processing multipart content: {}", e.getMessage()); + } + } + + } catch (Exception e) { + log.warn("Error processing multipart part: {}", e.getMessage()); + } + } + + private static String generateEnhancedEmailHtml(EmailContent content, EmlToPdfRequest request) { + StringBuilder html = new StringBuilder(); + + html.append("\n"); + html.append("\n"); + html.append("").append(escapeHtml(content.getSubject())).append("\n"); + html.append("\n"); + html.append("\n"); + + html.append("
\n"); + html.append("
\n"); + html.append("

").append(escapeHtml(content.getSubject())).append("

\n"); + html.append("
\n"); + html.append("
From: ") + .append(escapeHtml(content.getFrom())) + .append("
\n"); + html.append("
To: ").append(escapeHtml(content.getTo())).append("
\n"); + + if (content.getDate() != null) { + html.append("
Date: ") + .append(formatEmailDate(content.getDate())) + .append("
\n"); + } + html.append("
\n"); + + html.append("
\n"); + if (content.getHtmlBody() != null && !content.getHtmlBody().trim().isEmpty()) { + html.append(processEmailHtmlBody(content.getHtmlBody())); + } else if (content.getTextBody() != null && !content.getTextBody().trim().isEmpty()) { + html.append("
"); + html.append(convertTextToHtml(content.getTextBody())); + html.append("
"); + } else { + html.append("
"); + html.append("

No content available

"); + html.append("
"); + } + html.append("
\n"); + + if (content.getAttachmentCount() > 0 || !content.getAttachments().isEmpty()) { + html.append("
\n"); + int displayedAttachmentCount = + content.getAttachmentCount() > 0 + ? content.getAttachmentCount() + : content.getAttachments().size(); + html.append("

Attachments (").append(displayedAttachmentCount).append(")

\n"); + + if (!content.getAttachments().isEmpty()) { + for (EmailAttachment attachment : content.getAttachments()) { + // Create attachment info with paperclip emoji before filename + String uniqueId = generateUniqueAttachmentId(attachment.getFilename()); + attachment.setEmbeddedFilename( + attachment.getEmbeddedFilename() != null + ? attachment.getEmbeddedFilename() + : attachment.getFilename()); + + html.append("
") + .append("").append(MimeConstants.PAPERCLIP_EMOJI).append(" ") + .append("") + .append(escapeHtml(safeMimeDecode(attachment.getFilename()))) + .append(""); + + String sizeStr = formatFileSize(attachment.getSizeBytes()); + html.append(" (").append(sizeStr); + if (attachment.getContentType() != null && !attachment.getContentType().isEmpty()) { + html.append(", ").append(escapeHtml(attachment.getContentType())); + } + html.append(")
\n"); + } + } + + if (request.isIncludeAttachments()) { + html.append("
\n"); + html.append( + "

Attachments are embedded in the file.

\n"); + html.append("
\n"); + } else { + html.append("
\n"); + html.append( + "

Attachment information displayed - files not included in PDF.

\n"); + html.append("
\n"); + } + + html.append("
\n"); + } + + html.append("
\n"); + html.append(""); + + return html.toString(); + } + + private static byte[] attachFilesToPdf(byte[] pdfBytes, List attachments, stirling.software.common.service.CustomPDFDocumentFactory pdfDocumentFactory) + throws IOException { + try (PDDocument document = pdfDocumentFactory.load(pdfBytes); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + + if (attachments == null || attachments.isEmpty()) { + document.save(outputStream); + return outputStream.toByteArray(); + } + + List embeddedFiles = new ArrayList<>(); + + // Set up the embedded files name tree once + if (document.getDocumentCatalog().getNames() == null) { + document.getDocumentCatalog() + .setNames(new PDDocumentNameDictionary(document.getDocumentCatalog())); + } + + PDDocumentNameDictionary names = document.getDocumentCatalog().getNames(); + if (names.getEmbeddedFiles() == null) { + names.setEmbeddedFiles(new PDEmbeddedFilesNameTreeNode()); + } + + PDEmbeddedFilesNameTreeNode efTree = names.getEmbeddedFiles(); + Map efMap = efTree.getNames(); + if (efMap == null) { + efMap = new HashMap<>(); + } + + // Embed each attachment directly into the PDF + for (EmailAttachment attachment : attachments) { + if (attachment.getData() == null || attachment.getData().length == 0) { + continue; + } + + try { + // Generate unique filename + String filename = attachment.getFilename(); + if (filename == null || filename.trim().isEmpty()) { + filename = "attachment_" + System.currentTimeMillis(); + if (attachment.getContentType() != null + && attachment.getContentType().contains("/")) { + String[] parts = attachment.getContentType().split("/"); + if (parts.length > 1) { + filename += "." + parts[1]; + } + } + } + + // Ensure unique filename + String uniqueFilename = getUniqueFilename(filename, embeddedFiles, efMap); + + // Create embedded file + PDEmbeddedFile embeddedFile = + new PDEmbeddedFile(document, new ByteArrayInputStream(attachment.getData())); + embeddedFile.setSize(attachment.getData().length); + embeddedFile.setCreationDate(new GregorianCalendar()); + if (attachment.getContentType() != null) { + embeddedFile.setSubtype(attachment.getContentType()); + } + + // Create file specification + PDComplexFileSpecification fileSpec = new PDComplexFileSpecification(); + fileSpec.setFile(uniqueFilename); + fileSpec.setEmbeddedFile(embeddedFile); + if (attachment.getContentType() != null) { + fileSpec.setFileDescription("Email attachment: " + uniqueFilename); + } + + // Add to the map (but don't set it yet) + efMap.put(uniqueFilename, fileSpec); + embeddedFiles.add(uniqueFilename); + + // Store the filename for annotation creation + attachment.setEmbeddedFilename(uniqueFilename); + + } catch (Exception e) { + // Log error but continue with other attachments + log.warn("Failed to embed attachment: {}", attachment.getFilename(), e); + } + } + + // Set the complete map once at the end + if (!efMap.isEmpty()) { + efTree.setNames(efMap); + + // Set catalog viewer preferences to automatically show attachments pane + setCatalogViewerPreferences(document); + } + + // Add attachment annotations to the first page for each embedded file + if (!embeddedFiles.isEmpty()) { + addAttachmentAnnotationsToDocument(document, attachments); + } + + document.save(outputStream); + return outputStream.toByteArray(); + } + } + + private static String getUniqueFilename(String filename, List embeddedFiles, Map efMap) { + String uniqueFilename = filename; + int counter = 1; + while (embeddedFiles.contains(uniqueFilename) + || efMap.containsKey(uniqueFilename)) { + String extension = ""; + String baseName = filename; + int lastDot = filename.lastIndexOf('.'); + if (lastDot > 0) { + extension = filename.substring(lastDot); + baseName = filename.substring(0, lastDot); + } + uniqueFilename = baseName + "_" + counter + extension; + counter++; + } + return uniqueFilename; + } + + private static void addAttachmentAnnotationsToDocument( + PDDocument document, List attachments) throws IOException { + if (document.getNumberOfPages() == 0 || attachments == null || attachments.isEmpty()) { + return; + } + + // 1. Find the screen position of all emoji anchors + EmojiPositionFinder finder = new EmojiPositionFinder(); + finder.setSortByPosition(true); // Process pages in order + finder.getText(document); + List emojiPositions = finder.getPositions(); + + // 2. Warn if the number of anchors and attachments don't match + if (emojiPositions.size() != attachments.size()) { + log.warn( + "Found {} emoji anchors, but there are {} attachments. Annotation count may be incorrect.", + emojiPositions.size(), + attachments.size()); + } + + // 3. Create an invisible annotation over each found emoji + int annotationsToAdd = Math.min(emojiPositions.size(), attachments.size()); + for (int i = 0; i < annotationsToAdd; i++) { + EmojiPosition position = emojiPositions.get(i); + EmailAttachment attachment = attachments.get(i); + + if (attachment.getEmbeddedFilename() != null) { + PDPage page = document.getPage(position.getPageIndex()); + addAttachmentAnnotationToPage( + document, page, attachment, position.getX(), position.getY()); + } + } + } + + private static void addAttachmentAnnotationToPage( + PDDocument document, PDPage page, EmailAttachment attachment, float x, float y) + throws IOException { + + PDAnnotationFileAttachment fileAnnotation = new PDAnnotationFileAttachment(); + + PDRectangle rect = getPdRectangle(page, x, y); + fileAnnotation.setRectangle(rect); + + // Remove visual appearance while keeping clickable functionality + try { + PDAppearanceDictionary appearance = new PDAppearanceDictionary(); + PDAppearanceStream normalAppearance = new PDAppearanceStream(document); + normalAppearance.setBBox(new PDRectangle(0, 0, 0, 0)); // Zero-size bounding box + + appearance.setNormalAppearance(normalAppearance); + fileAnnotation.setAppearance(appearance); + } catch (Exception e) { + // If appearance manipulation fails, just set it to null + fileAnnotation.setAppearance(null); + } + + // Set invisibility flags but keep it functional + fileAnnotation.setInvisible(true); + fileAnnotation.setHidden(false); // Must be false to remain clickable + fileAnnotation.setNoView(false); // Must be false to remain clickable + fileAnnotation.setPrinted(false); + + PDEmbeddedFilesNameTreeNode efTree = document.getDocumentCatalog().getNames().getEmbeddedFiles(); + if (efTree != null) { + Map efMap = efTree.getNames(); + if (efMap != null) { + PDComplexFileSpecification fileSpec = efMap.get(attachment.getEmbeddedFilename()); + if (fileSpec != null) { + fileAnnotation.setFile(fileSpec); + } + } + } + + fileAnnotation.setContents("Click to open: " + attachment.getFilename()); + fileAnnotation.setAnnotationName("EmbeddedFile_" + attachment.getEmbeddedFilename()); + + page.getAnnotations().add(fileAnnotation); + + log.info("Added attachment annotation for '{}' on page {}", + attachment.getFilename(), document.getPages().indexOf(page) + 1); + } + + private static @NotNull PDRectangle getPdRectangle(PDPage page, float x, float y) { + PDRectangle mediaBox = page.getMediaBox(); + float pdfY = mediaBox.getHeight() - y; + + float iconWidth = StyleConstants.ATTACHMENT_ICON_WIDTH; // Keep original size for clickability + float iconHeight = StyleConstants.ATTACHMENT_ICON_HEIGHT; // Keep original size for clickability + + // Keep the full-size rectangle so it remains clickable + return new PDRectangle( + x + StyleConstants.ANNOTATION_X_OFFSET, + pdfY - iconHeight + StyleConstants.ANNOTATION_Y_OFFSET, + iconWidth, + iconHeight + ); + } + + private static String formatEmailDate(Date date) { + if (date == null) return ""; + java.text.SimpleDateFormat formatter = + new java.text.SimpleDateFormat("EEE, MMM d, yyyy 'at' h:mm a", Locale.ENGLISH); + return formatter.format(date); + } + + private static String formatFileSize(long bytes) { + if (bytes < FileSizeConstants.BYTES_IN_KB) { + return bytes + " B"; + } else if (bytes < FileSizeConstants.BYTES_IN_MB) { + return String.format("%.1f KB", bytes / (double) FileSizeConstants.BYTES_IN_KB); + } else if (bytes < FileSizeConstants.BYTES_IN_GB) { + return String.format("%.1f MB", bytes / (double) FileSizeConstants.BYTES_IN_MB); + } else { + return String.format("%.1f GB", bytes / (double) FileSizeConstants.BYTES_IN_GB); + } + } + + private static void setCatalogViewerPreferences(PDDocument document) { + try { + PDDocumentCatalog catalog = document.getDocumentCatalog(); + if (catalog != null) { + // Get the catalog's COS dictionary to work with low-level PDF objects + COSDictionary catalogDict = catalog.getCOSObject(); + + // Set PageMode to UseAttachments - this is the standard PDF specification approach + // PageMode values: UseNone, UseOutlines, UseThumbs, FullScreen, UseOC, UseAttachments + catalogDict.setName(COSName.PAGE_MODE, "UseAttachments"); + + // Also set viewer preferences for better attachment viewing experience + COSDictionary viewerPrefs = (COSDictionary) catalogDict.getDictionaryObject(COSName.VIEWER_PREFERENCES); + if (viewerPrefs == null) { + viewerPrefs = new COSDictionary(); + catalogDict.setItem(COSName.VIEWER_PREFERENCES, viewerPrefs); + } + + // Set NonFullScreenPageMode to UseAttachments as fallback for viewers that support it + viewerPrefs.setName(COSName.getPDFName("NonFullScreenPageMode"), "UseAttachments"); + + // Additional viewer preferences that may help with attachment display + viewerPrefs.setBoolean(COSName.getPDFName("DisplayDocTitle"), true); + + log.info("Set PDF PageMode to UseAttachments to automatically show attachments pane"); + } + } catch (Exception e) { + // Log warning but don't fail the entire operation for viewer preferences + log.warn("Failed to set catalog viewer preferences for attachments", e); + } + } + + // MIME header decoding functionality for RFC 2047 encoded headers - moved to constants + + private static String decodeMimeHeader(String encodedText) { + if (encodedText == null || encodedText.trim().isEmpty()) { + return encodedText; + } + + try { + StringBuilder result = new StringBuilder(); + Matcher matcher = MimeConstants.MIME_ENCODED_PATTERN.matcher(encodedText); + int lastEnd = 0; + + while (matcher.find()) { + // Add any text before the encoded part + result.append(encodedText, lastEnd, matcher.start()); + + String charset = matcher.group(1); + String encoding = matcher.group(2).toUpperCase(); + String encodedValue = matcher.group(3); + + try { + String decodedValue; + if ("B".equals(encoding)) { + // Base64 decoding + byte[] decodedBytes = Base64.getDecoder().decode(encodedValue); + decodedValue = new String(decodedBytes, Charset.forName(charset)); + } else if ("Q".equals(encoding)) { + // Quoted-printable decoding + decodedValue = decodeQuotedPrintable(encodedValue, charset); + } else { + // Unknown encoding, keep original + decodedValue = matcher.group(0); + } + result.append(decodedValue); + } catch (Exception e) { + log.warn("Failed to decode MIME header part: {}", matcher.group(0), e); + // If decoding fails, keep the original encoded text + result.append(matcher.group(0)); + } + + lastEnd = matcher.end(); + } + + // Add any remaining text after the last encoded part + result.append(encodedText.substring(lastEnd)); + + return result.toString(); + } catch (Exception e) { + log.warn("Error decoding MIME header: {}", encodedText, e); + return encodedText; // Return original if decoding fails + } + } + + private static String decodeQuotedPrintable(String encodedText, String charset) { + StringBuilder result = new StringBuilder(); + for (int i = 0; i < encodedText.length(); i++) { + char c = encodedText.charAt(i); + switch (c) { + case '=' -> { + if (i + 2 < encodedText.length()) { + String hex = encodedText.substring(i + 1, i + 3); + try { + int value = Integer.parseInt(hex, 16); + result.append((char) value); + i += 2; // Skip the hex digits + } catch (NumberFormatException e) { + // If hex parsing fails, keep the original character + result.append(c); + } + } else { + result.append(c); + } + } + case '_' -> // In RFC 2047, underscore represents space + result.append(' '); + default -> result.append(c); + } + } + + // Convert bytes to proper charset + byte[] bytes = result.toString().getBytes(StandardCharsets.ISO_8859_1); + return new String(bytes, Charset.forName(charset)); + } + + private static String safeMimeDecode(String headerValue) { + if (headerValue == null) { + return ""; + } + + try { + return decodeMimeHeader(headerValue.trim()); + } catch (Exception e) { + log.warn("Failed to decode MIME header, using original: {}", headerValue, e); + return headerValue; + } + } + + @Data + public static class EmailContent { + private String subject; + private String from; + private String to; + private Date date; + private String htmlBody; + private String textBody; + private int attachmentCount; + private List attachments = new ArrayList<>(); + + public void setHtmlBody(String htmlBody) { + this.htmlBody = htmlBody != null ? htmlBody.replaceAll("\r", "") : null; + } + + public void setTextBody(String textBody) { + this.textBody = textBody != null ? textBody.replaceAll("\r", "") : null; + } + } + + @Data + public static class EmailAttachment { + private String filename; + private String contentType; + private byte[] data; + private boolean embedded; + private String embeddedFilename; + private long sizeBytes; + + // New fields for advanced processing + private String contentId; + private String disposition; + private String transferEncoding; + + // Custom setter to maintain size calculation logic + public void setData(byte[] data) { + this.data = data; + if (data != null) { + this.sizeBytes = data.length; + } + } + } + + @Data + public static class EmojiPosition { + private int pageIndex; + private float x; + private float y; + private String character; + + public EmojiPosition() { + } + + public EmojiPosition(int pageIndex, float x, float y, String character) { + this.pageIndex = pageIndex; + this.x = x; + this.y = y; + this.character = character; + } + } + + public static class EmojiPositionFinder extends org.apache.pdfbox.text.PDFTextStripper { + @Getter + private final List positions = new ArrayList<>(); + private int currentPageIndex; + private boolean sortByPosition; + private boolean isInAttachmentSection; + private boolean attachmentSectionFound; + + public EmojiPositionFinder() throws IOException { + super(); + this.currentPageIndex = 0; + this.sortByPosition = false; + this.isInAttachmentSection = false; + this.attachmentSectionFound = false; + } + + @Override + protected void startPage(org.apache.pdfbox.pdmodel.PDPage page) throws IOException { + super.startPage(page); + } + + @Override + protected void endPage(org.apache.pdfbox.pdmodel.PDPage page) throws IOException { + currentPageIndex++; + super.endPage(page); + } + + @Override + protected void writeString(String string, List textPositions) throws IOException { + // Check if we are entering or exiting the attachment section + String lowerString = string.toLowerCase(); + + // Look for attachment section start marker + if (lowerString.contains("attachments (")) { + isInAttachmentSection = true; + attachmentSectionFound = true; + } + + // Look for attachment section end markers (common patterns that indicate end of attachments) + if (isInAttachmentSection && (lowerString.contains("") || + lowerString.contains("") || + (attachmentSectionFound && lowerString.trim().isEmpty() && string.length() > 50))) { + isInAttachmentSection = false; + } + + // Only look for emojis if we are in the attachment section + if (isInAttachmentSection) { + // Look for paperclip emoji characters (U+1F4CE) + String paperclipEmoji = "\uD83D\uDCCE"; // 📎 Unicode representation + + for (int i = 0; i < string.length(); i++) { + // Check if we have a complete paperclip emoji at this position + if (i < string.length() - 1 && + string.substring(i, i + 2).equals(paperclipEmoji) && + i < textPositions.size()) { + + org.apache.pdfbox.text.TextPosition textPosition = textPositions.get(i); + EmojiPosition position = new EmojiPosition( + currentPageIndex, + textPosition.getXDirAdj(), + textPosition.getYDirAdj(), + paperclipEmoji + ); + positions.add(position); + } + } + } + super.writeString(string, textPositions); + } + + @Override + public void setSortByPosition(boolean sortByPosition) { + this.sortByPosition = sortByPosition; + } + + public boolean isSortByPosition() { + return sortByPosition; + } + + + public void reset() { + positions.clear(); + currentPageIndex = 0; + isInAttachmentSection = false; + attachmentSectionFound = false; + } + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEmlToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEmlToPDF.java new file mode 100644 index 000000000..87ca7537c --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEmlToPDF.java @@ -0,0 +1,157 @@ +package stirling.software.SPDF.controller.api.converters; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import org.jetbrains.annotations.NotNull; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import io.github.pixee.security.Filenames; +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.common.configuration.RuntimePathConfig; +import stirling.software.common.model.api.converters.EmlToPdfRequest; +import stirling.software.common.service.CustomPDFDocumentFactory; +import stirling.software.common.util.EmlToPdf; +import stirling.software.common.util.WebResponseUtils; + +@RestController +@RequestMapping("/api/v1/convert") +@Tag(name = "Convert", description = "Convert APIs") +@Slf4j +@RequiredArgsConstructor +public class ConvertEmlToPDF { + + private final CustomPDFDocumentFactory pdfDocumentFactory; + private final RuntimePathConfig runtimePathConfig; + + @PostMapping(consumes = "multipart/form-data", value = "/eml/pdf") + @Operation( + summary = "Convert EML to PDF", + description = + "This endpoint converts EML (email) files to PDF format with extensive" + + " customization options. Features include font settings, image constraints, display modes, attachment handling," + + " and HTML debug output. Input: EML file, Output: PDF" + + " or HTML file. Type: SISO") + public ResponseEntity convertEmlToPdf(@ModelAttribute EmlToPdfRequest request) { + + MultipartFile inputFile = request.getFileInput(); + String originalFilename = inputFile.getOriginalFilename(); + + // Validate input + if (inputFile.isEmpty()) { + log.error("No file provided for EML to PDF conversion."); + return ResponseEntity.badRequest() + .body("No file provided".getBytes(StandardCharsets.UTF_8)); + } + + if (originalFilename == null || originalFilename.trim().isEmpty()) { + log.error("Filename is null or empty."); + return ResponseEntity.badRequest() + .body("Please provide a valid filename".getBytes(StandardCharsets.UTF_8)); + } + + // Validate file type - support EML + String lowerFilename = originalFilename.toLowerCase(); + if (!lowerFilename.endsWith(".eml")) { + log.error("Invalid file type for EML to PDF: {}", originalFilename); + return ResponseEntity.badRequest() + .body("Please upload a valid EML file".getBytes(StandardCharsets.UTF_8)); + } + + String baseFilename = Filenames.toSimpleFileName(originalFilename); // Use Filenames utility + + try { + byte[] fileBytes = inputFile.getBytes(); + + if (request.isDownloadHtml()) { + try { + String htmlContent = EmlToPdf.convertEmlToHtml(fileBytes, request); + log.info("Successfully converted EML to HTML: {}", originalFilename); + return WebResponseUtils.bytesToWebResponse( + htmlContent.getBytes(StandardCharsets.UTF_8), + baseFilename + ".html", + MediaType.TEXT_HTML); + } catch (IOException | IllegalArgumentException e) { + log.error("HTML conversion failed for {}", originalFilename, e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body( + ("HTML conversion failed: " + e.getMessage()) + .getBytes(StandardCharsets.UTF_8)); + } + } + + // Convert EML to PDF with enhanced options + try { + byte[] pdfBytes = + EmlToPdf.convertEmlToPdf( + runtimePathConfig.getWeasyPrintPath(), // Use configured WeasyPrint path + request, + fileBytes, + originalFilename, + false, + pdfDocumentFactory); + + if (pdfBytes == null || pdfBytes.length == 0) { + log.error("PDF conversion failed - empty output for {}", originalFilename); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body( + "PDF conversion failed - empty output" + .getBytes(StandardCharsets.UTF_8)); + } + log.info("Successfully converted EML to PDF: {}", originalFilename); + return WebResponseUtils.bytesToWebResponse( + pdfBytes, baseFilename + ".pdf", MediaType.APPLICATION_PDF); + + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.error("EML to PDF conversion was interrupted for {}", originalFilename, e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Conversion was interrupted".getBytes(StandardCharsets.UTF_8)); + } catch (IllegalArgumentException e) { + String errorMessage = buildErrorMessage(e, originalFilename); + log.error("EML to PDF conversion failed for {}: {}", originalFilename, errorMessage, e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(errorMessage.getBytes(StandardCharsets.UTF_8)); + } catch (RuntimeException e) { + String errorMessage = buildErrorMessage(e, originalFilename); + log.error("EML to PDF conversion failed for {}: {}", originalFilename, errorMessage, e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(errorMessage.getBytes(StandardCharsets.UTF_8)); + } + + } catch (IOException e) { + log.error("File processing error for EML to PDF: {}", originalFilename, e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("File processing error".getBytes(StandardCharsets.UTF_8)); + } + } + + private static @NotNull String buildErrorMessage(Exception e, String originalFilename) { + String errorMessage; + if (e.getMessage() != null && e.getMessage().contains("Invalid EML")) { + errorMessage = + "Invalid EML file format. Please ensure you've uploaded a valid email" + + " file (" + + originalFilename + + ")."; + } else if (e.getMessage() != null && e.getMessage().contains("WeasyPrint")) { + errorMessage = + "PDF generation failed for " + + originalFilename + + ". This may be due to complex email formatting."; + } else { + errorMessage = "Conversion failed for " + originalFilename + ": " + e.getMessage(); + } + return errorMessage; + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java b/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java index 10794693e..efde59066 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java @@ -7,7 +7,6 @@ import org.springframework.web.servlet.ModelAndView; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.tags.Tag; - import stirling.software.common.util.CheckProgramInstall; @Controller @@ -121,4 +120,11 @@ public class ConverterWebController { model.addAttribute("currentPage", "pdf-to-pdfa"); return "convert/pdf-to-pdfa"; } + + @GetMapping("/eml-to-pdf") + @Hidden + public String convertEmlToPdfForm(Model model) { + model.addAttribute("currentPage", "eml-to-pdf"); + return "convert/eml-to-pdf"; + } } diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index b875859b6..1ea4f0e72 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML to PDF home.HTMLToPDF.desc=Converts any HTML file or zip to PDF HTMLToPDF.tags=markup,web-content,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 + +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 home.MarkdownToPDF.title=Markdown to PDF home.MarkdownToPDF.desc=Converts any Markdown file to PDF diff --git a/src/main/resources/templates/convert/eml-to-pdf.html b/src/main/resources/templates/convert/eml-to-pdf.html new file mode 100644 index 000000000..2f1eb3ba3 --- /dev/null +++ b/src/main/resources/templates/convert/eml-to-pdf.html @@ -0,0 +1,93 @@ + + + + + + + + +
+
+ +
+
+
+
+
+
+ email + +
+
+
+
+ +
+ + +
+
+ +
+
+ + +
+ +
+ + +
+ + +
+ +
+ +
+
+

+
    +
  • +
  • +
  • +
+
+
+
+ + +
+
+
+
+
+
+
+ +
+ + + + diff --git a/src/main/resources/templates/fragments/navElements.html b/src/main/resources/templates/fragments/navElements.html index 1c7d329dd..3ced01be8 100644 --- a/src/main/resources/templates/fragments/navElements.html +++ b/src/main/resources/templates/fragments/navElements.html @@ -59,6 +59,9 @@
+
+
From 461f98be3e146e30de7554afd13ec462b916b2c7 Mon Sep 17 00:00:00 2001 From: "stirlingbot[bot]" <195170888+stirlingbot[bot]@users.noreply.github.com> Date: Sun, 8 Jun 2025 21:43:15 +0100 Subject: [PATCH 2/4] :globe_with_meridians: Sync Translations + Update README Progress Table (#3657) ### Description of Changes This Pull Request was automatically generated to synchronize updates to translation files and documentation. Below are the details of the changes made: #### **1. Synchronization of Translation Files** - Updated translation files (`messages_*.properties`) to reflect changes in the reference file `messages_en_GB.properties`. - Ensured consistency and synchronization across all supported language files. - Highlighted any missing or incomplete translations. #### **2. Update README.md** - Generated the translation progress table in `README.md`. - Added a summary of the current translation status for all supported languages. - Included up-to-date statistics on translation coverage. #### **Why these changes are necessary** - Keeps translation files aligned with the latest reference updates. - Ensures the documentation reflects the current translation progress. --- Auto-generated by [create-pull-request][1]. [1]: https://github.com/peter-evans/create-pull-request --------- Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com> --- README.md | 60 +++++++++---------- src/main/resources/messages_ar_AR.properties | 16 +++++ src/main/resources/messages_az_AZ.properties | 16 +++++ src/main/resources/messages_bg_BG.properties | 16 +++++ src/main/resources/messages_bo_CN.properties | 16 +++++ src/main/resources/messages_ca_CA.properties | 16 +++++ src/main/resources/messages_cs_CZ.properties | 16 +++++ src/main/resources/messages_da_DK.properties | 16 +++++ src/main/resources/messages_de_DE.properties | 16 +++++ src/main/resources/messages_el_GR.properties | 16 +++++ src/main/resources/messages_en_US.properties | 16 +++++ src/main/resources/messages_es_ES.properties | 16 +++++ src/main/resources/messages_eu_ES.properties | 16 +++++ src/main/resources/messages_fa_IR.properties | 16 +++++ src/main/resources/messages_fr_FR.properties | 16 +++++ src/main/resources/messages_ga_IE.properties | 16 +++++ src/main/resources/messages_hi_IN.properties | 16 +++++ src/main/resources/messages_hr_HR.properties | 16 +++++ src/main/resources/messages_hu_HU.properties | 16 +++++ src/main/resources/messages_id_ID.properties | 16 +++++ src/main/resources/messages_it_IT.properties | 16 +++++ src/main/resources/messages_ja_JP.properties | 16 +++++ src/main/resources/messages_ko_KR.properties | 16 +++++ src/main/resources/messages_ml_IN.properties | 16 +++++ src/main/resources/messages_nl_NL.properties | 16 +++++ src/main/resources/messages_no_NB.properties | 16 +++++ src/main/resources/messages_pl_PL.properties | 16 +++++ src/main/resources/messages_pt_BR.properties | 16 +++++ src/main/resources/messages_pt_PT.properties | 16 +++++ src/main/resources/messages_ro_RO.properties | 16 +++++ src/main/resources/messages_ru_RU.properties | 16 +++++ src/main/resources/messages_sk_SK.properties | 16 +++++ src/main/resources/messages_sl_SI.properties | 16 +++++ .../resources/messages_sr_LATN_RS.properties | 16 +++++ src/main/resources/messages_sv_SE.properties | 16 +++++ src/main/resources/messages_th_TH.properties | 16 +++++ src/main/resources/messages_tr_TR.properties | 16 +++++ src/main/resources/messages_uk_UA.properties | 16 +++++ src/main/resources/messages_vi_VN.properties | 16 +++++ src/main/resources/messages_zh_CN.properties | 16 +++++ src/main/resources/messages_zh_TW.properties | 16 +++++ 41 files changed, 670 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 797b8621d..2a5d735df 100644 --- a/README.md +++ b/README.md @@ -116,46 +116,46 @@ Stirling-PDF currently supports 40 languages! | Language | Progress | | -------------------------------------------- | -------------------------------------- | -| Arabic (العربية) (ar_AR) | ![72%](https://geps.dev/progress/72) | +| Arabic (العربية) (ar_AR) | ![71%](https://geps.dev/progress/71) | | Azerbaijani (Azərbaycan Dili) (az_AZ) | ![72%](https://geps.dev/progress/72) | | Basque (Euskara) (eu_ES) | ![42%](https://geps.dev/progress/42) | -| Bulgarian (Български) (bg_BG) | ![80%](https://geps.dev/progress/80) | -| Catalan (Català) (ca_CA) | ![79%](https://geps.dev/progress/79) | -| Croatian (Hrvatski) (hr_HR) | ![71%](https://geps.dev/progress/71) | -| Czech (Česky) (cs_CZ) | ![82%](https://geps.dev/progress/82) | -| Danish (Dansk) (da_DK) | ![72%](https://geps.dev/progress/72) | -| Dutch (Nederlands) (nl_NL) | ![70%](https://geps.dev/progress/70) | +| Bulgarian (Български) (bg_BG) | ![79%](https://geps.dev/progress/79) | +| Catalan (Català) (ca_CA) | ![78%](https://geps.dev/progress/78) | +| Croatian (Hrvatski) (hr_HR) | ![70%](https://geps.dev/progress/70) | +| Czech (Česky) (cs_CZ) | ![81%](https://geps.dev/progress/81) | +| Danish (Dansk) (da_DK) | ![71%](https://geps.dev/progress/71) | +| Dutch (Nederlands) (nl_NL) | ![69%](https://geps.dev/progress/69) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | -| French (Français) (fr_FR) | ![81%](https://geps.dev/progress/81) | -| German (Deutsch) (de_DE) | ![98%](https://geps.dev/progress/98) | -| Greek (Ελληνικά) (el_GR) | ![79%](https://geps.dev/progress/79) | +| French (Français) (fr_FR) | ![80%](https://geps.dev/progress/80) | +| German (Deutsch) (de_DE) | ![97%](https://geps.dev/progress/97) | +| Greek (Ελληνικά) (el_GR) | ![78%](https://geps.dev/progress/78) | | Hindi (हिंदी) (hi_IN) | ![78%](https://geps.dev/progress/78) | -| Hungarian (Magyar) (hu_HU) | ![90%](https://geps.dev/progress/90) | +| Hungarian (Magyar) (hu_HU) | ![89%](https://geps.dev/progress/89) | | Indonesian (Bahasa Indonesia) (id_ID) | ![72%](https://geps.dev/progress/72) | -| Irish (Gaeilge) (ga_IE) | ![80%](https://geps.dev/progress/80) | -| Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) | -| Japanese (日本語) (ja_JP) | ![80%](https://geps.dev/progress/80) | -| Korean (한국어) (ko_KR) | ![79%](https://geps.dev/progress/79) | -| Norwegian (Norsk) (no_NB) | ![77%](https://geps.dev/progress/77) | -| Persian (فارسی) (fa_IR) | ![75%](https://geps.dev/progress/75) | -| Polish (Polski) (pl_PL) | ![84%](https://geps.dev/progress/84) | -| Portuguese (Português) (pt_PT) | ![80%](https://geps.dev/progress/80) | -| Portuguese Brazilian (Português) (pt_BR) | ![85%](https://geps.dev/progress/85) | -| Romanian (Română) (ro_RO) | ![67%](https://geps.dev/progress/67) | -| Russian (Русский) (ru_RU) | ![85%](https://geps.dev/progress/85) | +| Irish (Gaeilge) (ga_IE) | ![79%](https://geps.dev/progress/79) | +| Italian (Italiano) (it_IT) | ![97%](https://geps.dev/progress/97) | +| Japanese (日本語) (ja_JP) | ![79%](https://geps.dev/progress/79) | +| Korean (한국어) (ko_KR) | ![78%](https://geps.dev/progress/78) | +| Norwegian (Norsk) (no_NB) | ![76%](https://geps.dev/progress/76) | +| Persian (فارسی) (fa_IR) | ![74%](https://geps.dev/progress/74) | +| Polish (Polski) (pl_PL) | ![83%](https://geps.dev/progress/83) | +| Portuguese (Português) (pt_PT) | ![79%](https://geps.dev/progress/79) | +| Portuguese Brazilian (Português) (pt_BR) | ![84%](https://geps.dev/progress/84) | +| Romanian (Română) (ro_RO) | ![66%](https://geps.dev/progress/66) | +| Russian (Русский) (ru_RU) | ![84%](https://geps.dev/progress/84) | | Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![51%](https://geps.dev/progress/51) | -| Simplified Chinese (简体中文) (zh_CN) | ![85%](https://geps.dev/progress/85) | +| Simplified Chinese (简体中文) (zh_CN) | ![84%](https://geps.dev/progress/84) | | Slovakian (Slovensky) (sk_SK) | ![60%](https://geps.dev/progress/60) | -| Slovenian (Slovenščina) (sl_SI) | ![83%](https://geps.dev/progress/83) | -| Spanish (Español) (es_ES) | ![87%](https://geps.dev/progress/87) | +| Slovenian (Slovenščina) (sl_SI) | ![82%](https://geps.dev/progress/82) | +| Spanish (Español) (es_ES) | ![86%](https://geps.dev/progress/86) | | Swedish (Svenska) (sv_SE) | ![76%](https://geps.dev/progress/76) | -| Thai (ไทย) (th_TH) | ![69%](https://geps.dev/progress/69) | -| Tibetan (བོད་ཡིག་) (bo_CN) | ![76%](https://geps.dev/progress/76) | +| Thai (ไทย) (th_TH) | ![68%](https://geps.dev/progress/68) | +| Tibetan (བོད་ཡིག་) (bo_CN) | ![75%](https://geps.dev/progress/75) | | Traditional Chinese (繁體中文) (zh_TW) | ![85%](https://geps.dev/progress/85) | -| Turkish (Türkçe) (tr_TR) | ![86%](https://geps.dev/progress/86) | -| Ukrainian (Українська) (uk_UA) | ![85%](https://geps.dev/progress/85) | -| Vietnamese (Tiếng Việt) (vi_VN) | ![67%](https://geps.dev/progress/67) | +| Turkish (Türkçe) (tr_TR) | ![85%](https://geps.dev/progress/85) | +| Ukrainian (Українська) (uk_UA) | ![84%](https://geps.dev/progress/84) | +| Vietnamese (Tiếng Việt) (vi_VN) | ![66%](https://geps.dev/progress/66) | | Malayalam (മലയാളം) (ml_IN) | ![85%](https://geps.dev/progress/85) | ## Stirling PDF Enterprise diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 5ec11150b..b35874ca2 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML إلى PDF home.HTMLToPDF.desc=يحول أي ملف HTML أو ملف مضغوط يحتوي HTMLToPDF.tags=لغة الترميز,محتوى الويب,تحويل,تحويل +#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 + +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 home.MarkdownToPDF.title=Markdown إلى PDF home.MarkdownToPDF.desc=يحول أي ملف Markdown إلى PDF diff --git a/src/main/resources/messages_az_AZ.properties b/src/main/resources/messages_az_AZ.properties index 5b993ac1c..54e13f48d 100644 --- a/src/main/resources/messages_az_AZ.properties +++ b/src/main/resources/messages_az_AZ.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML-dən PDF-ə home.HTMLToPDF.desc=Hər hansı HTML faylını və ya ZİP-i PDF-ə çevirir HTMLToPDF.tags=işarələmə,veb-məzmun,çevirmə,dəyişmə +#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 + +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 home.MarkdownToPDF.title=Markdown-dan PDF-ə home.MarkdownToPDF.desc=Hər hansı Markdown faylını PDF-ə çevirir diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index ad9653349..0d77c8620 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML към PDF home.HTMLToPDF.desc=Преобразува всеки HTML файл или архив към PDF HTMLToPDF.tags=маркиране,уеб-съдържание,трансформация,преобразуване +#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 + +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 home.MarkdownToPDF.title=Markdown към PDF home.MarkdownToPDF.desc=Преобразува всеки Markdown файл към PDF diff --git a/src/main/resources/messages_bo_CN.properties b/src/main/resources/messages_bo_CN.properties index 6f65f1cd9..53141dad9 100644 --- a/src/main/resources/messages_bo_CN.properties +++ b/src/main/resources/messages_bo_CN.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML ནས་ PDF ལ། home.HTMLToPDF.desc=HTML ཡིག་ཆའམ་ zip ཡིག་ཆ་གང་རུང་ PDF ལ་བསྒྱུར་བ། HTMLToPDF.tags=རྟགས་རྒྱག,དྲ་ངོས་ནང་དོན།,བསྒྱུར་བཅོས།,བསྒྱུར་བ། +#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 + +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 home.MarkdownToPDF.title=Markdown ནས་ PDF ལ། home.MarkdownToPDF.desc=Markdown ཡིག་ཆ་གང་རུང་ PDF ལ་བསྒྱུར་བ། diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index f20b3a064..b0d308813 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML a PDF home.HTMLToPDF.desc=Converteix qualsevol fitxer HTML o arxiu comprimit a PDF HTMLToPDF.tags=marcatge,contingut web,transformació,convertir +#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 + +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 home.MarkdownToPDF.title=Markdown a PDF home.MarkdownToPDF.desc=Converteix qualsevol fitxer Markdown a PDF diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index 07d9fce84..534fa1729 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML na PDF home.HTMLToPDF.desc=Převádí libovolný HTML soubor nebo zip na PDF HTMLToPDF.tags=značkování,webový-obsah,transformace,převod +#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 + +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 home.MarkdownToPDF.title=Markdown na PDF home.MarkdownToPDF.desc=Převádí libovolný Markdown soubor na PDF diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties index 54fb6129c..adc2787d4 100644 --- a/src/main/resources/messages_da_DK.properties +++ b/src/main/resources/messages_da_DK.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML til PDF home.HTMLToPDF.desc=Konverterer enhver HTML-fil eller zip til PDF HTMLToPDF.tags=markup,webindhold,transformation,konvertér +#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 + +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 home.MarkdownToPDF.title=Markdown til PDF home.MarkdownToPDF.desc=Konverterer enhver Markdown-fil til PDF diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index d37c44103..519c8d3d0 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML zu PDF 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 + +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 home.MarkdownToPDF.title=Markdown zu PDF home.MarkdownToPDF.desc=Konvertiert jede Markdown-Datei zu PDF diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index 72a5d8e70..c74095293 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML σε PDF home.HTMLToPDF.desc=Μετατρέπει οποιοδήποτε αρχείο HTML ή zip σε PDF HTMLToPDF.tags=markup,περιεχόμενο-web,μετατροπή,μετατροπή +#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 + +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 home.MarkdownToPDF.title=Markdown σε PDF home.MarkdownToPDF.desc=Μετατρέπει οποιοδήποτε αρχείο Markdown σε PDF diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index a40c1f3b7..f727830bf 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML to PDF home.HTMLToPDF.desc=Converts any HTML file or zip to PDF HTMLToPDF.tags=markup,web-content,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 + +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 home.MarkdownToPDF.title=Markdown to PDF home.MarkdownToPDF.desc=Converts any Markdown file to PDF diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 1ec4a03de..d4e491296 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML a PDF home.HTMLToPDF.desc=Convierte cualquier archivo HTML o ZIP a PDF HTMLToPDF.tags=margen,contenido web,transformación,convertir +#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 + +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 home.MarkdownToPDF.title=Markdown a PDF home.MarkdownToPDF.desc=Convierte cualquier archivo Markdown a PDF diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 843e85aeb..16daf035e 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML PDF-ra home.HTMLToPDF.desc=Bihurtu edozein HTML edo zip fitxategi PDFra HTMLToPDF.tags=markup,web-content,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 + +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 home.MarkdownToPDF.title=Markdown PDF-ra home.MarkdownToPDF.desc=Bihurtu Markdown fitxategi guztiak PDF diff --git a/src/main/resources/messages_fa_IR.properties b/src/main/resources/messages_fa_IR.properties index cbb9ad5d0..24836b662 100644 --- a/src/main/resources/messages_fa_IR.properties +++ b/src/main/resources/messages_fa_IR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML به PDF home.HTMLToPDF.desc=تبدیل هر فایل HTML یا زیپ به PDF HTMLToPDF.tags=مارک‌آپ،محتوای وب،تبدیل،تغییر +#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 + +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 home.MarkdownToPDF.title=مارک‌داون به PDF home.MarkdownToPDF.desc=تبدیل هر فایل مارک‌داون به PDF diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index 3268472ba..901733f65 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML en PDF 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 + +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 home.MarkdownToPDF.title=Markdown en PDF home.MarkdownToPDF.desc=Convertissez n'importe quel fichier Markdown en PDF. diff --git a/src/main/resources/messages_ga_IE.properties b/src/main/resources/messages_ga_IE.properties index 5c7bb2820..f99b340ca 100644 --- a/src/main/resources/messages_ga_IE.properties +++ b/src/main/resources/messages_ga_IE.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML go PDF home.HTMLToPDF.desc=Tiontaíonn aon chomhad HTML nó zip go PDF HTMLToPDF.tags=marcáil, ábhar gréasáin, claochlú, tiontú +#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 + +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 home.MarkdownToPDF.title=Marcáil síos go PDF home.MarkdownToPDF.desc=Tiontaíonn aon chomhad Markdown go PDF diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 870f7d7cb..6eb115d83 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML से PDF home.HTMLToPDF.desc=किसी भी HTML फ़ाइल या zip को PDF में बदलें HTMLToPDF.tags=मार्कअप,वेब-सामग्री,रूपांतरण,बदलें +#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 + +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 home.MarkdownToPDF.title=Markdown से PDF home.MarkdownToPDF.desc=किसी भी Markdown फ़ाइल को PDF में बदलें diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index 5c9942adc..177b2e28b 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML u PDF home.HTMLToPDF.desc=Pretvara bilo koji HTML datoteku ili zip u PDF HTMLToPDF.tags=oznake,web-sadržaj,transformacija,konvertiranje +#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 + +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 home.MarkdownToPDF.title=Markdown u PDF home.MarkdownToPDF.desc=Pretvara bilo koju Markdown datoteku u PDF diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index 8dda0cef0..b76b2f616 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML konvertálása PDF-be 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=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 + +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 home.MarkdownToPDF.title=Markdown konvertálása PDF-be home.MarkdownToPDF.desc=Markdown fájl konvertálása PDF-be diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index 9f707219a..ea98581ea 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML ke PDF home.HTMLToPDF.desc=Mengonversi berkas HTML atau zip ke PDF HTMLToPDF.tags=markup, konten web, transformasi, konversi +#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 + +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 home.MarkdownToPDF.title=Penurunan harga ke PDF home.MarkdownToPDF.desc=Mengonversi berkas Markdown apa pun ke PDF diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 46bd1ec0e..f3cd102f9 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=Da HTML a PDF home.HTMLToPDF.desc=Converte qualsiasi file HTML o zip in PDF HTMLToPDF.tags=markup,contenuto web,trasformazione,conversione +#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 + +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 home.MarkdownToPDF.title=Markdown in PDF home.MarkdownToPDF.desc=Converte qualsiasi file Markdown in PDF diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 89b13d94d..cdd770d51 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTMLをPDFに変換 home.HTMLToPDF.desc=HTMLファイルまたはzipをPDFに変換します。 HTMLToPDF.tags=markup,web-content,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 + +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 home.MarkdownToPDF.title=MarkdownをPDFに変換 home.MarkdownToPDF.desc=あらゆるMarkdownファイルをPDFに変換します。 diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index b9fcfa85f..94807ce99 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML을 PDF로 home.HTMLToPDF.desc=HTML 파일이나 zip을 PDF로 변환 HTMLToPDF.tags=마크업,웹-콘텐츠,변환,변환 +#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 + +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 home.MarkdownToPDF.title=Markdown을 PDF로 home.MarkdownToPDF.desc=Markdown 파일을 PDF로 변환 diff --git a/src/main/resources/messages_ml_IN.properties b/src/main/resources/messages_ml_IN.properties index 8da9ec632..fc3d5fa20 100644 --- a/src/main/resources/messages_ml_IN.properties +++ b/src/main/resources/messages_ml_IN.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML PDF-ലേക്ക് home.HTMLToPDF.desc=ഏത് HTML ഫയലിനെയും അല്ലെങ്കിൽ സിപ്പിനെയും PDF-ലേക്ക് മാറ്റുന്നു HTMLToPDF.tags=മാർക്ക്അപ്പ്,വെബ്-ഉള്ളടക്കം,രൂപാന്തരം,പരിവർത്തനം ചെയ്യുക +#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 + +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 home.MarkdownToPDF.title=മാർക്ക്ഡൗൺ PDF-ലേക്ക് home.MarkdownToPDF.desc=ഏത് മാർക്ക്ഡൗൺ ഫയലിനെയും PDF-ലേക്ക് മാറ്റുന്നു diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index 3cd03956b..5832ae536 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML naar PDF home.HTMLToPDF.desc=Zet HTML-bestand of zip om naar PDF HTMLToPDF.tags=markup,web-inhoud,transformatie,omzetten +#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 + +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 home.MarkdownToPDF.title=Markdown naar PDF home.MarkdownToPDF.desc=Zet Markdown-bestand om naar PDF diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index f0d983cc1..84126a498 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML til PDF home.HTMLToPDF.desc=Konverter hvilken som helst HTML-fil eller zip til PDF HTMLToPDF.tags=markup,web-innhold,transformasjon,konverter +#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 + +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 home.MarkdownToPDF.title=Markdown til PDF home.MarkdownToPDF.desc=Konverter hvilken som helst Markdown-fil til PDF diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 76f582e0d..ed9c48690 100644 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML do PDF home.HTMLToPDF.desc=Zapisuje podany plik HTML/ZIP do PDF HTMLToPDF.tags=znaczniki, treść internetowa, transformacja, konwertowanie +#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 + +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 home.MarkdownToPDF.title=Markdown do PDF home.MarkdownToPDF.desc=Zapisuje dokument Markdown do PDF diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index bcdf02849..a282410dd 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML para PDF home.HTMLToPDF.desc=Converter qualquer arquivo HTML ou zip para PDF. HTMLToPDF.tags=marcação,conteúdo-web,transformação,converter +#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 + +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 home.MarkdownToPDF.title=Markdown para PDF home.MarkdownToPDF.desc=Converte qualquer arquivo Markdown para PDF. diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 2f8b3ee3c..897c5d441 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML para PDF home.HTMLToPDF.desc=Converte qualquer ficheiro HTML ou zip para PDF HTMLToPDF.tags=marcação,conteúdo-web,transformação,converter +#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 + +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 home.MarkdownToPDF.title=Markdown para PDF home.MarkdownToPDF.desc=Converte qualquer ficheiro Markdown para PDF diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index e856d2a4a..a09b54b8a 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML în PDF home.HTMLToPDF.desc=Convertește orice fișier HTML sau zip în PDF HTMLToPDF.tags=markup,conținut-web,transformare,convertește +#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 + +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 home.MarkdownToPDF.title=Markdown în PDF home.MarkdownToPDF.desc=Convertește orice fișier Markdown în PDF diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 606ef074b..734722c04 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML в PDF home.HTMLToPDF.desc=Преобразует любой HTML-файл или zip в PDF HTMLToPDF.tags=разметка,веб-контент,преобразование,конвертация +#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 + +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 home.MarkdownToPDF.title=Markdown в PDF home.MarkdownToPDF.desc=Преобразует любой файл Markdown в PDF diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index b5731b748..34b470830 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML do PDF home.HTMLToPDF.desc=Konvertuje akýkoľvek HTML súbor alebo zip do PDF HTMLToPDF.tags=markup, webový obsah, transformácia, konvertovať +#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 + +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 home.MarkdownToPDF.title=Markdown do PDF home.MarkdownToPDF.desc=Konvertuje akýkoľvek Markdown súbor do PDF diff --git a/src/main/resources/messages_sl_SI.properties b/src/main/resources/messages_sl_SI.properties index 9bc2a1e88..ded53d6d1 100644 --- a/src/main/resources/messages_sl_SI.properties +++ b/src/main/resources/messages_sl_SI.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML v PDF home.HTMLToPDF.desc=Pretvori katero koli datoteko HTML ali zip v PDF HTMLToPDF.tags=markup,web-content,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 + +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 home.MarkdownToPDF.title=Markdown v PDF home.MarkdownToPDF.desc=Pretvori katero koli datoteko Markdown v PDF diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index dcdba9d79..165600141 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML u PDF home.HTMLToPDF.desc=Konvertuje bilo koji HTML fajl ili zip u PDF HTMLToPDF.tags=oznake,web-sadržaj,transformacija,konvertovanje +#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 + +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 home.MarkdownToPDF.title=Markdown u PDF home.MarkdownToPDF.desc=Konvertuje bilo koji Markdown fajl u PDF diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index a5fe2259e..50002908e 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML till PDF home.HTMLToPDF.desc=Konverterar valfri HTML-fil eller zip till PDF HTMLToPDF.tags=markup,webbinnehåll,transformation,konvertera +#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 + +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 home.MarkdownToPDF.title=Markdown till PDF home.MarkdownToPDF.desc=Konverterar valfri Markdown-fil till PDF diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties index 2d3a0c344..8c11d2dee 100644 --- a/src/main/resources/messages_th_TH.properties +++ b/src/main/resources/messages_th_TH.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML เป็น PDF home.HTMLToPDF.desc=แปลงไฟล์ HTML หรือ zip เป็น PDF HTMLToPDF.tags=มาร์กอัป, เนื้อหาเว็บ, การแปลง, การแปลง +#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 + +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 home.MarkdownToPDF.title=Markdown เป็น PDF home.MarkdownToPDF.desc=แปลงไฟล์ Markdown เป็น PDF diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 556f4c6d4..5c635dc62 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML'den PDF'e home.HTMLToPDF.desc=Herhangi bir HTML dosyasını veya zip'i PDF'e dönüştürür HTMLToPDF.tags=biçimlendirme,web-içeriği,dönüşüm,dönüştür +#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 + +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 home.MarkdownToPDF.title=Markdown'dan PDF'e home.MarkdownToPDF.desc=Herhangi bir Markdown dosyasını PDF'e dönüştürür diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index e1bb44b5c..f1f281c36 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML в PDF home.HTMLToPDF.desc=Конвертує будь-який HTML-файл або zip-файл у PDF. HTMLToPDF.tags=розмітка,веб-контент,перетворення,конвертація +#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 + +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 home.MarkdownToPDF.title=Markdown в PDF home.MarkdownToPDF.desc=Конвертує будь-який файл Markdown у PDF diff --git a/src/main/resources/messages_vi_VN.properties b/src/main/resources/messages_vi_VN.properties index 65170ffed..4600330d2 100644 --- a/src/main/resources/messages_vi_VN.properties +++ b/src/main/resources/messages_vi_VN.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML sang PDF home.HTMLToPDF.desc=Chuyển đổi bất kỳ tệp HTML hoặc zip nào thành PDF HTMLToPDF.tags=đánh dấu,nội dung web,chuyển đổi,chuyển +#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 + +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 home.MarkdownToPDF.title=Markdown sang PDF home.MarkdownToPDF.desc=Chuyển đổi bất kỳ tệp Markdown nào thành PDF diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 58a2d047e..56982f79a 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML 转 PDF home.HTMLToPDF.desc=将任何 HTML 文件或 zip 文件转换为 PDF HTMLToPDF.tags=标记、网页内容、转换、转换 +#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 + +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 home.MarkdownToPDF.title=Markdown 转 PDF home.MarkdownToPDF.desc=将任何 Markdown 文件转换为 PDF diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index a7a164bb2..1d12c4a81 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML 轉 PDF home.HTMLToPDF.desc=將任何 HTML 檔案或壓縮檔轉換為 PDF HTMLToPDF.tags=標記,網頁內容,轉換,轉檔 +#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 + +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 home.MarkdownToPDF.title=Markdown 轉 PDF home.MarkdownToPDF.desc=將任何 Markdown 檔案轉換為 PDF From baaaa5a0b2ff687407dfce177e1beadb41531659 Mon Sep 17 00:00:00 2001 From: ConnorYoh <40631091+ConnorYoh@users.noreply.github.com> Date: Mon, 9 Jun 2025 12:02:56 +0100 Subject: [PATCH 3/4] Disabled auto capture for posthog (#3661) # Description of Changes Please provide a summary of the changes, including: - What was changed - Why the change was made - Any challenges encountered Closes #(issue_number) --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --- src/main/resources/templates/fragments/common.html | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/templates/fragments/common.html b/src/main/resources/templates/fragments/common.html index 02d919b2b..2f7b9df2f 100644 --- a/src/main/resources/templates/fragments/common.html +++ b/src/main/resources/templates/fragments/common.html @@ -147,6 +147,7 @@ api_host: 'https://eu.i.posthog.com', persistence: 'localStorage', person_profiles: 'always', + autocapture: false, mask_all_text: true, mask_all_element_attributes: true, opt_out_capturing_by_default: true From c7d6a063d75139ff793cc4e8550c9ca791874ab7 Mon Sep 17 00:00:00 2001 From: Dario Ghunney Ware Date: Mon, 9 Jun 2025 12:51:41 +0100 Subject: [PATCH 4/4] Multi module refactor (#3640) # Description of Changes Migrated Stirling PDF to a multi-module structure: * Introduced new `:stirling-pdf` module * Moved all the core logic and features of Stirling PDF into `:stirling-pdf` * Updated paths of jobs and scripts --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --- .gitattributes | 14 +- .github/labeler-config.yml | 57 +- .github/scripts/check_language_properties.py | 2 +- .github/workflows/check_properties.yml | 25 +- .github/workflows/licenses-update.yml | 4 +- .github/workflows/sync_files.yml | 10 +- .gitignore | 4 +- .pre-commit-config.yaml | 2 +- DeveloperGuide.md | 20 +- Dockerfile | 2 +- Dockerfile.fat | 2 +- HowToAddNewLanguage.md | 4 +- build.gradle | 340 ++++++----- common/.gitignore | 2 +- common/build.gradle | 37 -- .../common/configuration/AppConfig.java | 10 +- .../common/model/ApplicationProperties.java | 8 +- .../common/service/PostHogService.java | 2 +- .../software/common/util/ValidationUtil.java | 14 + .../common/util/CheckProgramInstallTest.java | 21 +- .../software/common/util/FileMonitorTest.java | 1 - .../common/util/ProviderUtilsTest.java | 13 +- .../HighContrastColorReplaceDeciderTest.java | 6 +- .../misc/InvertFullColorStrategyTest.java | 1 - .../ReplaceAndInvertColorStrategyTest.java | 1 - .../StringToArrayListPropertyEditorTest.java | 11 +- ...ocker-compose-latest-security-with-sso.yml | 6 +- ...ker-compose-latest-ultra-lite-security.yml | 6 +- .../docker-compose-latest-ultra-lite.yml | 4 +- exampleYmlFiles/docker-compose-latest.yml | 6 +- exampleYmlFiles/test_cicd.yml | 6 +- proprietary/.gitignore | 2 +- proprietary/build.gradle | 30 - .../security/CustomLogoutSuccessHandler.java | 1 + .../configuration/SecurityConfiguration.java | 2 + .../configuration/ee}/EEAppConfig.java | 10 +- .../ee}/KeygenLicenseVerifier.java | 4 +- .../configuration/ee}/LicenseKeyChecker.java | 6 +- .../security/saml2/SAML2Configuration.java | 3 +- .../ee}/LicenseKeyCheckerTest.java | 10 +- scripts/download-security-jar.sh | 2 +- settings.gradle | 2 +- .../software/SPDF/model/api/Email.java | 38 -- .../software/SPDF/model/api/GeneralFile.java | 19 - .../api/converters/ConvertToImageRequest.java | 42 -- .../model/api/general/OverlayPdfsRequest.java | 46 -- .../SPDF/model/api/misc/AddStampRequest.java | 87 --- .../SPDF/model/api/misc/MetadataRequest.java | 84 --- .../model/api/security/RedactPdfRequest.java | 49 -- .../model/api/security/RedactionArea.java | 28 - .../api/security/SanitizePdfRequest.java | 49 -- .../model/api/user/UpdateUserDetails.java | 17 - .../model/api/user/UpdateUserUsername.java | 14 - .../SPDF/model/api/user/Username.java | 14 - .../SPDF/model/api/user/UsernameAndPass.java | 14 - stirling-pdf/.gitignore | 196 +++++++ stirling-pdf/build.gradle | 95 ++++ .../signature/CMSProcessableInputStream.java | 0 .../signature/CreateSignatureBase.java | 0 .../pdfbox/examples/signature/TSAClient.java | 0 .../signature/ValidationTimeStamp.java | 0 .../examples/util/ConnectedInputStream.java | 0 .../ReplaceAndInvertColorFactory.java | 0 .../software/SPDF/LibreOfficeListener.java | 0 .../software/SPDF/SPDFApplication.java | 36 +- .../stirling/software/SPDF/UI/WebBrowser.java | 0 .../software/SPDF/UI/impl/DesktopBrowser.java | 0 .../software/SPDF/UI/impl/LoadingWindow.java | 0 .../SPDF/config/AppUpdateService.java | 0 .../SPDF/config/CleanUrlInterceptor.java | 40 +- .../SPDF/config/EndpointConfiguration.java | 0 .../SPDF/config/EndpointInspector.java | 6 +- .../SPDF/config/EndpointInterceptor.java | 4 +- .../SPDF/config/ExternalAppDepConfig.java | 58 +- .../software/SPDF/config/InitialSetup.java | 2 +- .../SPDF/config/LocaleConfiguration.java | 0 .../SPDF/config/LogbackPropertyLoader.java | 0 .../software/SPDF/config/MetricsConfig.java | 0 .../software/SPDF/config/MetricsFilter.java | 0 .../software/SPDF/config/OpenApiConfig.java | 0 .../config/StartupApplicationListener.java | 0 .../software/SPDF/config/WebMvcConfig.java | 6 +- .../FingerprintBasedSessionFilter.java | 2 +- .../FingerprintBasedSessionManager.java | 0 .../fingerprint/FingerprintGenerator.java | 0 .../api/AdditionalLanguageJsController.java | 0 .../controller/api/AnalysisController.java | 0 .../SPDF/controller/api/CropController.java | 0 .../SPDF/controller/api/MergeController.java | 0 .../api/MultiPageLayoutController.java | 0 .../api/PdfImageRemovalController.java | 0 .../controller/api/PdfOverlayController.java | 0 .../api/RearrangePagesPDFController.java | 0 .../controller/api/RotationController.java | 0 .../controller/api/ScalePagesController.java | 0 .../controller/api/SettingsController.java | 6 +- .../controller/api/SplitPDFController.java | 2 +- .../api/SplitPdfByChaptersController.java | 2 +- .../api/SplitPdfBySectionsController.java | 2 +- .../api/SplitPdfBySizeController.java | 0 .../api/ToSinglePageController.java | 0 .../api/converters/ConvertEmlToPDF.java | 0 .../api/converters/ConvertHtmlToPDF.java | 0 .../converters/ConvertImgPDFController.java | 0 .../api/converters/ConvertMarkdownToPdf.java | 2 +- .../converters/ConvertOfficeController.java | 0 .../api/converters/ConvertPDFToHtml.java | 0 .../api/converters/ConvertPDFToOffice.java | 0 .../api/converters/ConvertPDFToPDFA.java | 0 .../api/converters/ConvertWebsiteToPDF.java | 0 .../api/converters/ExtractCSVController.java | 0 .../api/filters/FilterController.java | 0 .../api/misc/AutoRenameController.java | 0 .../api/misc/AutoSplitPdfController.java | 0 .../api/misc/BlankPageController.java | 0 .../api/misc/CompressController.java | 21 +- .../api/misc/DecompressPdfController.java | 0 .../api/misc/ExtractImageScansController.java | 0 .../api/misc/ExtractImagesController.java | 0 .../api/misc/FakeScanController.java | 0 .../api/misc/FlattenController.java | 0 .../api/misc/MetadataController.java | 0 .../controller/api/misc/OCRController.java | 0 .../api/misc/OverlayImageController.java | 0 .../api/misc/PageNumbersController.java | 0 .../api/misc/PrintFileController.java | 0 .../controller/api/misc/RepairController.java | 0 .../misc/ReplaceAndInvertColorController.java | 0 .../controller/api/misc/ShowJavascript.java | 0 .../controller/api/misc/StampController.java | 0 .../api/misc/UnlockPDFFormsController.java | 0 .../api/pipeline/PipelineController.java | 0 .../pipeline/PipelineDirectoryProcessor.java | 3 +- .../api/pipeline/PipelineProcessor.java | 1 + .../api/security/CertSignController.java | 0 .../controller/api/security/GetInfoOnPDF.java | 0 .../api/security/PasswordController.java | 0 .../api/security/RedactController.java | 5 +- .../security/RemoveCertSignController.java | 0 .../api/security/SanitizeController.java | 0 .../security/ValidateSignatureController.java | 0 .../api/security/WatermarkController.java | 0 .../web/ConverterWebController.java | 0 .../controller/web/GeneralWebController.java | 0 .../controller/web/HomeWebController.java | 7 +- .../controller/web/MetricsController.java | 0 .../controller/web/OtherWebController.java | 0 .../controller/web/SecurityWebController.java | 0 .../controller/web/SignatureController.java | 0 .../controller/web/UploadLimitService.java | 0 .../software/SPDF/model/ApiEndpoint.java | 0 .../software/SPDF/model/Dependency.java | 0 .../stirling/software/SPDF/model/PDFText.java | 0 .../software/SPDF/model/PipelineConfig.java | 0 .../SPDF/model/PipelineOperation.java | 0 .../software/SPDF/model/PipelineResult.java | 0 .../software/SPDF/model/SignatureFile.java | 0 .../software/SPDF/model/SortTypes.java | 0 .../SPDF/model/api/HandleDataRequest.java | 0 .../software/SPDF/model/api/ImageFile.java | 0 .../SPDF/model/api/MultiplePDFFiles.java | 0 .../SPDF/model/api/PDFComparison.java | 0 .../SPDF/model/api/PDFComparisonAndCount.java | 0 .../model/api/PDFExtractImagesRequest.java | 0 .../model/api/PDFWithImageFormatRequest.java | 0 .../SPDF/model/api/PDFWithPageNums.java | 0 .../SPDF/model/api/PDFWithPageSize.java | 0 .../model/api/SplitPdfByChaptersRequest.java | 1 - .../model/api/SplitPdfBySectionsRequest.java | 1 - .../api/converters/ConvertPDFToMarkdown.java | 0 .../api/converters/ConvertToImageRequest.java | 41 ++ .../api/converters/ConvertToPdfRequest.java | 0 .../api/converters/PdfToBookRequest.java | 0 .../api/converters/PdfToPdfARequest.java | 0 .../converters/PdfToPresentationRequest.java | 0 .../api/converters/PdfToTextOrRTFRequest.java | 0 .../api/converters/PdfToWordRequest.java | 0 .../model/api/converters/UrlToPdfRequest.java | 0 .../model/api/filter/ContainsTextRequest.java | 6 +- .../model/api/filter/FileSizeRequest.java | 6 +- .../model/api/filter/PageRotationRequest.java | 6 +- .../model/api/filter/PageSizeRequest.java | 8 +- .../SPDF/model/api/general/CropPdfForm.java | 0 .../general/MergeMultiplePagesRequest.java | 0 .../model/api/general/MergePdfsRequest.java | 0 .../model/api/general/OverlayPdfsRequest.java | 46 ++ .../api/general/RearrangePagesRequest.java | 0 .../model/api/general/RotatePDFRequest.java | 0 .../model/api/general/ScalePagesRequest.java | 0 .../general/SplitPdfBySizeOrCountRequest.java | 0 .../model/api/misc/AddPageNumbersRequest.java | 0 .../SPDF/model/api/misc/AddStampRequest.java | 87 +++ .../model/api/misc/AutoSplitPdfRequest.java | 0 .../model/api/misc/ExtractHeaderRequest.java | 0 .../api/misc/ExtractImageScansRequest.java | 0 .../SPDF/model/api/misc/FakeScanRequest.java | 0 .../SPDF/model/api/misc/FlattenRequest.java | 0 .../SPDF/model/api/misc/MetadataRequest.java | 84 +++ .../model/api/misc/OptimizePdfRequest.java | 0 .../model/api/misc/OverlayImageRequest.java | 0 .../SPDF/model/api/misc/PrintFileRequest.java | 1 - .../api/misc/ProcessPdfWithOcrRequest.java | 0 .../api/misc/RemoveBlankPagesRequest.java | 0 .../misc/ReplaceAndInvertColorRequest.java | 0 .../api/security/AddPasswordRequest.java | 32 +- .../api/security/AddWatermarkRequest.java | 0 .../api/security/ManualRedactPdfRequest.java | 17 +- .../api/security/PDFPasswordRequest.java | 0 .../model/api/security/RedactPdfRequest.java | 48 ++ .../api/security/SanitizePdfRequest.java | 49 ++ .../api/security/SignPDFWithCertRequest.java | 0 .../security/SignatureValidationRequest.java | 0 .../security/SignatureValidationResult.java | 0 .../software/SPDF/pdf/FlexibleCSVWriter.java | 0 .../software/SPDF/pdf/TextFinder.java | 0 .../software/SPDF/service}/ApiDocService.java | 2 +- .../service/CertificateValidationService.java | 0 .../SPDF/service/LanguageService.java | 0 .../service/MetricsAggregatorService.java | 2 +- .../SPDF/service/PdfImageRemovalService.java | 0 .../SPDF/service/SignatureService.java | 0 .../misc/ReplaceAndInvertColorService.java | 0 .../main/resources/application.properties | 6 +- .../src}/main/resources/banner.txt | 0 .../src}/main/resources/certdata.txt | 0 .../src}/main/resources/logback.xml | 4 +- .../src}/main/resources/messages.properties | 0 .../main/resources/messages_ar_AR.properties | 167 ------ .../main/resources/messages_az_AZ.properties | 167 ------ .../main/resources/messages_bg_BG.properties | 167 ------ .../main/resources/messages_ca_CA.properties | 167 ------ .../main/resources/messages_cs_CZ.properties | 167 ------ .../main/resources/messages_da_DK.properties | 167 ------ .../main/resources/messages_de_DE.properties | 0 .../main/resources/messages_el_GR.properties | 0 .../main/resources/messages_en_GB.properties | 167 ------ .../main/resources/messages_en_US.properties | 167 ------ .../main/resources/messages_es_ES.properties | 193 +------ .../main/resources/messages_eu_ES.properties | 167 ------ .../main/resources/messages_fa_IR.properties | 167 ------ .../main/resources/messages_fr_FR.properties | 167 ------ .../main/resources/messages_ga_IE.properties | 167 ------ .../main/resources/messages_hi_IN.properties | 167 ------ .../main/resources/messages_hr_HR.properties | 167 ------ .../main/resources/messages_hu_HU.properties | 0 .../main/resources/messages_id_ID.properties | 167 ------ .../main/resources/messages_it_IT.properties | 167 ------ .../main/resources/messages_ja_JP.properties | 0 .../main/resources/messages_ko_KR.properties | 167 ------ .../main/resources/messages_ml_ML.properties | 167 ------ .../main/resources/messages_nl_NL.properties | 167 ------ .../main/resources/messages_no_NB.properties | 167 ------ .../main/resources/messages_pl_PL.properties | 167 ------ .../main/resources/messages_pt_BR.properties | 167 ------ .../main/resources/messages_pt_PT.properties | 167 ------ .../main/resources/messages_ro_RO.properties | 167 ------ .../main/resources/messages_ru_RU.properties | 303 +++------- .../main/resources/messages_sk_SK.properties | 167 ------ .../main/resources/messages_sl_SI.properties | 167 ------ .../resources/messages_sr_LATN_RS.properties | 167 ------ .../main/resources/messages_sv_SE.properties | 167 ------ .../main/resources/messages_th_TH.properties | 167 ------ .../main/resources/messages_tr_TR.properties | 167 ------ .../main/resources/messages_uk_UA.properties | 277 ++------- .../main/resources/messages_vi_VN.properties | 167 ------ .../main/resources/messages_zh_BO.properties | 205 ------- .../main/resources/messages_zh_CN.properties | 307 +++------- .../main/resources/messages_zh_TW.properties | 179 +----- .../src}/main/resources/settings.yml.template | 11 +- .../resources/static/3rdPartyLicenses.json | 242 ++++---- .../static/android-chrome-192x192.png | Bin .../static/android-chrome-512x512.png | Bin .../resources/static/apple-touch-icon.png | Bin .../main/resources/static/browserconfig.xml | 0 .../main/resources/static/css/account.css | 0 .../main/resources/static/css/add-image.css | 0 .../resources/static/css/bootstrap-icons.css | 0 .../static/css/bootstrap-icons.min.css | 0 .../resources/static/css/bootstrap.min.css | 0 .../static/css/bootstrap.min.css.map | 0 .../resources/static/css/cookieconsent.css | 0 .../static/css/cookieconsentCustomisation.css | 0 .../main/resources/static/css/dragdrop.css | 0 .../src}/main/resources/static/css/error.css | 0 .../main/resources/static/css/errorBanner.css | 0 .../main/resources/static/css/fileSelect.css | 0 .../static/css/fonts/bootstrap-icons.woff | Bin .../static/css/fonts/bootstrap-icons.woff2 | Bin .../src}/main/resources/static/css/footer.css | 0 .../src}/main/resources/static/css/game.css | 0 .../main/resources/static/css/general.css | 0 .../main/resources/static/css/home-legacy.css | 229 ++++++++ .../src}/main/resources/static/css/home.css | 0 .../resources/static/css/imageHighlighter.css | 0 .../main/resources/static/css/licenses.css | 0 .../src}/main/resources/static/css/login.css | 0 .../src}/main/resources/static/css/merge.css | 0 .../main/resources/static/css/multi-tool.css | 0 .../src}/main/resources/static/css/navbar.css | 0 .../main/resources/static/css/pdfActions.css | 0 .../main/resources/static/css/pipeline.css | 0 .../src}/main/resources/static/css/prism.css | 0 .../resources/static/css/rainbow-mode.css | 0 .../src}/main/resources/static/css/redact.css | 0 .../main/resources/static/css/removeImage.css | 0 .../main/resources/static/css/rotate-pdf.css | 0 .../src}/main/resources/static/css/sign.css | 0 .../static/css/split-pdf-by-sections.css | 0 .../src}/main/resources/static/css/stamp.css | 0 .../resources/static/css/tab-container.css | 0 .../static/css/theme/componentes.css | 0 .../main/resources/static/css/theme/font.css | 0 .../main/resources/static/css/theme/theme.css | 0 .../resources/static/css/theme/theme.dark.css | 0 .../static/css/theme/theme.light.css | 0 .../src}/main/resources/static/css/usage.css | 0 .../main/resources/static/favicon-16x16.png | Bin .../main/resources/static/favicon-32x32.png | Bin .../src}/main/resources/static/favicon.icns | Bin .../src}/main/resources/static/favicon.ico | Bin .../src}/main/resources/static/favicon.png | Bin .../src}/main/resources/static/favicon.svg | 0 ...o Splitter Divider (with instructions).pdf | Bin .../resources/static/files/popularity.txt | 0 .../static/fonts/Arimo-Regular.woff2 | Bin .../static/fonts/DancingScript-Regular.woff2 | Bin .../main/resources/static/fonts/Estonia.woff2 | Bin .../static/fonts/IndieFlower-Regular.woff2 | Bin .../main/resources/static/fonts/Meiryo.ttf | Bin .../static/fonts/NotoSans-Regular.ttf | Bin .../static/fonts/NotoSansArabic-Regular.ttf | Bin .../static/fonts/NotoSansJP-Regular.ttf | Bin .../static/fonts/NotoSansSC-Regular.ttf | Bin .../main/resources/static/fonts/SimSun.ttf | Bin .../resources/static/fonts/Tangerine.woff2 | Bin .../static/fonts/Tinos-Regular.woff2 | Bin .../static/fonts/google-symbol.woff2 | Bin .../main/resources/static/fonts/malgun.ttf | Bin .../fonts/static/NotoSansArabic-Regular.ttf | Bin .../fonts/static/NotoSansJP-Regular.ttf | Bin .../main/resources/static/images/Files.svg | 0 .../static/images/arrow-right-short.svg | 0 .../main/resources/static/images/book.svg | 0 .../resources/static/images/clipboard.svg | 0 .../main/resources/static/images/discord.svg | 0 .../main/resources/static/images/docker.svg | 0 .../static/images/file-earmark-pdf.svg | 0 .../main/resources/static/images/github.svg | 0 .../resources/static/images/google-drive.svg | 0 .../resources/static/images/redact-auto.svg | 0 .../resources/static/images/redact-manual.svg | 0 .../main/resources/static/images/rename.svg | 0 .../resources/static/images/signature.png | Bin .../resources/static/images/split-auto.svg | 0 .../static/images/split-chapters.svg | 0 .../resources/static/images/split-size.svg | 0 .../main/resources/static/images/update.svg | 0 .../main/resources/static/js/DecryptFiles.js | 0 .../resources/static/js/cacheFormInputs.js | 0 .../main/resources/static/js/compare/diff.js | 0 .../resources/static/js/compare/pdfWorker.js | 0 .../src}/main/resources/static/js/csrf.js | 0 .../src}/main/resources/static/js/darkmode.js | 0 .../src}/main/resources/static/js/download.js | 0 .../main/resources/static/js/downloader.js | 0 .../resources/static/js/draggable-utils.js | 0 .../main/resources/static/js/errorBanner.js | 0 .../main/resources/static/js/favourites.js | 6 +- .../main/resources/static/js/fetch-utils.js | 0 .../resources/static/js/file-icon-factory.js | 0 .../main/resources/static/js/file-utils.js | 0 .../main/resources/static/js/fileInput.js | 0 .../src}/main/resources/static/js/game.js | 0 .../main/resources/static/js/githubVersion.js | 0 .../resources/static/js/googleFilePicker.js | 0 .../resources/static/js/homecard-legacy.js | 266 +++++++++ .../src}/main/resources/static/js/homecard.js | 0 .../resources/static/js/languageSelection.js | 0 .../static/js/local-pdf-input-download.js | 0 .../src}/main/resources/static/js/merge.js | 0 .../static/js/multitool/DragDropManager.js | 0 .../static/js/multitool/ImageHighlighter.js | 0 .../static/js/multitool/PdfActionsManager.js | 0 .../static/js/multitool/PdfContainer.js | 0 .../static/js/multitool/UndoManager.js | 0 .../static/js/multitool/commands/add-page.js | 0 .../static/js/multitool/commands/command.js | 0 .../multitool/commands/commands-sequence.js | 0 .../js/multitool/commands/delete-page.js | 0 .../static/js/multitool/commands/move-page.js | 0 .../js/multitool/commands/page-break.js | 0 .../static/js/multitool/commands/remove.js | 0 .../static/js/multitool/commands/rotate.js | 0 .../static/js/multitool/commands/select.js | 0 .../static/js/multitool/commands/split.js | 0 .../src}/main/resources/static/js/navbar.js | 0 .../resources/static/js/pages/add-image.js | 0 .../static/js/pages/adjust-contrast.js | 0 .../static/js/pages/change-metadata.js | 0 .../main/resources/static/js/pages/crop.js | 0 .../main/resources/static/js/pages/home.js | 4 + .../resources/static/js/pages/pdf-to-csv.js | 0 .../main/resources/static/js/pages/sign.js | 0 .../src}/main/resources/static/js/pipeline.js | 0 .../src}/main/resources/static/js/redact.js | 0 .../src}/main/resources/static/js/search.js | 0 .../src}/main/resources/static/js/settings.js | 0 .../static/js/sign/signature-canvas.js | 0 .../main/resources/static/js/tab-container.js | 0 .../static/js/thirdParty/bootstrap.min.js | 0 .../static/js/thirdParty/bootstrap.min.js.map | 0 .../static/js/thirdParty/chart.umd.min.js | 0 .../js/thirdParty/cookieconsent-config.js | 0 .../static/js/thirdParty/cookieconsent.umd.js | 0 .../thirdParty/fontfaceobserver.standalone.js | 0 .../static/js/thirdParty/interact.min.js | 0 .../static/js/thirdParty/interact.min.js.map | 0 .../static/js/thirdParty/jquery.min.js | 0 .../js/thirdParty/jquery.validate.min.js | 0 .../static/js/thirdParty/jszip.min.js | 0 .../static/js/thirdParty/pdf-lib.min.js | 0 .../static/js/thirdParty/pdf-lib.min.js.map | 0 .../static/js/thirdParty/popper.min.js | 0 .../static/js/thirdParty/popper.min.js.map | 0 .../resources/static/js/thirdParty/prism.js | 0 .../js/thirdParty/signature_pad.umd.min.js | 0 .../thirdParty/signature_pad.umd.min.js.map | 0 .../src}/main/resources/static/js/usage.js | 0 .../src}/main/resources/static/js/uuid.js | 0 .../src}/main/resources/static/manifest.json | 0 .../src}/main/resources/static/moon.svg | 0 .../main/resources/static/mstile-144x144.png | Bin .../main/resources/static/mstile-150x150.png | Bin .../main/resources/static/mstile-310x150.png | Bin .../main/resources/static/mstile-310x310.png | Bin .../main/resources/static/mstile-70x70.png | Bin .../static/pdfjs-legacy/cmaps/78-EUC-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/78-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/78-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/78-RKSJ-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/78-RKSJ-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/78-V.bcmap | Bin .../pdfjs-legacy/cmaps/78ms-RKSJ-H.bcmap | Bin .../pdfjs-legacy/cmaps/78ms-RKSJ-V.bcmap | Bin .../pdfjs-legacy/cmaps/83pv-RKSJ-H.bcmap | Bin .../pdfjs-legacy/cmaps/90ms-RKSJ-H.bcmap | Bin .../pdfjs-legacy/cmaps/90ms-RKSJ-V.bcmap | Bin .../pdfjs-legacy/cmaps/90msp-RKSJ-H.bcmap | Bin .../pdfjs-legacy/cmaps/90msp-RKSJ-V.bcmap | Bin .../pdfjs-legacy/cmaps/90pv-RKSJ-H.bcmap | Bin .../pdfjs-legacy/cmaps/90pv-RKSJ-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/Add-H.bcmap | Bin .../pdfjs-legacy/cmaps/Add-RKSJ-H.bcmap | Bin .../pdfjs-legacy/cmaps/Add-RKSJ-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/Add-V.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-0.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-1.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-2.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-3.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-4.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-5.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-6.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-UCS2.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-GB1-0.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-GB1-1.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-GB1-2.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-GB1-3.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-GB1-4.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-GB1-5.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-GB1-UCS2.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Japan1-0.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Japan1-1.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Japan1-2.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Japan1-3.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Japan1-4.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Japan1-5.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Japan1-6.bcmap | Bin .../cmaps/Adobe-Japan1-UCS2.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Korea1-0.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Korea1-1.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Korea1-2.bcmap | Bin .../cmaps/Adobe-Korea1-UCS2.bcmap | Bin .../static/pdfjs-legacy/cmaps/B5-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/B5-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/B5pc-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/B5pc-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/CNS-EUC-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/CNS-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/CNS1-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/CNS1-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/CNS2-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/CNS2-V.bcmap | 0 .../static/pdfjs-legacy/cmaps/ETHK-B5-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/ETHK-B5-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/ETen-B5-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/ETen-B5-V.bcmap | Bin .../pdfjs-legacy/cmaps/ETenms-B5-H.bcmap | 0 .../pdfjs-legacy/cmaps/ETenms-B5-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/EUC-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/Ext-H.bcmap | Bin .../pdfjs-legacy/cmaps/Ext-RKSJ-H.bcmap | Bin .../pdfjs-legacy/cmaps/Ext-RKSJ-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/Ext-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/GB-EUC-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/GB-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/GB-H.bcmap | 0 .../static/pdfjs-legacy/cmaps/GB-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBK-EUC-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBK-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBK2K-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBK2K-V.bcmap | Bin .../pdfjs-legacy/cmaps/GBKp-EUC-H.bcmap | Bin .../pdfjs-legacy/cmaps/GBKp-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBT-EUC-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBT-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBT-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBT-V.bcmap | Bin .../pdfjs-legacy/cmaps/GBTpc-EUC-H.bcmap | Bin .../pdfjs-legacy/cmaps/GBTpc-EUC-V.bcmap | Bin .../pdfjs-legacy/cmaps/GBpc-EUC-H.bcmap | Bin .../pdfjs-legacy/cmaps/GBpc-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/H.bcmap | Bin .../pdfjs-legacy/cmaps/HKdla-B5-H.bcmap | Bin .../pdfjs-legacy/cmaps/HKdla-B5-V.bcmap | Bin .../pdfjs-legacy/cmaps/HKdlb-B5-H.bcmap | Bin .../pdfjs-legacy/cmaps/HKdlb-B5-V.bcmap | Bin .../pdfjs-legacy/cmaps/HKgccs-B5-H.bcmap | Bin .../pdfjs-legacy/cmaps/HKgccs-B5-V.bcmap | Bin .../pdfjs-legacy/cmaps/HKm314-B5-H.bcmap | Bin .../pdfjs-legacy/cmaps/HKm314-B5-V.bcmap | Bin .../pdfjs-legacy/cmaps/HKm471-B5-H.bcmap | Bin .../pdfjs-legacy/cmaps/HKm471-B5-V.bcmap | Bin .../pdfjs-legacy/cmaps/HKscs-B5-H.bcmap | Bin .../pdfjs-legacy/cmaps/HKscs-B5-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/Hankaku.bcmap | Bin .../static/pdfjs-legacy/cmaps/Hiragana.bcmap | Bin .../static/pdfjs-legacy/cmaps/KSC-EUC-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/KSC-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/KSC-H.bcmap | Bin .../pdfjs-legacy/cmaps/KSC-Johab-H.bcmap | Bin .../pdfjs-legacy/cmaps/KSC-Johab-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/KSC-V.bcmap | Bin .../pdfjs-legacy/cmaps/KSCms-UHC-H.bcmap | Bin .../pdfjs-legacy/cmaps/KSCms-UHC-HW-H.bcmap | Bin .../pdfjs-legacy/cmaps/KSCms-UHC-HW-V.bcmap | Bin .../pdfjs-legacy/cmaps/KSCms-UHC-V.bcmap | Bin .../pdfjs-legacy/cmaps/KSCpc-EUC-H.bcmap | Bin .../pdfjs-legacy/cmaps/KSCpc-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/Katakana.bcmap | Bin .../static/pdfjs-legacy/cmaps/LICENSE | 0 .../static/pdfjs-legacy/cmaps/NWP-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/NWP-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/RKSJ-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/RKSJ-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/Roman.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UCS2-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UCS2-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UTF16-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UTF16-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UTF32-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UTF32-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UTF8-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UTF8-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UCS2-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UCS2-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UTF16-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UTF16-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UTF32-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UTF32-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UTF8-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UTF8-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UCS2-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UCS2-HW-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UCS2-HW-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UCS2-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UTF16-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UTF16-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UTF32-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UTF32-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UTF8-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UTF8-V.bcmap | Bin .../cmaps/UniJIS2004-UTF16-H.bcmap | Bin .../cmaps/UniJIS2004-UTF16-V.bcmap | Bin .../cmaps/UniJIS2004-UTF32-H.bcmap | Bin .../cmaps/UniJIS2004-UTF32-V.bcmap | Bin .../cmaps/UniJIS2004-UTF8-H.bcmap | Bin .../cmaps/UniJIS2004-UTF8-V.bcmap | Bin .../cmaps/UniJISPro-UCS2-HW-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniJISPro-UCS2-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniJISPro-UTF8-V.bcmap | Bin .../cmaps/UniJISX0213-UTF32-H.bcmap | Bin .../cmaps/UniJISX0213-UTF32-V.bcmap | Bin .../cmaps/UniJISX02132004-UTF32-H.bcmap | Bin .../cmaps/UniJISX02132004-UTF32-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UCS2-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UCS2-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UTF16-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UTF16-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UTF32-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UTF32-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UTF8-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UTF8-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/V.bcmap | Bin .../static/pdfjs-legacy/cmaps/WP-Symbol.bcmap | Bin .../static/pdfjs-legacy/css/debugger.css | 0 .../static/pdfjs-legacy/css/viewer-redact.css | 0 .../static/pdfjs-legacy/css/viewer.css | 0 .../static/pdfjs-legacy/example/Welcome.pdf | Bin .../pdfjs-legacy/example/Welcome_old.pdf | Bin .../pdfjs-legacy/images/altText_add.svg | 0 .../pdfjs-legacy/images/altText_done.svg | 0 .../pdfjs-legacy/images/annotation-check.svg | 0 .../images/annotation-comment.svg | 0 .../pdfjs-legacy/images/annotation-help.svg | 0 .../pdfjs-legacy/images/annotation-insert.svg | 0 .../pdfjs-legacy/images/annotation-key.svg | 0 .../images/annotation-newparagraph.svg | 0 .../pdfjs-legacy/images/annotation-noicon.svg | 0 .../pdfjs-legacy/images/annotation-note.svg | 0 .../images/annotation-paperclip.svg | 0 .../images/annotation-paragraph.svg | 0 .../images/annotation-pushpin.svg | 0 .../images/cursor-editorFreeHighlight.svg | 0 .../images/cursor-editorFreeText.svg | 0 .../pdfjs-legacy/images/cursor-editorInk.svg | 0 .../images/cursor-editorTextHighlight.svg | 0 .../images/editor-toolbar-delete.svg | 0 .../images/findbarButton-next.svg | 0 .../images/findbarButton-previous.svg | 0 .../images/gv-toolbarButton-download.svg | 0 .../pdfjs-legacy/images/loading-icon.gif | Bin .../static/pdfjs-legacy/images/loading.svg | 0 ...ondaryToolbarButton-documentProperties.svg | 0 .../secondaryToolbarButton-firstPage.svg | 0 .../secondaryToolbarButton-handTool.svg | 0 .../secondaryToolbarButton-lastPage.svg | 0 .../secondaryToolbarButton-rotateCcw.svg | 0 .../secondaryToolbarButton-rotateCw.svg | 0 ...econdaryToolbarButton-scrollHorizontal.svg | 0 .../secondaryToolbarButton-scrollPage.svg | 0 .../secondaryToolbarButton-scrollVertical.svg | 0 .../secondaryToolbarButton-scrollWrapped.svg | 0 .../secondaryToolbarButton-selectTool.svg | 0 .../secondaryToolbarButton-spreadEven.svg | 0 .../secondaryToolbarButton-spreadNone.svg | 0 .../secondaryToolbarButton-spreadOdd.svg | 0 .../images/toolbarButton-bookmark.svg | 0 .../toolbarButton-currentOutlineItem.svg | 0 .../images/toolbarButton-download.svg | 0 .../images/toolbarButton-editorFreeText.svg | 0 .../images/toolbarButton-editorHighlight.svg | 0 .../images/toolbarButton-editorInk.svg | 0 .../images/toolbarButton-editorStamp.svg | 0 .../images/toolbarButton-home.svg | 0 .../images/toolbarButton-menuArrow.svg | 0 .../images/toolbarButton-openFile.svg | 0 .../images/toolbarButton-pageDown.svg | 0 .../images/toolbarButton-pageUp.svg | 0 .../images/toolbarButton-presentationMode.svg | 0 .../images/toolbarButton-print.svg | 0 .../images/toolbarButton-search.svg | 0 .../toolbarButton-secondaryToolbarToggle.svg | 0 .../images/toolbarButton-sidebarToggle.svg | 0 .../images/toolbarButton-viewAttachments.svg | 0 .../images/toolbarButton-viewLayers.svg | 0 .../images/toolbarButton-viewOutline.svg | 0 .../images/toolbarButton-viewThumbnail.svg | 0 .../images/toolbarButton-zoomIn.svg | 0 .../images/toolbarButton-zoomOut.svg | 0 .../images/treeitem-collapsed.svg | 0 .../pdfjs-legacy/images/treeitem-expanded.svg | 0 .../static/pdfjs-legacy/js/viewer.mjs | 0 .../static/pdfjs-legacy/js/viewer.mjs.map | 0 .../static/pdfjs-legacy/locale/ach/viewer.ftl | 0 .../static/pdfjs-legacy/locale/af/viewer.ftl | 0 .../static/pdfjs-legacy/locale/an/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ar/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ast/viewer.ftl | 0 .../static/pdfjs-legacy/locale/az/viewer.ftl | 0 .../static/pdfjs-legacy/locale/be/viewer.ftl | 0 .../static/pdfjs-legacy/locale/bg/viewer.ftl | 0 .../static/pdfjs-legacy/locale/bn/viewer.ftl | 0 .../static/pdfjs-legacy/locale/bo/viewer.ftl | 0 .../static/pdfjs-legacy/locale/br/viewer.ftl | 0 .../static/pdfjs-legacy/locale/brx/viewer.ftl | 0 .../static/pdfjs-legacy/locale/bs/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ca/viewer.ftl | 0 .../static/pdfjs-legacy/locale/cak/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ckb/viewer.ftl | 0 .../static/pdfjs-legacy/locale/cs/viewer.ftl | 0 .../static/pdfjs-legacy/locale/cy/viewer.ftl | 0 .../static/pdfjs-legacy/locale/da/viewer.ftl | 0 .../static/pdfjs-legacy/locale/de/viewer.ftl | 0 .../static/pdfjs-legacy/locale/dsb/viewer.ftl | 0 .../static/pdfjs-legacy/locale/el/viewer.ftl | 0 .../pdfjs-legacy/locale/en-CA/viewer.ftl | 0 .../pdfjs-legacy/locale/en-GB/viewer.ftl | 0 .../pdfjs-legacy/locale/en-US/viewer.ftl | 0 .../static/pdfjs-legacy/locale/eo/viewer.ftl | 0 .../pdfjs-legacy/locale/es-AR/viewer.ftl | 0 .../pdfjs-legacy/locale/es-CL/viewer.ftl | 0 .../pdfjs-legacy/locale/es-ES/viewer.ftl | 0 .../pdfjs-legacy/locale/es-MX/viewer.ftl | 0 .../static/pdfjs-legacy/locale/et/viewer.ftl | 0 .../static/pdfjs-legacy/locale/eu/viewer.ftl | 0 .../static/pdfjs-legacy/locale/fa/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ff/viewer.ftl | 0 .../static/pdfjs-legacy/locale/fi/viewer.ftl | 0 .../static/pdfjs-legacy/locale/fr/viewer.ftl | 0 .../static/pdfjs-legacy/locale/fur/viewer.ftl | 0 .../pdfjs-legacy/locale/fy-NL/viewer.ftl | 0 .../pdfjs-legacy/locale/ga-IE/viewer.ftl | 0 .../static/pdfjs-legacy/locale/gd/viewer.ftl | 0 .../static/pdfjs-legacy/locale/gl/viewer.ftl | 0 .../static/pdfjs-legacy/locale/gn/viewer.ftl | 0 .../pdfjs-legacy/locale/gu-IN/viewer.ftl | 0 .../static/pdfjs-legacy/locale/he/viewer.ftl | 0 .../pdfjs-legacy/locale/hi-IN/viewer.ftl | 0 .../static/pdfjs-legacy/locale/hr/viewer.ftl | 0 .../static/pdfjs-legacy/locale/hsb/viewer.ftl | 0 .../static/pdfjs-legacy/locale/hu/viewer.ftl | 0 .../pdfjs-legacy/locale/hy-AM/viewer.ftl | 0 .../static/pdfjs-legacy/locale/hye/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ia/viewer.ftl | 0 .../static/pdfjs-legacy/locale/id/viewer.ftl | 0 .../static/pdfjs-legacy/locale/is/viewer.ftl | 0 .../static/pdfjs-legacy/locale/it/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ja/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ka/viewer.ftl | 0 .../static/pdfjs-legacy/locale/kab/viewer.ftl | 0 .../static/pdfjs-legacy/locale/kk/viewer.ftl | 0 .../static/pdfjs-legacy/locale/km/viewer.ftl | 0 .../static/pdfjs-legacy/locale/kn/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ko/viewer.ftl | 0 .../static/pdfjs-legacy/locale/lij/viewer.ftl | 0 .../static/pdfjs-legacy/locale/lo/viewer.ftl | 0 .../static/pdfjs-legacy/locale/locale.json | 0 .../static/pdfjs-legacy/locale/lt/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ltg/viewer.ftl | 0 .../static/pdfjs-legacy/locale/lv/viewer.ftl | 0 .../static/pdfjs-legacy/locale/meh/viewer.ftl | 0 .../static/pdfjs-legacy/locale/mk/viewer.ftl | 0 .../static/pdfjs-legacy/locale/mr/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ms/viewer.ftl | 0 .../static/pdfjs-legacy/locale/my/viewer.ftl | 0 .../pdfjs-legacy/locale/nb-NO/viewer.ftl | 0 .../pdfjs-legacy/locale/ne-NP/viewer.ftl | 0 .../static/pdfjs-legacy/locale/nl/viewer.ftl | 0 .../pdfjs-legacy/locale/nn-NO/viewer.ftl | 0 .../static/pdfjs-legacy/locale/oc/viewer.ftl | 0 .../pdfjs-legacy/locale/pa-IN/viewer.ftl | 0 .../static/pdfjs-legacy/locale/pl/viewer.ftl | 0 .../pdfjs-legacy/locale/pt-BR/viewer.ftl | 0 .../pdfjs-legacy/locale/pt-PT/viewer.ftl | 0 .../static/pdfjs-legacy/locale/rm/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ro/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ru/viewer.ftl | 0 .../static/pdfjs-legacy/locale/sat/viewer.ftl | 0 .../static/pdfjs-legacy/locale/sc/viewer.ftl | 0 .../static/pdfjs-legacy/locale/scn/viewer.ftl | 0 .../static/pdfjs-legacy/locale/sco/viewer.ftl | 0 .../static/pdfjs-legacy/locale/si/viewer.ftl | 0 .../static/pdfjs-legacy/locale/sk/viewer.ftl | 0 .../static/pdfjs-legacy/locale/skr/viewer.ftl | 0 .../static/pdfjs-legacy/locale/sl/viewer.ftl | 0 .../static/pdfjs-legacy/locale/son/viewer.ftl | 0 .../static/pdfjs-legacy/locale/sq/viewer.ftl | 0 .../static/pdfjs-legacy/locale/sr/viewer.ftl | 0 .../pdfjs-legacy/locale/sv-SE/viewer.ftl | 0 .../static/pdfjs-legacy/locale/szl/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ta/viewer.ftl | 0 .../static/pdfjs-legacy/locale/te/viewer.ftl | 0 .../static/pdfjs-legacy/locale/tg/viewer.ftl | 0 .../static/pdfjs-legacy/locale/th/viewer.ftl | 0 .../static/pdfjs-legacy/locale/tl/viewer.ftl | 0 .../static/pdfjs-legacy/locale/tr/viewer.ftl | 0 .../static/pdfjs-legacy/locale/trs/viewer.ftl | 0 .../static/pdfjs-legacy/locale/uk/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ur/viewer.ftl | 0 .../static/pdfjs-legacy/locale/uz/viewer.ftl | 0 .../static/pdfjs-legacy/locale/vi/viewer.ftl | 0 .../static/pdfjs-legacy/locale/wo/viewer.ftl | 0 .../static/pdfjs-legacy/locale/xh/viewer.ftl | 0 .../pdfjs-legacy/locale/zh-CN/viewer.ftl | 0 .../pdfjs-legacy/locale/zh-TW/viewer.ftl | 0 .../resources/static/pdfjs-legacy/pdf.mjs | 0 .../resources/static/pdfjs-legacy/pdf.mjs.map | 0 .../static/pdfjs-legacy/pdf.sandbox.mjs | 0 .../static/pdfjs-legacy/pdf.sandbox.mjs.map | 0 .../static/pdfjs-legacy/pdf.worker.entry.js | 0 .../static/pdfjs-legacy/pdf.worker.mjs | 0 .../static/pdfjs-legacy/pdf.worker.mjs.map | 0 .../standard_fonts/FoxitDingbats.pfb | Bin .../standard_fonts/FoxitFixed.pfb | Bin .../standard_fonts/FoxitFixedBold.pfb | Bin .../standard_fonts/FoxitFixedBoldItalic.pfb | Bin .../standard_fonts/FoxitFixedItalic.pfb | Bin .../standard_fonts/FoxitSerif.pfb | Bin .../standard_fonts/FoxitSerifBold.pfb | Bin .../standard_fonts/FoxitSerifBoldItalic.pfb | Bin .../standard_fonts/FoxitSerifItalic.pfb | Bin .../standard_fonts/FoxitSymbol.pfb | Bin .../pdfjs-legacy/standard_fonts/LICENSE_FOXIT | 0 .../standard_fonts/LICENSE_LIBERATION | 0 .../standard_fonts/LiberationSans-Bold.ttf | Bin .../LiberationSans-BoldItalic.ttf | Bin .../standard_fonts/LiberationSans-Italic.ttf | Bin .../standard_fonts/LiberationSans-Regular.ttf | Bin .../src}/main/resources/static/rainbow.svg | 0 .../resources/static/safari-pinned-tab.svg | 0 .../main/resources/static/site.webmanifest | 0 .../src}/main/resources/static/sun.svg | 0 .../src}/main/resources/templates/about.html | 0 .../main/resources/templates/account.html | 0 .../resources/templates/adminSettings.html | 0 .../resources/templates/auto-split-pdf.html | 0 .../resources/templates/change-creds.html | 0 .../templates/convert/eml-to-pdf.html | 0 .../templates/convert/file-to-pdf.html | 0 .../templates/convert/html-to-pdf.html | 0 .../templates/convert/img-to-pdf.html | 0 .../templates/convert/markdown-to-pdf.html | 0 .../templates/convert/pdf-to-csv.html | 0 .../templates/convert/pdf-to-html.html | 0 .../templates/convert/pdf-to-img.html | 0 .../templates/convert/pdf-to-markdown.html | 0 .../templates/convert/pdf-to-pdfa.html | 0 .../convert/pdf-to-presentation.html | 0 .../templates/convert/pdf-to-text.html | 0 .../templates/convert/pdf-to-word.html | 0 .../templates/convert/pdf-to-xml.html | 0 .../templates/convert/url-to-pdf.html | 0 .../src}/main/resources/templates/crop.html | 0 .../main/resources/templates/database.html | 0 .../src}/main/resources/templates/error.html | 0 .../resources/templates/extract-page.html | 0 .../resources/templates/fragments/card.html | 0 .../resources/templates/fragments/common.html | 1 - .../templates/fragments/errorBanner.html | 0 .../fragments/errorBannerPerPage.html | 0 .../fragments/featureGroupHeader.html | 0 .../fragments/featureGroupHeaderLegacy.html | 6 + .../resources/templates/fragments/footer.html | 0 .../templates/fragments/languageEntry.html | 0 .../templates/fragments/languages.html | 0 .../templates/fragments/multi-toolAdvert.html | 0 .../templates/fragments/navElements.html | 0 .../resources/templates/fragments/navbar.html | 0 .../templates/fragments/navbarEntry.html | 14 +- .../fragments/navbarEntryCustom.html | 0 .../main/resources/templates/home-legacy.html | 528 ++++++++++++++++++ .../src}/main/resources/templates/home.html | 0 .../main/resources/templates/licenses.html | 0 .../src}/main/resources/templates/login.html | 0 .../main/resources/templates/merge-pdfs.html | 0 .../resources/templates/misc/add-image.html | 0 .../templates/misc/add-page-numbers.html | 0 .../templates/misc/adjust-contrast.html | 0 .../resources/templates/misc/auto-crop.html | 0 .../resources/templates/misc/auto-rename.html | 0 .../templates/misc/change-metadata.html | 0 .../resources/templates/misc/compare.html | 0 .../templates/misc/compress-pdf.html | 0 .../templates/misc/extract-image-scans.html | 0 .../templates/misc/extract-images.html | 0 .../resources/templates/misc/fake-scan.html | 0 .../resources/templates/misc/flatten.html | 0 .../resources/templates/misc/ocr-pdf.html | 0 .../resources/templates/misc/print-file.html | 0 .../templates/misc/remove-annotations.html | 0 .../templates/misc/remove-blanks.html | 0 .../main/resources/templates/misc/repair.html | 0 .../templates/misc/replace-color.html | 0 .../templates/misc/show-javascript.html | 0 .../main/resources/templates/misc/stamp.html | 0 .../templates/misc/unlock-pdf-forms.html | 0 .../templates/multi-page-layout.html | 0 .../main/resources/templates/multi-tool.html | 0 .../main/resources/templates/overlay-pdf.html | 0 .../resources/templates/pdf-organizer.html | 0 .../templates/pdf-to-single-page.html | 0 .../main/resources/templates/pipeline.html | 0 .../main/resources/templates/releases.html | 0 .../resources/templates/remove-image-pdf.html | 0 .../resources/templates/remove-pages.html | 0 .../main/resources/templates/rotate-pdf.html | 0 .../main/resources/templates/scale-pages.html | 0 .../templates/security/add-password.html | 0 .../templates/security/add-watermark.html | 0 .../templates/security/auto-redact.html | 0 .../templates/security/cert-sign.html | 0 .../security/change-permissions.html | 0 .../templates/security/get-info-on-pdf.html | 0 .../resources/templates/security/redact.html | 0 .../templates/security/remove-cert-sign.html | 0 .../templates/security/remove-password.html | 0 .../templates/security/remove-watermark.html | 0 .../templates/security/sanitize-pdf.html | 0 .../security/validate-signature.html | 0 .../src}/main/resources/templates/sign.html | 0 .../templates/split-by-size-or-count.html | 0 .../templates/split-pdf-by-chapters.html | 0 .../templates/split-pdf-by-sections.html | 0 .../main/resources/templates/split-pdfs.html | 0 .../src}/main/resources/templates/usage.html | 0 .../main/resources/templates/view-pdf.html | 0 .../software/SPDF/SPDFApplicationTest.java | 0 .../api/RearrangePagesPDFControllerTest.java | 0 .../api/RotationControllerTest.java | 0 .../converters/ConvertWebsiteToPdfTest.java | 0 .../api/pipeline/PipelineProcessorTest.java | 19 +- .../web/UploadLimitServiceTest.java | 0 .../CertificateValidationServiceTest.java | 0 .../service/LanguageServiceBasicTest.java | 0 .../SPDF/service/LanguageServiceTest.java | 0 .../service/PdfImageRemovalServiceTest.java | 0 .../service/PdfMetadataServiceBasicTest.java | 0 .../SPDF/service/PdfMetadataServiceTest.java | 0 .../SPDF/service/SignatureServiceTest.java | 2 +- testing/test.sh | 2 +- 921 files changed, 2480 insertions(+), 7648 deletions(-) create mode 100644 common/src/main/java/stirling/software/common/util/ValidationUtil.java rename {src/main/java/stirling/software/SPDF/EE => proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee}/EEAppConfig.java (95%) rename {src/main/java/stirling/software/SPDF/EE => proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee}/KeygenLicenseVerifier.java (99%) rename {src/main/java/stirling/software/SPDF/EE => proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee}/LicenseKeyChecker.java (95%) rename {src/test/java/stirling/software/SPDF/EE => proprietary/src/test/java/stirling/software/proprietary/security/configuration/ee}/LicenseKeyCheckerTest.java (87%) delete mode 100644 src/main/java/stirling/software/SPDF/model/api/Email.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/GeneralFile.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/security/RedactionArea.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/user/Username.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java create mode 100644 stirling-pdf/.gitignore create mode 100644 stirling-pdf/build.gradle rename {src => stirling-pdf/src}/main/java/org/apache/pdfbox/examples/signature/CMSProcessableInputStream.java (100%) rename {src => stirling-pdf/src}/main/java/org/apache/pdfbox/examples/signature/CreateSignatureBase.java (100%) rename {src => stirling-pdf/src}/main/java/org/apache/pdfbox/examples/signature/TSAClient.java (100%) rename {src => stirling-pdf/src}/main/java/org/apache/pdfbox/examples/signature/ValidationTimeStamp.java (100%) rename {src => stirling-pdf/src}/main/java/org/apache/pdfbox/examples/util/ConnectedInputStream.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/Factories/ReplaceAndInvertColorFactory.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/LibreOfficeListener.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/SPDFApplication.java (91%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/UI/WebBrowser.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/AppUpdateService.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java (75%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/EndpointConfiguration.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/EndpointInspector.java (96%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/EndpointInterceptor.java (93%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java (75%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/InitialSetup.java (98%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/LocaleConfiguration.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/LogbackPropertyLoader.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/MetricsConfig.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/MetricsFilter.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/OpenApiConfig.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/StartupApplicationListener.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/WebMvcConfig.java (76%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/fingerprint/FingerprintBasedSessionFilter.java (97%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/fingerprint/FingerprintBasedSessionManager.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/fingerprint/FingerprintGenerator.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/AnalysisController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/CropController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/MergeController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/RotationController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/SettingsController.java (90%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertEmlToPDF.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java (98%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToHtml.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java (99%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/DecompressPdfController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/FakeScanController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/PrintFileController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/StampController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/UnlockPDFFormsController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java (99%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java (99%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/RedactController.java (98%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/RemoveCertSignController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/ValidateSignatureController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/HomeWebController.java (96%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/MetricsController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/OtherWebController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/SecurityWebController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/SignatureController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/UploadLimitService.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/ApiEndpoint.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/Dependency.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/PDFText.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/PipelineConfig.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/PipelineOperation.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/PipelineResult.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/SignatureFile.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/SortTypes.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/ImageFile.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/PDFComparison.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/PDFExtractImagesRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/PDFWithImageFormatRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/PDFWithPageSize.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/SplitPdfByChaptersRequest.java (99%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/SplitPdfBySectionsRequest.java (99%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/ConvertPDFToMarkdown.java (100%) create mode 100644 stirling-pdf/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/ConvertToPdfRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/PdfToPdfARequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/UrlToPdfRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java (71%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java (70%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java (71%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java (60%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java (100%) create mode 100644 stirling-pdf/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/general/SplitPdfBySizeOrCountRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java (100%) create mode 100644 stirling-pdf/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/ExtractImageScansRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/FakeScanRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java (100%) create mode 100644 stirling-pdf/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/PrintFileRequest.java (99%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/ReplaceAndInvertColorRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java (61%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/security/ManualRedactPdfRequest.java (51%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java (100%) create mode 100644 stirling-pdf/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java create mode 100644 stirling-pdf/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/security/SignatureValidationRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/security/SignatureValidationResult.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/pdf/FlexibleCSVWriter.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/pdf/TextFinder.java (100%) rename {src/main/java/stirling/software/SPDF/controller/api/pipeline => stirling-pdf/src/main/java/stirling/software/SPDF/service}/ApiDocService.java (99%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/service/CertificateValidationService.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/service/LanguageService.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/service/MetricsAggregatorService.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/service/PdfImageRemovalService.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/service/SignatureService.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/service/misc/ReplaceAndInvertColorService.java (100%) rename {src => stirling-pdf/src}/main/resources/application.properties (86%) rename {src => stirling-pdf/src}/main/resources/banner.txt (100%) rename {src => stirling-pdf/src}/main/resources/certdata.txt (100%) rename {src => stirling-pdf/src}/main/resources/logback.xml (97%) rename {src => stirling-pdf/src}/main/resources/messages.properties (100%) rename {src => stirling-pdf/src}/main/resources/messages_ar_AR.properties (95%) rename {src => stirling-pdf/src}/main/resources/messages_az_AZ.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_bg_BG.properties (96%) rename {src => stirling-pdf/src}/main/resources/messages_ca_CA.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_cs_CZ.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_da_DK.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_de_DE.properties (100%) rename {src => stirling-pdf/src}/main/resources/messages_el_GR.properties (100%) rename {src => stirling-pdf/src}/main/resources/messages_en_GB.properties (93%) rename {src => stirling-pdf/src}/main/resources/messages_en_US.properties (93%) rename {src => stirling-pdf/src}/main/resources/messages_es_ES.properties (93%) rename {src => stirling-pdf/src}/main/resources/messages_eu_ES.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_fa_IR.properties (95%) rename {src => stirling-pdf/src}/main/resources/messages_fr_FR.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_ga_IE.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_hi_IN.properties (96%) rename {src => stirling-pdf/src}/main/resources/messages_hr_HR.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_hu_HU.properties (100%) rename {src => stirling-pdf/src}/main/resources/messages_id_ID.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_it_IT.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_ja_JP.properties (100%) rename {src => stirling-pdf/src}/main/resources/messages_ko_KR.properties (94%) rename src/main/resources/messages_ml_IN.properties => stirling-pdf/src/main/resources/messages_ml_ML.properties (97%) rename {src => stirling-pdf/src}/main/resources/messages_nl_NL.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_no_NB.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_pl_PL.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_pt_BR.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_pt_PT.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_ro_RO.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_ru_RU.properties (88%) rename {src => stirling-pdf/src}/main/resources/messages_sk_SK.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_sl_SI.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_sr_LATN_RS.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_sv_SE.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_th_TH.properties (96%) rename {src => stirling-pdf/src}/main/resources/messages_tr_TR.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_uk_UA.properties (89%) rename {src => stirling-pdf/src}/main/resources/messages_vi_VN.properties (94%) rename src/main/resources/messages_bo_CN.properties => stirling-pdf/src/main/resources/messages_zh_BO.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_zh_CN.properties (86%) rename {src => stirling-pdf/src}/main/resources/messages_zh_TW.properties (93%) rename {src => stirling-pdf/src}/main/resources/settings.yml.template (95%) rename {src => stirling-pdf/src}/main/resources/static/3rdPartyLicenses.json (93%) rename {src => stirling-pdf/src}/main/resources/static/android-chrome-192x192.png (100%) rename {src => stirling-pdf/src}/main/resources/static/android-chrome-512x512.png (100%) rename {src => stirling-pdf/src}/main/resources/static/apple-touch-icon.png (100%) rename {src => stirling-pdf/src}/main/resources/static/browserconfig.xml (100%) rename {src => stirling-pdf/src}/main/resources/static/css/account.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/add-image.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/bootstrap-icons.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/bootstrap-icons.min.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/bootstrap.min.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/bootstrap.min.css.map (100%) rename {src => stirling-pdf/src}/main/resources/static/css/cookieconsent.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/cookieconsentCustomisation.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/dragdrop.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/error.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/errorBanner.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/fileSelect.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/fonts/bootstrap-icons.woff (100%) rename {src => stirling-pdf/src}/main/resources/static/css/fonts/bootstrap-icons.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/css/footer.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/game.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/general.css (100%) create mode 100644 stirling-pdf/src/main/resources/static/css/home-legacy.css rename {src => stirling-pdf/src}/main/resources/static/css/home.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/imageHighlighter.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/licenses.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/login.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/merge.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/multi-tool.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/navbar.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/pdfActions.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/pipeline.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/prism.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/rainbow-mode.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/redact.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/removeImage.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/rotate-pdf.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/sign.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/split-pdf-by-sections.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/stamp.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/tab-container.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/theme/componentes.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/theme/font.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/theme/theme.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/theme/theme.dark.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/theme/theme.light.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/usage.css (100%) rename {src => stirling-pdf/src}/main/resources/static/favicon-16x16.png (100%) rename {src => stirling-pdf/src}/main/resources/static/favicon-32x32.png (100%) rename {src => stirling-pdf/src}/main/resources/static/favicon.icns (100%) rename {src => stirling-pdf/src}/main/resources/static/favicon.ico (100%) rename {src => stirling-pdf/src}/main/resources/static/favicon.png (100%) rename {src => stirling-pdf/src}/main/resources/static/favicon.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/files/Auto Splitter Divider (with instructions).pdf (100%) rename {src => stirling-pdf/src}/main/resources/static/files/popularity.txt (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/Arimo-Regular.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/DancingScript-Regular.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/Estonia.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/IndieFlower-Regular.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/Meiryo.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/NotoSans-Regular.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/NotoSansArabic-Regular.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/NotoSansJP-Regular.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/NotoSansSC-Regular.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/SimSun.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/Tangerine.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/Tinos-Regular.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/google-symbol.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/malgun.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/static/NotoSansArabic-Regular.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/static/NotoSansJP-Regular.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/images/Files.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/arrow-right-short.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/book.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/clipboard.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/discord.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/docker.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/file-earmark-pdf.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/github.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/google-drive.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/redact-auto.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/redact-manual.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/rename.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/signature.png (100%) rename {src => stirling-pdf/src}/main/resources/static/images/split-auto.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/split-chapters.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/split-size.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/update.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/js/DecryptFiles.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/cacheFormInputs.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/compare/diff.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/compare/pdfWorker.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/csrf.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/darkmode.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/download.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/downloader.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/draggable-utils.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/errorBanner.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/favourites.js (96%) rename {src => stirling-pdf/src}/main/resources/static/js/fetch-utils.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/file-icon-factory.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/file-utils.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/fileInput.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/game.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/githubVersion.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/googleFilePicker.js (100%) create mode 100644 stirling-pdf/src/main/resources/static/js/homecard-legacy.js rename {src => stirling-pdf/src}/main/resources/static/js/homecard.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/languageSelection.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/local-pdf-input-download.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/merge.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/DragDropManager.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/ImageHighlighter.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/PdfActionsManager.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/PdfContainer.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/UndoManager.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/add-page.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/command.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/commands-sequence.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/delete-page.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/move-page.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/page-break.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/remove.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/rotate.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/select.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/split.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/navbar.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/pages/add-image.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/pages/adjust-contrast.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/pages/change-metadata.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/pages/crop.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/pages/home.js (96%) rename {src => stirling-pdf/src}/main/resources/static/js/pages/pdf-to-csv.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/pages/sign.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/pipeline.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/redact.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/search.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/settings.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/sign/signature-canvas.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/tab-container.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/bootstrap.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/bootstrap.min.js.map (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/chart.umd.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/cookieconsent-config.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/cookieconsent.umd.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/fontfaceobserver.standalone.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/interact.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/interact.min.js.map (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/jquery.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/jquery.validate.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/jszip.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/pdf-lib.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/pdf-lib.min.js.map (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/popper.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/popper.min.js.map (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/prism.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/signature_pad.umd.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/signature_pad.umd.min.js.map (100%) rename {src => stirling-pdf/src}/main/resources/static/js/usage.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/uuid.js (100%) rename {src => stirling-pdf/src}/main/resources/static/manifest.json (100%) rename {src => stirling-pdf/src}/main/resources/static/moon.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/mstile-144x144.png (100%) rename {src => stirling-pdf/src}/main/resources/static/mstile-150x150.png (100%) rename {src => stirling-pdf/src}/main/resources/static/mstile-310x150.png (100%) rename {src => stirling-pdf/src}/main/resources/static/mstile-310x310.png (100%) rename {src => stirling-pdf/src}/main/resources/static/mstile-70x70.png (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78-RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78ms-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78ms-RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/83pv-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/90ms-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/90ms-RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/90msp-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/90msp-RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/90pv-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/90pv-RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Add-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Add-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Add-RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Add-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-0.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-1.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-3.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-4.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-5.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-6.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-UCS2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-GB1-0.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-GB1-1.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-GB1-2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-GB1-3.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-GB1-4.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-GB1-5.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-GB1-UCS2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-0.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-1.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-3.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-4.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-5.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-6.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-UCS2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Korea1-0.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Korea1-1.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Korea1-2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Korea1-UCS2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/B5pc-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/B5pc-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/CNS-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/CNS-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/CNS1-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/CNS1-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/CNS2-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/CNS2-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/ETHK-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/ETHK-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/ETen-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/ETen-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/ETenms-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/ETenms-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Ext-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Ext-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Ext-RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Ext-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GB-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GB-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GB-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GB-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBK-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBK-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBK2K-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBK2K-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBKp-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBKp-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBT-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBT-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBT-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBT-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBTpc-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBTpc-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBpc-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBpc-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKdla-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKdla-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKdlb-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKdlb-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKgccs-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKgccs-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKm314-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKm314-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKm471-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKm471-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKscs-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKscs-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Hankaku.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Hiragana.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSC-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSC-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSC-Johab-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSC-Johab-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSCms-UHC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSCms-UHC-HW-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSCms-UHC-HW-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSCms-UHC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSCpc-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSCpc-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Katakana.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/LICENSE (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/NWP-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/NWP-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Roman.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UCS2-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UCS2-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UTF16-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UTF16-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UTF32-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UTF32-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UTF8-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UTF8-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UCS2-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UCS2-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UTF16-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UTF16-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UTF32-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UTF32-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UTF8-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UTF8-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UCS2-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UCS2-HW-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UCS2-HW-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UCS2-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UTF16-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UTF16-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UTF32-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UTF32-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UTF8-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UTF8-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS2004-UTF16-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS2004-UTF16-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS2004-UTF32-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS2004-UTF32-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS2004-UTF8-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS2004-UTF8-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJISPro-UCS2-HW-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJISPro-UCS2-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJISPro-UTF8-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJISX0213-UTF32-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJISX0213-UTF32-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJISX02132004-UTF32-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJISX02132004-UTF32-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UCS2-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UCS2-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UTF16-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UTF16-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UTF32-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UTF32-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UTF8-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UTF8-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/WP-Symbol.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/css/debugger.css (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/css/viewer-redact.css (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/css/viewer.css (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/example/Welcome.pdf (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/example/Welcome_old.pdf (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/altText_add.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/altText_done.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-check.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-comment.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-help.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-insert.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-key.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-newparagraph.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-noicon.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-note.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-paperclip.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-paragraph.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-pushpin.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/cursor-editorFreeHighlight.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/cursor-editorFreeText.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/cursor-editorInk.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/cursor-editorTextHighlight.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/editor-toolbar-delete.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/findbarButton-next.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/findbarButton-previous.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/gv-toolbarButton-download.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/loading-icon.gif (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/loading.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-documentProperties.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-firstPage.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-handTool.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-lastPage.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-rotateCcw.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-rotateCw.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-scrollHorizontal.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-scrollPage.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-scrollVertical.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-scrollWrapped.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-selectTool.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-spreadEven.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-spreadNone.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-spreadOdd.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-bookmark.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-currentOutlineItem.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-download.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-editorFreeText.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-editorHighlight.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-editorInk.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-editorStamp.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-home.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-menuArrow.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-openFile.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-pageDown.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-pageUp.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-presentationMode.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-print.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-search.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-secondaryToolbarToggle.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-sidebarToggle.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-viewAttachments.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-viewLayers.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-viewOutline.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-viewThumbnail.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-zoomIn.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-zoomOut.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/treeitem-collapsed.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/treeitem-expanded.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/js/viewer.mjs (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/js/viewer.mjs.map (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ach/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/af/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/an/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ar/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ast/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/az/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/be/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/bg/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/bn/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/bo/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/br/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/brx/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/bs/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ca/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/cak/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ckb/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/cs/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/cy/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/da/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/de/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/dsb/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/el/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/en-CA/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/en-GB/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/en-US/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/eo/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/es-AR/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/es-CL/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/es-ES/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/es-MX/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/et/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/eu/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/fa/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ff/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/fi/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/fr/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/fur/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/fy-NL/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ga-IE/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/gd/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/gl/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/gn/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/gu-IN/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/he/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/hi-IN/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/hr/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/hsb/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/hu/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/hy-AM/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/hye/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ia/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/id/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/is/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/it/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ja/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ka/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/kab/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/kk/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/km/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/kn/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ko/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/lij/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/lo/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/locale.json (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/lt/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ltg/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/lv/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/meh/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/mk/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/mr/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ms/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/my/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/nb-NO/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ne-NP/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/nl/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/nn-NO/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/oc/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/pa-IN/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/pl/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/pt-BR/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/pt-PT/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/rm/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ro/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ru/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sat/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sc/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/scn/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sco/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/si/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sk/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/skr/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sl/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/son/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sq/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sr/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sv-SE/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/szl/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ta/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/te/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/tg/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/th/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/tl/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/tr/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/trs/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/uk/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ur/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/uz/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/vi/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/wo/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/xh/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/zh-CN/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/zh-TW/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/pdf.mjs (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/pdf.mjs.map (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/pdf.sandbox.mjs (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/pdf.sandbox.mjs.map (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/pdf.worker.entry.js (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/pdf.worker.mjs (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/pdf.worker.mjs.map (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitDingbats.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitFixed.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitFixedBold.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitFixedBoldItalic.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitFixedItalic.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitSerif.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitSerifBold.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitSerifBoldItalic.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitSerifItalic.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitSymbol.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/LICENSE_FOXIT (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/LICENSE_LIBERATION (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/LiberationSans-Bold.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/LiberationSans-BoldItalic.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/LiberationSans-Italic.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/LiberationSans-Regular.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/rainbow.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/safari-pinned-tab.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/site.webmanifest (100%) rename {src => stirling-pdf/src}/main/resources/static/sun.svg (100%) rename {src => stirling-pdf/src}/main/resources/templates/about.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/account.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/adminSettings.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/auto-split-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/change-creds.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/eml-to-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/file-to-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/html-to-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/img-to-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/markdown-to-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-csv.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-html.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-img.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-markdown.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-pdfa.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-presentation.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-text.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-word.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-xml.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/url-to-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/crop.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/database.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/error.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/extract-page.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/card.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/common.html (99%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/errorBanner.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/errorBannerPerPage.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/featureGroupHeader.html (100%) create mode 100644 stirling-pdf/src/main/resources/templates/fragments/featureGroupHeaderLegacy.html rename {src => stirling-pdf/src}/main/resources/templates/fragments/footer.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/languageEntry.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/languages.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/multi-toolAdvert.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/navElements.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/navbar.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/navbarEntry.html (64%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/navbarEntryCustom.html (100%) create mode 100644 stirling-pdf/src/main/resources/templates/home-legacy.html rename {src => stirling-pdf/src}/main/resources/templates/home.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/licenses.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/login.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/merge-pdfs.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/add-image.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/add-page-numbers.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/adjust-contrast.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/auto-crop.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/auto-rename.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/change-metadata.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/compare.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/compress-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/extract-image-scans.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/extract-images.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/fake-scan.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/flatten.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/ocr-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/print-file.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/remove-annotations.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/remove-blanks.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/repair.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/replace-color.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/show-javascript.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/stamp.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/unlock-pdf-forms.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/multi-page-layout.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/multi-tool.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/overlay-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/pdf-organizer.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/pdf-to-single-page.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/pipeline.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/releases.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/remove-image-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/remove-pages.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/rotate-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/scale-pages.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/add-password.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/add-watermark.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/auto-redact.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/cert-sign.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/change-permissions.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/get-info-on-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/redact.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/remove-cert-sign.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/remove-password.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/remove-watermark.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/sanitize-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/validate-signature.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/sign.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/split-by-size-or-count.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/split-pdf-by-chapters.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/split-pdf-by-sections.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/split-pdfs.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/usage.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/view-pdf.html (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/SPDFApplicationTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/controller/api/RearrangePagesPDFControllerTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/controller/api/RotationControllerTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPdfTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessorTest.java (86%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/controller/web/UploadLimitServiceTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/service/CertificateValidationServiceTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/service/LanguageServiceBasicTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/service/LanguageServiceTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/service/PdfImageRemovalServiceTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/service/PdfMetadataServiceBasicTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/service/PdfMetadataServiceTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/service/SignatureServiceTest.java (100%) diff --git a/.gitattributes b/.gitattributes index c498408ab..f72c204bd 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,10 +1,10 @@ * text=auto eol=lf # Ignore all JavaScript files in a directory -src/main/resources/static/pdfjs/* linguist-vendored -src/main/resources/static/pdfjs/** linguist-vendored -src/main/resources/static/pdfjs-legacy/* linguist-vendored -src/main/resources/static/pdfjs-legacy/** linguist-vendored -src/main/resources/static/css/bootstrap-icons.css linguist-vendored -src/main/resources/static/css/bootstrap.min.css linguist-vendored -src/main/resources/static/css/fonts/* linguist-vendored +stirling-pdf/src/main/resources/static/pdfjs/* linguist-vendored +stirling-pdf/src/main/resources/static/pdfjs/** linguist-vendored +stirling-pdf/src/main/resources/static/pdfjs-legacy/* linguist-vendored +stirling-pdf/src/main/resources/static/pdfjs-legacy/** linguist-vendored +stirling-pdf/src/main/resources/static/css/bootstrap-icons.css linguist-vendored +stirling-pdf/src/main/resources/static/css/bootstrap.min.css linguist-vendored +stirling-pdf/src/main/resources/static/css/fonts/* linguist-vendored diff --git a/.github/labeler-config.yml b/.github/labeler-config.yml index bb52c7b85..d1a340065 100644 --- a/.github/labeler-config.yml +++ b/.github/labeler-config.yml @@ -1,60 +1,45 @@ Translation: - changed-files: - - any-glob-to-any-file: 'src/main/resources/messages_*_*.properties' + - any-glob-to-any-file: 'stirling-pdf/src/main/resources/messages_*_*.properties' - any-glob-to-any-file: 'scripts/ignore_translation.toml' - - any-glob-to-any-file: 'src/main/resources/templates/fragments/languages.html' + - any-glob-to-any-file: 'stirling-pdf/src/main/resources/templates/fragments/languages.html' Front End: - changed-files: - - any-glob-to-any-file: 'src/main/resources/templates/**/*' - - any-glob-to-any-file: 'src/main/resources/static/**/*' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/**' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/UI/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/main/resources/templates/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/main/resources/static/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/controller/web/**' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/UI/**/*' Java: - changed-files: - - any-glob-to-any-file: 'src/main/java/**/*.java' + - any-glob-to-any-file: 'common/src/main/java/**/*.java' + - any-glob-to-any-file: 'proprietary/src/main/java/**/*.java' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/**/*.java' Back End: - changed-files: - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/**/*' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/**/*' - - any-glob-to-any-file: 'src/main/resources/settings.yml.template' - - any-glob-to-any-file: 'src/main/resources/application.properties' - - any-glob-to-any-file: 'src/main/resources/banner.txt' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/config/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/controller/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/main/resources/settings.yml.template' + - any-glob-to-any-file: 'stirling-pdf/src/main/resources/application.properties' + - any-glob-to-any-file: 'stirling-pdf/src/main/resources/banner.txt' - any-glob-to-any-file: 'scripts/png_to_webp.py' - any-glob-to-any-file: 'split_photos.py' Security: - changed-files: - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/interfaces/DatabaseInterface.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/security/**/*' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/EmailController.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/H2SQLController.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/UserController.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/api/Email.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/exception/BackupNotFoundException.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/exception/NoProviderFoundExceptionjava' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/provider/**/*' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/AuthenticationType.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/ApiKeyAuthenticationToken.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/AttemptCounter.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/Authority.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/PersistentLogin.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/SessionEntity.java' + - any-glob-to-any-file: 'proprietary/src/main/java/stirling/software/proprietary/security/**/*' - any-glob-to-any-file: 'scripts/download-security-jar.sh' - any-glob-to-any-file: '.github/workflows/dependency-review.yml' - any-glob-to-any-file: '.github/workflows/scorecards.yml' API: - changed-files: - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/OpenApiConfig.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/MetricsController.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/**/*' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/api/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/model/api/**/*' - any-glob-to-any-file: 'scripts/png_to_webp.py' - any-glob-to-any-file: 'split_photos.py' - any-glob-to-any-file: '.github/workflows/swagger.yml' @@ -88,7 +73,9 @@ Devtools: Test: - changed-files: - any-glob-to-any-file: 'cucumber/**/*' - - any-glob-to-any-file: 'src/test/**/*' + - any-glob-to-any-file: 'common/src/test/**/*' + - any-glob-to-any-file: 'proprietary/src/test/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/test/**/*' - any-glob-to-any-file: 'src/testing/**/*' - any-glob-to-any-file: '.pre-commit-config' - any-glob-to-any-file: '.github/workflows/pre_commit.yml' diff --git a/.github/scripts/check_language_properties.py b/.github/scripts/check_language_properties.py index 10e6fb650..8ae7dbfc1 100644 --- a/.github/scripts/check_language_properties.py +++ b/.github/scripts/check_language_properties.py @@ -317,7 +317,7 @@ def check_for_differences(reference_file, file_list, branch, actor): report.append("## ❌ Overall Check Status: **_Failed_**") report.append("") report.append( - f"@{actor} please check your translation if it conforms to the standard. Follow the format of [messages_en_GB.properties](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties)" + f"@{actor} please check your translation if it conforms to the standard. Follow the format of [messages_en_GB.properties](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/stirling-pdf/src/main/resources/messages_en_GB.properties)" ) else: report.append("## ✅ Overall Check Status: **_Success_**") diff --git a/.github/workflows/check_properties.yml b/.github/workflows/check_properties.yml index d74e3084a..9598351a5 100644 --- a/.github/workflows/check_properties.yml +++ b/.github/workflows/check_properties.yml @@ -4,7 +4,7 @@ on: pull_request_target: types: [opened, synchronize, reopened] paths: - - "src/main/resources/messages_*.properties" + - "stirling-pdf/src/main/resources/messages_*.properties" permissions: contents: read # Allow read access to repository content @@ -61,7 +61,20 @@ jobs: run: | echo "Fetching PR changed files..." echo "Getting list of changed files from PR..." - gh pr view ${{ steps.get-pr-data.outputs.pr_number }} --json files -q ".files[].path" | grep -E '^src/main/resources/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$' > changed_files.txt # Filter only matching property files + # Check if PR number exists + if [ -z "${{ steps.get-pr-data.outputs.pr_number }}" ]; then + echo "Error: PR number is empty" + exit 1 + fi + # Get changed files and filter for properties files, handle case where no matches are found + gh pr view ${{ steps.get-pr-data.outputs.pr_number }} --json files -q ".files[].path" | grep -E '^stirling-pdf/src/main/resources/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$' > changed_files.txt || echo "No matching properties files found in PR" + # Check if any files were found + if [ ! -s changed_files.txt ]; then + echo "No properties files changed in this PR" + echo "Workflow will exit early as no relevant files to check" + exit 0 + fi + echo "Found $(wc -l < changed_files.txt) matching properties files" - name: Determine reference file test id: determine-file @@ -103,7 +116,7 @@ jobs: // Filter for relevant files based on the PR changes const changedFiles = files .map(file => file.filename) - .filter(file => /^src\/main\/resources\/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$/.test(file)); + .filter(file => /^stirling-pdf\src\/main\/resources\/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$/.test(file)); console.log("Changed files:", changedFiles); @@ -141,12 +154,12 @@ jobs: // Determine reference file let referenceFilePath; - if (changedFiles.includes("src/main/resources/messages_en_GB.properties")) { + if (changedFiles.includes("stirling-pdf/src/main/resources/messages_en_GB.properties")) { console.log("Using PR branch reference file."); const { data: fileContent } = await github.rest.repos.getContent({ owner: prRepoOwner, repo: prRepoName, - path: "src/main/resources/messages_en_GB.properties", + path: "stirling-pdf/src/main/resources/messages_en_GB.properties", ref: branch, }); @@ -158,7 +171,7 @@ jobs: const { data: fileContent } = await github.rest.repos.getContent({ owner: repoOwner, repo: repoName, - path: "src/main/resources/messages_en_GB.properties", + path: "stirling-pdf/src/main/resources/messages_en_GB.properties", ref: "main", }); diff --git a/.github/workflows/licenses-update.yml b/.github/workflows/licenses-update.yml index e040e5436..f9fb1e521 100644 --- a/.github/workflows/licenses-update.yml +++ b/.github/workflows/licenses-update.yml @@ -57,11 +57,11 @@ jobs: - name: Move and rename license file run: | - mv build/reports/dependency-license/index.json src/main/resources/static/3rdPartyLicenses.json + mv build/reports/dependency-license/index.json stirling-pdf/src/main/resources/static/3rdPartyLicenses.json - name: Commit changes run: | - git add src/main/resources/static/3rdPartyLicenses.json + git add stirling-pdf/src/main/resources/static/3rdPartyLicenses.json git diff --staged --quiet || echo "CHANGES_DETECTED=true" >> $GITHUB_ENV - name: Create Pull Request diff --git a/.github/workflows/sync_files.yml b/.github/workflows/sync_files.yml index 92b4f3c87..dd29b0d4b 100644 --- a/.github/workflows/sync_files.yml +++ b/.github/workflows/sync_files.yml @@ -8,8 +8,8 @@ on: paths: - "build.gradle" - "README.md" - - "src/main/resources/messages_*.properties" - - "src/main/resources/static/3rdPartyLicenses.json" + - "stirling-pdf/src/main/resources/messages_*.properties" + - "stirling-pdf/src/main/resources/static/3rdPartyLicenses.json" - "scripts/ignore_translation.toml" permissions: @@ -41,11 +41,11 @@ jobs: - name: Sync translation property files run: | - python .github/scripts/check_language_properties.py --reference-file "src/main/resources/messages_en_GB.properties" --branch main + python .github/scripts/check_language_properties.py --reference-file "stirling-pdf/src/main/resources/messages_en_GB.properties" --branch main - name: Commit translation files run: | - git add src/main/resources/messages_*.properties + git add stirling-pdf/src/main/resources/messages_*.properties git diff --staged --quiet || git commit -m ":memo: Sync translation files" || echo "No changes detected" - name: Install dependencies @@ -101,4 +101,4 @@ jobs: sign-commits: true add-paths: | README.md - src/main/resources/messages_*.properties + stirling-pdf/src/main/resources/messages_*.properties diff --git a/.gitignore b/.gitignore index 06602d03b..ca949e769 100644 --- a/.gitignore +++ b/.gitignore @@ -125,6 +125,9 @@ SwaggerDoc.json *.rar *.db /build +/stirling-pdf/build +/common/build +/proprietary/build # Byte-compiled / optimized / DLL files __pycache__/ @@ -194,4 +197,3 @@ id_ed25519.pub # node_modules node_modules/ -*.mjs diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index beec5eb99..b4b3841e6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: - --skip="./.*,*.csv,*.json,*.ambr" - --quiet-level=2 files: \.(html|css|js|py|md)$ - exclude: (.vscode|.devcontainer|src/main/resources|Dockerfile|.*/pdfjs.*|.*/thirdParty.*|bootstrap.*|.*\.min\..*|.*diff\.js) + exclude: (.vscode|.devcontainer|stirling-pdf/src/main/resources|Dockerfile|.*/pdfjs.*|.*/thirdParty.*|bootstrap.*|.*\.min\..*|.*diff\.js) - repo: https://github.com/gitleaks/gitleaks rev: v8.26.0 hooks: diff --git a/DeveloperGuide.md b/DeveloperGuide.md index d484838e0..d2c9ddb2a 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -137,9 +137,9 @@ services: ports: - "8080:8080" volumes: - - /stirling/latest/data:/usr/share/tessdata:rw - - /stirling/latest/config:/configs:rw - - /stirling/latest/logs:/logs:rw + - ./stirling/latest/data:/usr/share/tessdata:rw + - ./stirling/latest/config:/configs:rw + - ./stirling/latest/logs:/logs:rw environment: DISABLE_ADDITIONAL_FEATURES: "false" SECURITY_ENABLELOGIN: "true" @@ -332,7 +332,7 @@ Thymeleaf is a server-side Java HTML template engine. It is used in Stirling-PDF ### Thymeleaf overview -In Stirling-PDF, Thymeleaf is used to create HTML templates that are rendered on the server side. These templates are located in the `src/main/resources/templates` directory. Thymeleaf templates use a combination of HTML and special Thymeleaf attributes to dynamically generate content. +In Stirling-PDF, Thymeleaf is used to create HTML templates that are rendered on the server side. These templates are located in the `stirling-pdf/src/main/resources/templates` directory. Thymeleaf templates use a combination of HTML and special Thymeleaf attributes to dynamically generate content. Some examples of this are: @@ -384,7 +384,7 @@ This would generate n entries of tr for each person in exampleData ### Adding a New Feature to the Backend (API) 1. **Create a New Controller:** - - Create a new Java class in the `src/main/java/stirling/software/SPDF/controller/api` directory. + - Create a new Java class in the `stirling-pdf/src/main/java/stirling/software/SPDF/controller/api` directory. - Annotate the class with `@RestController` and `@RequestMapping` to define the API endpoint. - Ensure to add API documentation annotations like `@Tag(name = "General", description = "General APIs")` and `@Operation(summary = "Crops a PDF document", description = "This operation takes an input PDF file and crops it according to the given coordinates. Input:PDF Output:PDF Type:SISO")`. @@ -411,7 +411,7 @@ This would generate n entries of tr for each person in exampleData ``` 2. **Define the Service Layer:** (Not required but often useful) - - Create a new service class in the `src/main/java/stirling/software/SPDF/service` directory. + - Create a new service class in the `stirling-pdf/src/main/java/stirling/software/SPDF/service` directory. - Implement the business logic for the new feature. ```java @@ -463,7 +463,7 @@ This would generate n entries of tr for each person in exampleData ### Adding a New Feature to the Frontend (UI) 1. **Create a New Thymeleaf Template:** - - Create a new HTML file in the `src/main/resources/templates` directory. + - Create a new HTML file in the `stirling-pdf/src/main/resources/templates` directory. - Use Thymeleaf attributes to dynamically generate content. - Use `extract-page.html` as a base example for the HTML template, which is useful to ensure importing of the general layout, navbar, and footer. @@ -507,7 +507,7 @@ This would generate n entries of tr for each person in exampleData ``` 2. **Create a New Controller for the UI:** - - Create a new Java class in the `src/main/java/stirling/software/SPDF/controller/ui` directory. + - Create a new Java class in the `stirling-pdf/src/main/java/stirling/software/SPDF/controller/ui` directory. - Annotate the class with `@Controller` and `@RequestMapping` to define the UI endpoint. ```java @@ -537,7 +537,7 @@ This would generate n entries of tr for each person in exampleData 3. **Update the Navigation Bar:** - Add a link to the new feature page in the navigation bar. - - Update the `src/main/resources/templates/fragments/navbar.html` file. + - Update the `stirling-pdf/src/main/resources/templates/fragments/navbar.html` file. ```html