Compare commits

..

9 Commits

Author SHA1 Message Date
Dario Ghunney Ware
7ef56889ce removed /build 2025-06-06 17:16:41 +01:00
Dario Ghunney Ware
c745d4f290 clean up 2025-06-06 17:14:52 +01:00
Dario Ghunney Ware
0523470c35 resolving conflicts 2025-06-05 18:13:52 +01:00
Dario Ghunney Ware
b570a5ad14 clean up 2025-06-05 18:13:52 +01:00
Dario Ghunney Ware
58c1bccfcc renamed module: enterprise > proprietary
updating paths (DOCKER_SECURITY_ENABLE > ADDITIONAL_FEATURES)
2025-06-05 18:13:50 +01:00
Dario Ghunney Ware
75ec5e00ab moving security package and relevant files over to proprietary 2025-06-05 18:13:01 +01:00
DarioGii
b500236733 removing DOCKER_ENABLE_SECURITY flag
moving security package and relevant files over to proprietary
2025-06-05 18:13:01 +01:00
Dario Ghunney Ware
66cebc7f9f updating LICENSE-proprietary 2025-06-05 18:13:01 +01:00
Dario Ghunney Ware
f9df824705 creating new proprietary module 2025-06-05 18:12:59 +01:00
73 changed files with 339 additions and 111284 deletions

1
.gitignore vendored
View File

@ -197,3 +197,4 @@ id_ed25519.pub
# node_modules # node_modules
node_modules/ node_modules/
*.mjs

View File

@ -116,46 +116,46 @@ Stirling-PDF currently supports 40 languages!
| Language | Progress | | Language | Progress |
| -------------------------------------------- | -------------------------------------- | | -------------------------------------------- | -------------------------------------- |
| Arabic (العربية) (ar_AR) | ![71%](https://geps.dev/progress/71) | | Arabic (العربية) (ar_AR) | ![72%](https://geps.dev/progress/72) |
| Azerbaijani (Azərbaycan Dili) (az_AZ) | ![72%](https://geps.dev/progress/72) | | Azerbaijani (Azərbaycan Dili) (az_AZ) | ![72%](https://geps.dev/progress/72) |
| Basque (Euskara) (eu_ES) | ![42%](https://geps.dev/progress/42) | | Basque (Euskara) (eu_ES) | ![42%](https://geps.dev/progress/42) |
| Bulgarian (Български) (bg_BG) | ![79%](https://geps.dev/progress/79) | | Bulgarian (Български) (bg_BG) | ![80%](https://geps.dev/progress/80) |
| Catalan (Català) (ca_CA) | ![78%](https://geps.dev/progress/78) | | Catalan (Català) (ca_CA) | ![79%](https://geps.dev/progress/79) |
| Croatian (Hrvatski) (hr_HR) | ![70%](https://geps.dev/progress/70) | | Croatian (Hrvatski) (hr_HR) | ![71%](https://geps.dev/progress/71) |
| Czech (Česky) (cs_CZ) | ![81%](https://geps.dev/progress/81) | | Czech (Česky) (cs_CZ) | ![82%](https://geps.dev/progress/82) |
| Danish (Dansk) (da_DK) | ![71%](https://geps.dev/progress/71) | | Danish (Dansk) (da_DK) | ![72%](https://geps.dev/progress/72) |
| Dutch (Nederlands) (nl_NL) | ![69%](https://geps.dev/progress/69) | | Dutch (Nederlands) (nl_NL) | ![70%](https://geps.dev/progress/70) |
| English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) |
| English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) |
| French (Français) (fr_FR) | ![80%](https://geps.dev/progress/80) | | French (Français) (fr_FR) | ![81%](https://geps.dev/progress/81) |
| German (Deutsch) (de_DE) | ![97%](https://geps.dev/progress/97) | | German (Deutsch) (de_DE) | ![98%](https://geps.dev/progress/98) |
| Greek (Ελληνικά) (el_GR) | ![78%](https://geps.dev/progress/78) | | Greek (Ελληνικά) (el_GR) | ![79%](https://geps.dev/progress/79) |
| Hindi (हिंदी) (hi_IN) | ![78%](https://geps.dev/progress/78) | | Hindi (हिंदी) (hi_IN) | ![78%](https://geps.dev/progress/78) |
| Hungarian (Magyar) (hu_HU) | ![89%](https://geps.dev/progress/89) | | Hungarian (Magyar) (hu_HU) | ![90%](https://geps.dev/progress/90) |
| Indonesian (Bahasa Indonesia) (id_ID) | ![72%](https://geps.dev/progress/72) | | Indonesian (Bahasa Indonesia) (id_ID) | ![72%](https://geps.dev/progress/72) |
| Irish (Gaeilge) (ga_IE) | ![79%](https://geps.dev/progress/79) | | Irish (Gaeilge) (ga_IE) | ![80%](https://geps.dev/progress/80) |
| Italian (Italiano) (it_IT) | ![97%](https://geps.dev/progress/97) | | Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) |
| Japanese (日本語) (ja_JP) | ![79%](https://geps.dev/progress/79) | | Japanese (日本語) (ja_JP) | ![80%](https://geps.dev/progress/80) |
| Korean (한국어) (ko_KR) | ![78%](https://geps.dev/progress/78) | | Korean (한국어) (ko_KR) | ![79%](https://geps.dev/progress/79) |
| Norwegian (Norsk) (no_NB) | ![76%](https://geps.dev/progress/76) | | Norwegian (Norsk) (no_NB) | ![77%](https://geps.dev/progress/77) |
| Persian (فارسی) (fa_IR) | ![74%](https://geps.dev/progress/74) | | Persian (فارسی) (fa_IR) | ![75%](https://geps.dev/progress/75) |
| Polish (Polski) (pl_PL) | ![83%](https://geps.dev/progress/83) | | Polish (Polski) (pl_PL) | ![84%](https://geps.dev/progress/84) |
| Portuguese (Português) (pt_PT) | ![79%](https://geps.dev/progress/79) | | Portuguese (Português) (pt_PT) | ![80%](https://geps.dev/progress/80) |
| Portuguese Brazilian (Português) (pt_BR) | ![84%](https://geps.dev/progress/84) | | Portuguese Brazilian (Português) (pt_BR) | ![85%](https://geps.dev/progress/85) |
| Romanian (Română) (ro_RO) | ![66%](https://geps.dev/progress/66) | | Romanian (Română) (ro_RO) | ![67%](https://geps.dev/progress/67) |
| Russian (Русский) (ru_RU) | ![84%](https://geps.dev/progress/84) | | Russian (Русский) (ru_RU) | ![85%](https://geps.dev/progress/85) |
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![51%](https://geps.dev/progress/51) | | Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![51%](https://geps.dev/progress/51) |
| Simplified Chinese (简体中文) (zh_CN) | ![84%](https://geps.dev/progress/84) | | Simplified Chinese (简体中文) (zh_CN) | ![85%](https://geps.dev/progress/85) |
| Slovakian (Slovensky) (sk_SK) | ![60%](https://geps.dev/progress/60) | | Slovakian (Slovensky) (sk_SK) | ![60%](https://geps.dev/progress/60) |
| Slovenian (Slovenščina) (sl_SI) | ![82%](https://geps.dev/progress/82) | | Slovenian (Slovenščina) (sl_SI) | ![83%](https://geps.dev/progress/83) |
| Spanish (Español) (es_ES) | ![86%](https://geps.dev/progress/86) | | Spanish (Español) (es_ES) | ![87%](https://geps.dev/progress/87) |
| Swedish (Svenska) (sv_SE) | ![76%](https://geps.dev/progress/76) | | Swedish (Svenska) (sv_SE) | ![76%](https://geps.dev/progress/76) |
| Thai (ไทย) (th_TH) | ![68%](https://geps.dev/progress/68) | | Thai (ไทย) (th_TH) | ![69%](https://geps.dev/progress/69) |
| Tibetan (བོད་ཡིག་) (bo_CN) | ![75%](https://geps.dev/progress/75) | | Tibetan (བོད་ཡིག་) (bo_CN) | ![76%](https://geps.dev/progress/76) |
| Traditional Chinese (繁體中文) (zh_TW) | ![85%](https://geps.dev/progress/85) | | Traditional Chinese (繁體中文) (zh_TW) | ![85%](https://geps.dev/progress/85) |
| Turkish (Türkçe) (tr_TR) | ![85%](https://geps.dev/progress/85) | | Turkish (Türkçe) (tr_TR) | ![86%](https://geps.dev/progress/86) |
| Ukrainian (Українська) (uk_UA) | ![84%](https://geps.dev/progress/84) | | Ukrainian (Українська) (uk_UA) | ![85%](https://geps.dev/progress/85) |
| Vietnamese (Tiếng Việt) (vi_VN) | ![66%](https://geps.dev/progress/66) | | Vietnamese (Tiếng Việt) (vi_VN) | ![67%](https://geps.dev/progress/67) |
| Malayalam (മലയാളം) (ml_IN) | ![85%](https://geps.dev/progress/85) | | Malayalam (മലയാളം) (ml_IN) | ![85%](https://geps.dev/progress/85) |
## Stirling PDF Enterprise ## Stirling PDF Enterprise

1
common/.gitignore vendored
View File

@ -194,3 +194,4 @@ id_ed25519.pub
# node_modules # node_modules
node_modules/ node_modules/
*.mjs

View File

@ -11,5 +11,4 @@ dependencies {
api 'jakarta.servlet:jakarta.servlet-api:6.1.0' api 'jakarta.servlet:jakarta.servlet-api:6.1.0'
api 'org.snakeyaml:snakeyaml-engine:2.9' api 'org.snakeyaml:snakeyaml-engine:2.9'
api "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.8" api "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.8"
api 'jakarta.mail:jakarta.mail-api:2.1.3'
} }

View File

@ -1,39 +0,0 @@
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;
}

View File

@ -194,3 +194,4 @@ id_ed25519.pub
# node_modules # node_modules
node_modules/ node_modules/
*.mjs

View File

@ -123,8 +123,8 @@ SwaggerDoc.json
*.tar.gz *.tar.gz
*.rar *.rar
*.db *.db
/build/* /build
/stirling-pdf/build/* /stirling-pdf/build/
# Byte-compiled / optimized / DLL files # Byte-compiled / optimized / DLL files
__pycache__/ __pycache__/
@ -194,3 +194,4 @@ id_ed25519.pub
# node_modules # node_modules
node_modules/ node_modules/
*.mjs

View File

@ -8,13 +8,14 @@ import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.service.EndpointConfigurationService;
@Component @Component
@Slf4j @Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
public class EndpointInterceptor implements HandlerInterceptor { public class EndpointInterceptor implements HandlerInterceptor {
private final EndpointConfiguration endpointConfiguration; private final EndpointConfigurationService endpointConfigurationService;
@Override @Override
public boolean preHandle( public boolean preHandle(
@ -37,10 +38,10 @@ public class EndpointInterceptor implements HandlerInterceptor {
} }
log.debug("Request endpoint: {}", requestEndpoint); log.debug("Request endpoint: {}", requestEndpoint);
isEnabled = endpointConfiguration.isEndpointEnabled(requestEndpoint); isEnabled = endpointConfigurationService.isEndpointEnabled(requestEndpoint);
log.debug("Is endpoint enabled: {}", isEnabled); log.debug("Is endpoint enabled: {}", isEnabled);
} else { } else {
isEnabled = endpointConfiguration.isEndpointEnabled(requestURI); isEnabled = endpointConfigurationService.isEndpointEnabled(requestURI);
} }
if (!isEnabled) { if (!isEnabled) {

View File

@ -13,20 +13,21 @@ import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import stirling.software.common.configuration.RuntimePathConfig; import stirling.software.common.configuration.RuntimePathConfig;
import stirling.software.SPDF.service.EndpointConfigurationService;
@Configuration @Configuration
@Slf4j @Slf4j
public class ExternalAppDepConfig { public class ExternalAppDepConfig {
private final EndpointConfiguration endpointConfiguration; private final EndpointConfigurationService endpointConfigurationService;
private final String weasyprintPath; private final String weasyprintPath;
private final String unoconvPath; private final String unoconvPath;
private final Map<String, List<String>> commandToGroupMapping; private final Map<String, List<String>> commandToGroupMapping;
public ExternalAppDepConfig( public ExternalAppDepConfig(
EndpointConfiguration endpointConfiguration, RuntimePathConfig runtimePathConfig) { EndpointConfigurationService endpointConfigurationService, RuntimePathConfig runtimePathConfig) {
this.endpointConfiguration = endpointConfiguration; this.endpointConfigurationService = endpointConfigurationService;
weasyprintPath = runtimePathConfig.getWeasyPrintPath(); weasyprintPath = runtimePathConfig.getWeasyPrintPath();
unoconvPath = runtimePathConfig.getUnoConvertPath(); unoconvPath = runtimePathConfig.getUnoConvertPath();
@ -62,7 +63,7 @@ public class ExternalAppDepConfig {
} }
private List<String> getAffectedFeatures(String group) { private List<String> getAffectedFeatures(String group) {
return endpointConfiguration.getEndpointsForGroup(group).stream() return endpointConfigurationService.getEndpointsForGroup(group).stream()
.map(endpoint -> formatEndpointAsFeature(endpoint)) .map(endpoint -> formatEndpointAsFeature(endpoint))
.toList(); .toList();
} }
@ -93,7 +94,7 @@ public class ExternalAppDepConfig {
if (affectedGroups != null) { if (affectedGroups != null) {
for (String group : affectedGroups) { for (String group : affectedGroups) {
List<String> affectedFeatures = getAffectedFeatures(group); List<String> affectedFeatures = getAffectedFeatures(group);
endpointConfiguration.disableGroup(group); endpointConfigurationService.disableGroup(group);
log.warn( log.warn(
"Missing dependency: {} - Disabling group: {} (Affected features: {})", "Missing dependency: {} - Disabling group: {} (Affected features: {})",
command, command,
@ -120,8 +121,8 @@ public class ExternalAppDepConfig {
if (!pythonAvailable) { if (!pythonAvailable) {
List<String> pythonFeatures = getAffectedFeatures("Python"); List<String> pythonFeatures = getAffectedFeatures("Python");
List<String> openCVFeatures = getAffectedFeatures("OpenCV"); List<String> openCVFeatures = getAffectedFeatures("OpenCV");
endpointConfiguration.disableGroup("Python"); endpointConfigurationService.disableGroup("Python");
endpointConfiguration.disableGroup("OpenCV"); endpointConfigurationService.disableGroup("OpenCV");
log.warn( log.warn(
"Missing dependency: Python - Disabling Python features: {} and OpenCV features: {}", "Missing dependency: Python - Disabling Python features: {} and OpenCV features: {}",
String.join(", ", pythonFeatures), String.join(", ", pythonFeatures),
@ -139,20 +140,20 @@ public class ExternalAppDepConfig {
int exitCode = process.waitFor(); int exitCode = process.waitFor();
if (exitCode != 0) { if (exitCode != 0) {
List<String> openCVFeatures = getAffectedFeatures("OpenCV"); List<String> openCVFeatures = getAffectedFeatures("OpenCV");
endpointConfiguration.disableGroup("OpenCV"); endpointConfigurationService.disableGroup("OpenCV");
log.warn( log.warn(
"OpenCV not available in Python - Disabling OpenCV features: {}", "OpenCV not available in Python - Disabling OpenCV features: {}",
String.join(", ", openCVFeatures)); String.join(", ", openCVFeatures));
} }
} catch (Exception e) { } catch (Exception e) {
List<String> openCVFeatures = getAffectedFeatures("OpenCV"); List<String> openCVFeatures = getAffectedFeatures("OpenCV");
endpointConfiguration.disableGroup("OpenCV"); endpointConfigurationService.disableGroup("OpenCV");
log.warn( log.warn(
"Error checking OpenCV: {} - Disabling OpenCV features: {}", "Error checking OpenCV: {} - Disabling OpenCV features: {}",
e.getMessage(), e.getMessage(),
String.join(", ", openCVFeatures)); String.join(", ", openCVFeatures));
} }
} }
endpointConfiguration.logDisabledEndpointsSummary(); endpointConfigurationService.logDisabledEndpointsSummary();
} }
} }

View File

@ -1,77 +0,0 @@
// package stirling.software.SPDF.config.fingerprint;
//
// import java.security.MessageDigest;
// import java.security.NoSuchAlgorithmException;
//
// import org.springframework.stereotype.Component;
//
// import jakarta.servlet.http.HttpServletRequest;
//
// @Component
// public class FingerprintGenerator {
//
// public String generateFingerprint(HttpServletRequest request) {
// if (request == null) {
// return "";
// }
// StringBuilder fingerprintBuilder = new StringBuilder();
//
// // Add IP address
// fingerprintBuilder.append(request.getRemoteAddr());
//
// // Add X-Forwarded-For header if present (for clients behind proxies)
// String forwardedFor = request.getHeader("X-Forwarded-For");
// if (forwardedFor != null) {
// fingerprintBuilder.append(forwardedFor);
// }
//
// // Add User-Agent
// String userAgent = request.getHeader("User-Agent");
// if (userAgent != null) {
// fingerprintBuilder.append(userAgent);
// }
//
// // Add Accept-Language header
// String acceptLanguage = request.getHeader("Accept-Language");
// if (acceptLanguage != null) {
// fingerprintBuilder.append(acceptLanguage);
// }
//
// // Add Accept header
// String accept = request.getHeader("Accept");
// if (accept != null) {
// fingerprintBuilder.append(accept);
// }
//
// // Add Connection header
// String connection = request.getHeader("Connection");
// if (connection != null) {
// fingerprintBuilder.append(connection);
// }
//
// // Add server port
// fingerprintBuilder.append(request.getServerPort());
//
// // Add secure flag
// fingerprintBuilder.append(request.isSecure());
//
// // Generate a hash of the fingerprint
// return generateHash(fingerprintBuilder.toString());
// }
//
// private String generateHash(String input) {
// try {
// MessageDigest digest = MessageDigest.getInstance("SHA-256");
// byte[] hash = digest.digest(input.getBytes());
// StringBuilder hexString = new StringBuilder();
// for (byte b : hash) {
// String hex = Integer.toHexString(0xff & b);
// if (hex.length() == 1) hexString.append('0');
// hexString.append(hex);
// }
// return hexString.toString();
// } catch (NoSuchAlgorithmException e) {
// throw new RuntimeException("Failed to generate fingerprint hash", e);
// }
// }
// }

View File

@ -16,7 +16,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import stirling.software.SPDF.config.EndpointConfiguration; import stirling.software.SPDF.service.EndpointConfigurationService;
import stirling.software.common.configuration.InstallationPathConfig; import stirling.software.common.configuration.InstallationPathConfig;
import stirling.software.common.model.ApplicationProperties; import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.util.GeneralUtils; import stirling.software.common.util.GeneralUtils;
@ -29,7 +29,7 @@ import stirling.software.common.util.GeneralUtils;
public class SettingsController { public class SettingsController {
private final ApplicationProperties applicationProperties; private final ApplicationProperties applicationProperties;
private final EndpointConfiguration endpointConfiguration; private final EndpointConfigurationService endpointConfigurationService;
@PostMapping("/update-enable-analytics") @PostMapping("/update-enable-analytics")
@Hidden @Hidden
@ -48,6 +48,6 @@ public class SettingsController {
@GetMapping("/get-endpoints-status") @GetMapping("/get-endpoints-status")
@Hidden @Hidden
public ResponseEntity<Map<String, Boolean>> getDisabledEndpoints() { public ResponseEntity<Map<String, Boolean>> getDisabledEndpoints() {
return ResponseEntity.ok(endpointConfiguration.getEndpointStatuses()); return ResponseEntity.ok(endpointConfigurationService.getEndpointStatuses());
} }
} }

View File

@ -1,157 +0,0 @@
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<byte[]> 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;
}
}

View File

@ -1,8 +1,5 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import io.github.pixee.security.Filenames;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.awt.*; import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
@ -20,17 +17,14 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import javax.imageio.IIOImage; import javax.imageio.IIOImage;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter; import javax.imageio.ImageWriter;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam; import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream; import javax.imageio.stream.ImageOutputStream;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPage;
@ -44,13 +38,24 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import stirling.software.SPDF.config.EndpointConfiguration;
import stirling.software.SPDF.model.api.misc.OptimizePdfRequest; import io.github.pixee.security.Filenames;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import stirling.software.common.service.CustomPDFDocumentFactory; import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.GeneralUtils; import stirling.software.common.util.GeneralUtils;
import stirling.software.common.util.ProcessExecutor; import stirling.software.common.util.ProcessExecutor;
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult; import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
import stirling.software.common.util.WebResponseUtils; import stirling.software.common.util.WebResponseUtils;
import stirling.software.SPDF.service.EndpointConfigurationService;
import stirling.software.SPDF.model.api.misc.OptimizePdfRequest;
@RestController @RestController
@RequestMapping("/api/v1/misc") @RequestMapping("/api/v1/misc")
@ -63,9 +68,9 @@ public class CompressController {
public CompressController( public CompressController(
CustomPDFDocumentFactory pdfDocumentFactory, CustomPDFDocumentFactory pdfDocumentFactory,
EndpointConfiguration endpointConfiguration) { EndpointConfigurationService endpointConfigurationService) {
this.pdfDocumentFactory = pdfDocumentFactory; this.pdfDocumentFactory = pdfDocumentFactory;
this.qpdfEnabled = endpointConfiguration.isGroupEnabled("qpdf"); this.qpdfEnabled = endpointConfigurationService.isGroupEnabled("qpdf");
} }
@Data @Data

View File

@ -7,6 +7,7 @@ import org.springframework.web.servlet.ModelAndView;
import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.common.util.CheckProgramInstall; import stirling.software.common.util.CheckProgramInstall;
@Controller @Controller
@ -120,11 +121,4 @@ public class ConverterWebController {
model.addAttribute("currentPage", "pdf-to-pdfa"); model.addAttribute("currentPage", "pdf-to-pdfa");
return "convert/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";
}
} }

View File

@ -1,4 +1,4 @@
package stirling.software.SPDF.config; package stirling.software.SPDF.service;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -13,9 +13,9 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.common.model.ApplicationProperties; import stirling.software.common.model.ApplicationProperties;
@Service
@Slf4j @Slf4j
public class EndpointConfiguration { @Service
public class EndpointConfigurationService {
private static final String REMOVE_BLANKS = "remove-blanks"; private static final String REMOVE_BLANKS = "remove-blanks";
private final ApplicationProperties applicationProperties; private final ApplicationProperties applicationProperties;
@ -23,7 +23,7 @@ public class EndpointConfiguration {
private Map<String, Set<String>> endpointGroups = new ConcurrentHashMap<>(); private Map<String, Set<String>> endpointGroups = new ConcurrentHashMap<>();
private final boolean runningProOrHigher; private final boolean runningProOrHigher;
public EndpointConfiguration( public EndpointConfigurationService(
ApplicationProperties applicationProperties, ApplicationProperties applicationProperties,
@Qualifier("runningProOrHigher") boolean runningProOrHigher) { @Qualifier("runningProOrHigher") boolean runningProOrHigher) {
this.applicationProperties = applicationProperties; this.applicationProperties = applicationProperties;

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML إلى PDF
home.HTMLToPDF.desc=يحول أي ملف HTML أو ملف مضغوط يحتوي home.HTMLToPDF.desc=يحول أي ملف HTML أو ملف مضغوط يحتوي
HTMLToPDF.tags=لغة الترميز,محتوى الويب,تحويل,تحويل 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.title=Markdown إلى PDF
home.MarkdownToPDF.desc=يحول أي ملف Markdown إلى PDF home.MarkdownToPDF.desc=يحول أي ملف Markdown إلى PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML-dən PDF-ə
home.HTMLToPDF.desc=Hər hansı HTML faylını və ya ZİP-i PDF-ə çevirir 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ə 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.title=Markdown-dan PDF-ə
home.MarkdownToPDF.desc=Hər hansı Markdown faylını PDF-ə çevirir home.MarkdownToPDF.desc=Hər hansı Markdown faylını PDF-ə çevirir

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML към PDF
home.HTMLToPDF.desc=Преобразува всеки HTML файл или архив към PDF home.HTMLToPDF.desc=Преобразува всеки HTML файл или архив към PDF
HTMLToPDF.tags=маркиране,уеб-съдържание,трансформация,преобразуване 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.title=Markdown към PDF
home.MarkdownToPDF.desc=Преобразува всеки Markdown файл към PDF home.MarkdownToPDF.desc=Преобразува всеки Markdown файл към PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML a PDF
home.HTMLToPDF.desc=Converteix qualsevol fitxer HTML o arxiu comprimit a PDF home.HTMLToPDF.desc=Converteix qualsevol fitxer HTML o arxiu comprimit a PDF
HTMLToPDF.tags=marcatge,contingut web,transformació,convertir 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.title=Markdown a PDF
home.MarkdownToPDF.desc=Converteix qualsevol fitxer Markdown a PDF home.MarkdownToPDF.desc=Converteix qualsevol fitxer Markdown a PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML na PDF
home.HTMLToPDF.desc=Převádí libovolný HTML soubor nebo zip 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 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.title=Markdown na PDF
home.MarkdownToPDF.desc=Převádí libovolný Markdown soubor na PDF home.MarkdownToPDF.desc=Převádí libovolný Markdown soubor na PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML til PDF
home.HTMLToPDF.desc=Konverterer enhver HTML-fil eller zip til PDF home.HTMLToPDF.desc=Konverterer enhver HTML-fil eller zip til PDF
HTMLToPDF.tags=markup,webindhold,transformation,konvertér 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.title=Markdown til PDF
home.MarkdownToPDF.desc=Konverterer enhver Markdown-fil til PDF home.MarkdownToPDF.desc=Konverterer enhver Markdown-fil til PDF

View File

@ -621,22 +621,6 @@ home.HTMLToPDF.title=HTML zu PDF
home.HTMLToPDF.desc=Konvertiert jede HTML-Datei oder Zip-Archiv zu PDF home.HTMLToPDF.desc=Konvertiert jede HTML-Datei oder Zip-Archiv zu PDF
HTMLToPDF.tags=markup,webinhalt,transformation,konvertierung 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.title=Markdown zu PDF
home.MarkdownToPDF.desc=Konvertiert jede Markdown-Datei zu PDF home.MarkdownToPDF.desc=Konvertiert jede Markdown-Datei zu PDF

View File

@ -621,22 +621,6 @@ home.HTMLToPDF.title=HTML σε PDF
home.HTMLToPDF.desc=Μετατρέπει οποιοδήποτε αρχείο HTML ή zip σε PDF home.HTMLToPDF.desc=Μετατρέπει οποιοδήποτε αρχείο HTML ή zip σε PDF
HTMLToPDF.tags=markup,περιεχόμενο-web,μετατροπή,μετατροπή 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.title=Markdown σε PDF
home.MarkdownToPDF.desc=Μετατρέπει οποιοδήποτε αρχείο Markdown σε PDF home.MarkdownToPDF.desc=Μετατρέπει οποιοδήποτε αρχείο Markdown σε PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert 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.title=Markdown to PDF
home.MarkdownToPDF.desc=Converts any Markdown file to PDF home.MarkdownToPDF.desc=Converts any Markdown file to PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML to PDF
home.HTMLToPDF.desc=Converts any HTML file or zip to PDF home.HTMLToPDF.desc=Converts any HTML file or zip to PDF
HTMLToPDF.tags=markup,web-content,transformation,convert 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.title=Markdown to PDF
home.MarkdownToPDF.desc=Converts any Markdown file to PDF home.MarkdownToPDF.desc=Converts any Markdown file to PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML a PDF
home.HTMLToPDF.desc=Convierte cualquier archivo HTML o ZIP a PDF home.HTMLToPDF.desc=Convierte cualquier archivo HTML o ZIP a PDF
HTMLToPDF.tags=margen,contenido web,transformación,convertir 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.title=Markdown a PDF
home.MarkdownToPDF.desc=Convierte cualquier archivo Markdown a PDF home.MarkdownToPDF.desc=Convierte cualquier archivo Markdown a PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML PDF-ra
home.HTMLToPDF.desc=Bihurtu edozein HTML edo zip fitxategi PDFra home.HTMLToPDF.desc=Bihurtu edozein HTML edo zip fitxategi PDFra
HTMLToPDF.tags=markup,web-content,transformation,convert 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.title=Markdown PDF-ra
home.MarkdownToPDF.desc=Bihurtu Markdown fitxategi guztiak PDF home.MarkdownToPDF.desc=Bihurtu Markdown fitxategi guztiak PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML به PDF
home.HTMLToPDF.desc=تبدیل هر فایل HTML یا زیپ به PDF home.HTMLToPDF.desc=تبدیل هر فایل HTML یا زیپ به PDF
HTMLToPDF.tags=مارک‌آپ،محتوای وب،تبدیل،تغییر 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.title=مارک‌داون به PDF
home.MarkdownToPDF.desc=تبدیل هر فایل مارک‌داون به PDF home.MarkdownToPDF.desc=تبدیل هر فایل مارک‌داون به PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML en PDF
home.HTMLToPDF.desc=Convertissez n'importe quel fichier HTML ou ZIP en PDF. home.HTMLToPDF.desc=Convertissez n'importe quel fichier HTML ou ZIP en PDF.
HTMLToPDF.tags=html,markup,contenu Web,transformation,convert 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.title=Markdown en PDF
home.MarkdownToPDF.desc=Convertissez n'importe quel fichier Markdown en PDF. home.MarkdownToPDF.desc=Convertissez n'importe quel fichier Markdown en PDF.

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML go PDF
home.HTMLToPDF.desc=Tiontaíonn aon chomhad HTML nó zip go PDF home.HTMLToPDF.desc=Tiontaíonn aon chomhad HTML nó zip go PDF
HTMLToPDF.tags=marcáil, ábhar gréasáin, claochlú, tiontú 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.title=Marcáil síos go PDF
home.MarkdownToPDF.desc=Tiontaíonn aon chomhad Markdown go PDF home.MarkdownToPDF.desc=Tiontaíonn aon chomhad Markdown go PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML से PDF
home.HTMLToPDF.desc=किसी भी HTML फ़ाइल या zip को PDF में बदलें home.HTMLToPDF.desc=किसी भी HTML फ़ाइल या zip को PDF में बदलें
HTMLToPDF.tags=मार्कअप,वेब-सामग्री,रूपांतरण,बदलें 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.title=Markdown से PDF
home.MarkdownToPDF.desc=किसी भी Markdown फ़ाइल को PDF में बदलें home.MarkdownToPDF.desc=किसी भी Markdown फ़ाइल को PDF में बदलें

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML u PDF
home.HTMLToPDF.desc=Pretvara bilo koji HTML datoteku ili zip u PDF home.HTMLToPDF.desc=Pretvara bilo koji HTML datoteku ili zip u PDF
HTMLToPDF.tags=oznake,web-sadržaj,transformacija,konvertiranje 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.title=Markdown u PDF
home.MarkdownToPDF.desc=Pretvara bilo koju Markdown datoteku u PDF home.MarkdownToPDF.desc=Pretvara bilo koju Markdown datoteku u PDF

View File

@ -621,22 +621,6 @@ home.HTMLToPDF.title=HTML konvertálása PDF-be
home.HTMLToPDF.desc=HTML fájl vagy ZIP 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 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.title=Markdown konvertálása PDF-be
home.MarkdownToPDF.desc=Markdown fájl konvertálása PDF-be home.MarkdownToPDF.desc=Markdown fájl konvertálása PDF-be

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML ke PDF
home.HTMLToPDF.desc=Mengonversi berkas HTML atau zip ke PDF home.HTMLToPDF.desc=Mengonversi berkas HTML atau zip ke PDF
HTMLToPDF.tags=markup, konten web, transformasi, konversi 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.title=Penurunan harga ke PDF
home.MarkdownToPDF.desc=Mengonversi berkas Markdown apa pun ke PDF home.MarkdownToPDF.desc=Mengonversi berkas Markdown apa pun ke PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=Da HTML a PDF
home.HTMLToPDF.desc=Converte qualsiasi file HTML o zip in PDF home.HTMLToPDF.desc=Converte qualsiasi file HTML o zip in PDF
HTMLToPDF.tags=markup,contenuto web,trasformazione,conversione 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.title=Markdown in PDF
home.MarkdownToPDF.desc=Converte qualsiasi file Markdown in PDF home.MarkdownToPDF.desc=Converte qualsiasi file Markdown in PDF

View File

@ -621,22 +621,6 @@ home.HTMLToPDF.title=HTMLをPDFに変換
home.HTMLToPDF.desc=HTMLファイルまたはzipをPDFに変換します。 home.HTMLToPDF.desc=HTMLファイルまたはzipをPDFに変換します。
HTMLToPDF.tags=markup,web-content,transformation,convert 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.title=MarkdownをPDFに変換
home.MarkdownToPDF.desc=あらゆるMarkdownファイルをPDFに変換します。 home.MarkdownToPDF.desc=あらゆるMarkdownファイルをPDFに変換します。

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML을 PDF로
home.HTMLToPDF.desc=HTML 파일이나 zip을 PDF로 변환 home.HTMLToPDF.desc=HTML 파일이나 zip을 PDF로 변환
HTMLToPDF.tags=마크업,웹-콘텐츠,변환,변환 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.title=Markdown을 PDF로
home.MarkdownToPDF.desc=Markdown 파일을 PDF로 변환 home.MarkdownToPDF.desc=Markdown 파일을 PDF로 변환

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML PDF-ലേക്ക്
home.HTMLToPDF.desc=ഏത് HTML ഫയലിനെയും അല്ലെങ്കിൽ സിപ്പിനെയും PDF-ലേക്ക് മാറ്റുന്നു home.HTMLToPDF.desc=ഏത് HTML ഫയലിനെയും അല്ലെങ്കിൽ സിപ്പിനെയും PDF-ലേക്ക് മാറ്റുന്നു
HTMLToPDF.tags=മാർക്ക്അപ്പ്,വെബ്-ഉള്ളടക്കം,രൂപാന്തരം,പരിവർത്തനം ചെയ്യുക 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.title=മാർക്ക്ഡൗൺ PDF-ലേക്ക്
home.MarkdownToPDF.desc=ഏത് മാർക്ക്ഡൗൺ ഫയലിനെയും PDF-ലേക്ക് മാറ്റുന്നു home.MarkdownToPDF.desc=ഏത് മാർക്ക്ഡൗൺ ഫയലിനെയും PDF-ലേക്ക് മാറ്റുന്നു

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML naar PDF
home.HTMLToPDF.desc=Zet HTML-bestand of zip om naar PDF home.HTMLToPDF.desc=Zet HTML-bestand of zip om naar PDF
HTMLToPDF.tags=markup,web-inhoud,transformatie,omzetten 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.title=Markdown naar PDF
home.MarkdownToPDF.desc=Zet Markdown-bestand om naar PDF home.MarkdownToPDF.desc=Zet Markdown-bestand om naar PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML til PDF
home.HTMLToPDF.desc=Konverter hvilken som helst HTML-fil eller zip til PDF home.HTMLToPDF.desc=Konverter hvilken som helst HTML-fil eller zip til PDF
HTMLToPDF.tags=markup,web-innhold,transformasjon,konverter 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.title=Markdown til PDF
home.MarkdownToPDF.desc=Konverter hvilken som helst Markdown-fil til PDF home.MarkdownToPDF.desc=Konverter hvilken som helst Markdown-fil til PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML do PDF
home.HTMLToPDF.desc=Zapisuje podany plik HTML/ZIP do PDF home.HTMLToPDF.desc=Zapisuje podany plik HTML/ZIP do PDF
HTMLToPDF.tags=znaczniki, treść internetowa, transformacja, konwertowanie 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.title=Markdown do PDF
home.MarkdownToPDF.desc=Zapisuje dokument Markdown do PDF home.MarkdownToPDF.desc=Zapisuje dokument Markdown do PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML para PDF
home.HTMLToPDF.desc=Converter qualquer arquivo HTML ou zip para PDF. home.HTMLToPDF.desc=Converter qualquer arquivo HTML ou zip para PDF.
HTMLToPDF.tags=marcação,conteúdo-web,transformação,converter 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.title=Markdown para PDF
home.MarkdownToPDF.desc=Converte qualquer arquivo Markdown para PDF. home.MarkdownToPDF.desc=Converte qualquer arquivo Markdown para PDF.

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML para PDF
home.HTMLToPDF.desc=Converte qualquer ficheiro HTML ou zip para PDF home.HTMLToPDF.desc=Converte qualquer ficheiro HTML ou zip para PDF
HTMLToPDF.tags=marcação,conteúdo-web,transformação,converter 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.title=Markdown para PDF
home.MarkdownToPDF.desc=Converte qualquer ficheiro Markdown para PDF home.MarkdownToPDF.desc=Converte qualquer ficheiro Markdown para PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML în PDF
home.HTMLToPDF.desc=Convertește orice fișier HTML sau zip în PDF home.HTMLToPDF.desc=Convertește orice fișier HTML sau zip în PDF
HTMLToPDF.tags=markup,conținut-web,transformare,convertește 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.title=Markdown în PDF
home.MarkdownToPDF.desc=Convertește orice fișier Markdown în PDF home.MarkdownToPDF.desc=Convertește orice fișier Markdown în PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML в PDF
home.HTMLToPDF.desc=Преобразует любой HTML-файл или zip в PDF home.HTMLToPDF.desc=Преобразует любой HTML-файл или zip в PDF
HTMLToPDF.tags=разметка,веб-контент,преобразование,конвертация 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.title=Markdown в PDF
home.MarkdownToPDF.desc=Преобразует любой файл Markdown в PDF home.MarkdownToPDF.desc=Преобразует любой файл Markdown в PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML do PDF
home.HTMLToPDF.desc=Konvertuje akýkoľvek HTML súbor alebo zip do PDF home.HTMLToPDF.desc=Konvertuje akýkoľvek HTML súbor alebo zip do PDF
HTMLToPDF.tags=markup, webový obsah, transformácia, konvertovať 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.title=Markdown do PDF
home.MarkdownToPDF.desc=Konvertuje akýkoľvek Markdown súbor do PDF home.MarkdownToPDF.desc=Konvertuje akýkoľvek Markdown súbor do PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML v PDF
home.HTMLToPDF.desc=Pretvori katero koli datoteko HTML ali zip v PDF home.HTMLToPDF.desc=Pretvori katero koli datoteko HTML ali zip v PDF
HTMLToPDF.tags=markup,web-content,transformation,convert 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.title=Markdown v PDF
home.MarkdownToPDF.desc=Pretvori katero koli datoteko Markdown v PDF home.MarkdownToPDF.desc=Pretvori katero koli datoteko Markdown v PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML u PDF
home.HTMLToPDF.desc=Konvertuje bilo koji HTML fajl ili zip u PDF home.HTMLToPDF.desc=Konvertuje bilo koji HTML fajl ili zip u PDF
HTMLToPDF.tags=oznake,web-sadržaj,transformacija,konvertovanje 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.title=Markdown u PDF
home.MarkdownToPDF.desc=Konvertuje bilo koji Markdown fajl u PDF home.MarkdownToPDF.desc=Konvertuje bilo koji Markdown fajl u PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML till PDF
home.HTMLToPDF.desc=Konverterar valfri HTML-fil eller zip till PDF home.HTMLToPDF.desc=Konverterar valfri HTML-fil eller zip till PDF
HTMLToPDF.tags=markup,webbinnehåll,transformation,konvertera 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.title=Markdown till PDF
home.MarkdownToPDF.desc=Konverterar valfri Markdown-fil till PDF home.MarkdownToPDF.desc=Konverterar valfri Markdown-fil till PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML เป็น PDF
home.HTMLToPDF.desc=แปลงไฟล์ HTML หรือ zip เป็น PDF home.HTMLToPDF.desc=แปลงไฟล์ HTML หรือ zip เป็น PDF
HTMLToPDF.tags=มาร์กอัป, เนื้อหาเว็บ, การแปลง, การแปลง 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.title=Markdown เป็น PDF
home.MarkdownToPDF.desc=แปลงไฟล์ Markdown เป็น PDF home.MarkdownToPDF.desc=แปลงไฟล์ Markdown เป็น PDF

View File

@ -489,22 +489,6 @@ 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 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 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.title=Markdown'dan PDF'e
home.MarkdownToPDF.desc=Herhangi bir Markdown dosyasını PDF'e dönüştürür home.MarkdownToPDF.desc=Herhangi bir Markdown dosyasını PDF'e dönüştürür

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML в PDF
home.HTMLToPDF.desc=Конвертує будь-який HTML-файл або zip-файл у PDF. home.HTMLToPDF.desc=Конвертує будь-який HTML-файл або zip-файл у PDF.
HTMLToPDF.tags=розмітка,веб-контент,перетворення,конвертація 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.title=Markdown в PDF
home.MarkdownToPDF.desc=Конвертує будь-який файл Markdown у PDF home.MarkdownToPDF.desc=Конвертує будь-який файл Markdown у PDF

View File

@ -489,22 +489,6 @@ 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 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 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.title=Markdown sang PDF
home.MarkdownToPDF.desc=Chuyển đổi bất kỳ tệp Markdown nào thành PDF home.MarkdownToPDF.desc=Chuyển đổi bất kỳ tệp Markdown nào thành PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML 转 PDF
home.HTMLToPDF.desc=将任何 HTML 文件或 zip 文件转换为 PDF home.HTMLToPDF.desc=将任何 HTML 文件或 zip 文件转换为 PDF
HTMLToPDF.tags=标记、网页内容、转换、转换 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.title=Markdown 转 PDF
home.MarkdownToPDF.desc=将任何 Markdown 文件转换为 PDF home.MarkdownToPDF.desc=将任何 Markdown 文件转换为 PDF

View File

@ -489,22 +489,6 @@ home.HTMLToPDF.title=HTML 轉 PDF
home.HTMLToPDF.desc=將任何 HTML 檔案或壓縮檔轉換為 PDF home.HTMLToPDF.desc=將任何 HTML 檔案或壓縮檔轉換為 PDF
HTMLToPDF.tags=標記,網頁內容,轉換,轉檔 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.title=Markdown 轉 PDF
home.MarkdownToPDF.desc=將任何 Markdown 檔案轉換為 PDF home.MarkdownToPDF.desc=將任何 Markdown 檔案轉換為 PDF

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,93 +0,0 @@
<!DOCTYPE html>
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}"
xmlns:th="https://www.thymeleaf.org">
<head>
<th:block th:insert="~{fragments/common :: head(title=#{EMLToPDF.title}, header=#{EMLToPDF.header})}"></th:block>
</head>
<body>
<div id="page-container">
<div id="content-wrap">
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
<div class="container py-4">
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card shadow-sm">
<div class="card-body">
<div class="tool-header">
<span class="material-symbols-rounded tool-header-icon convertto">email</span>
<span class="tool-header-text" th:text="#{EMLToPDF.header}"></span>
</div>
<form method="post" enctype="multipart/form-data" th:action="@{'/api/v1/convert/eml/pdf'}" class="mt-4">
<div th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='.eml,message/rfc822')}">
</div>
<div class="form-check mb-3">
<input type="checkbox" class="form-check-input" name="downloadHtml" id="downloadHtml">
<label class="form-check-label" for="downloadHtml" th:text="#{EMLToPDF.downloadHtml}"></label>
<div class="form-text" th:text="#{EMLToPDF.downloadHtmlHelp}"></div>
</div>
<div id="pdfOnlyOptions">
<div class="form-check mb-3">
<input type="checkbox" class="form-check-input" name="includeAttachments" id="includeAttachments" checked>
<label class="form-check-label" for="includeAttachments" th:text="#{EMLToPDF.includeAttachments}"></label>
</div>
<div class="mb-3">
<label for="maxAttachmentSizeMB" class="form-label" th:text="#{EMLToPDF.maxAttachmentSize}"></label>
<input type="number" class="form-control" id="maxAttachmentSizeMB" name="maxAttachmentSizeMB" value="10" min="1" max="100">
</div>
</div>
<div class="mb-4">
<button class="btn btn-outline-primary" type="button" data-bs-toggle="collapse"
data-bs-target="#info" aria-expanded="false" aria-controls="info" th:text="#{info}">
</button>
<div class="collapse mt-3" id="info">
<div class="card card-body">
<p class="mb-2" th:text="#{EMLToPDF.help}"></p>
<ul class="mb-0">
<li th:text="#{EMLToPDF.troubleshootingTip1}"></li>
<li th:text="#{EMLToPDF.troubleshootingTip2}"></li>
<li th:text="#{EMLToPDF.troubleshootingTip3}"></li>
</ul>
</div>
</div>
</div>
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{EMLToPDF.submit}"></button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div>
<script th:inline="javascript">
document.addEventListener('DOMContentLoaded', function() {
const downloadHtml = document.getElementById('downloadHtml');
const pdfOnlyOptions = document.getElementById('pdfOnlyOptions');
const submitBtn = document.getElementById('submitBtn');
function updateFormState() {
if (pdfOnlyOptions && submitBtn) {
pdfOnlyOptions.style.display = downloadHtml.checked ? 'none' : 'block';
submitBtn.textContent = downloadHtml.checked ? 'Download HTML' : '[[#{EMLToPDF.submit}]]';
}
}
if (downloadHtml) {
downloadHtml.addEventListener('change', updateFormState);
updateFormState();
}
});
</script>
</body>
</html>

View File

@ -22,13 +22,13 @@
<div class="mb-3"> <div class="mb-3">
<label th:text="#{PDFToText.selectText.1}"></label> <label th:text="#{PDFToText.selectText.1}"></label>
<select class="form-control" name="outputFormat"> <select class="form-control" name="outputFormat">
<option th:if="${@endpointConfiguration.isEndpointEnabled('pdf-to-rtf')}" value="rtf">RTF</option> <option th:if="${@endpointConfigurationService.isEndpointEnabled('pdf-to-rtf')}" value="rtf">RTF</option>
<option value="txt">TXT</option> <option value="txt">TXT</option>
</select> </select>
</div> </div>
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{PDFToText.submit}"></button> <button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{PDFToText.submit}"></button>
</form> </form>
<p th:if="${@endpointConfiguration.isEndpointEnabled('pdf-to-rtf')}" class="mt-3" th:text="#{PDFToText.credit}"></p> <p th:if="${@endpointConfigurationService.isEndpointEnabled('pdf-to-rtf')}" class="mt-3" th:text="#{PDFToText.credit}"></p>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,4 +1,4 @@
<div th:fragment="card" class="feature-card hidden" th:id="${id}" th:if="${@endpointConfiguration.isEndpointEnabled(cardLink)} " <div th:fragment="card" class="feature-card hidden" th:id="${id}" th:if="${@endpointConfigurationService.isEndpointEnabled(cardLink)} "
th:data-bs-tags="${tags}" th:data-bs-tags="${tags}"
th:data-bs-link="@{${endpoint}}"> th:data-bs-link="@{${endpoint}}">
<a th:href="${cardLink}"> <a th:href="${cardLink}">

View File

@ -4,7 +4,7 @@
<div th:replace="~{fragments/languageEntry :: languageEntry ('ca_CA', 'Català')}"></div> <div th:replace="~{fragments/languageEntry :: languageEntry ('ca_CA', 'Català')}"></div>
<div th:replace="~{fragments/languageEntry :: languageEntry ('zh_CN', '简体中文')}"></div> <div th:replace="~{fragments/languageEntry :: languageEntry ('zh_CN', '简体中文')}"></div>
<div th:replace="~{fragments/languageEntry :: languageEntry ('zh_TW', '繁體中文')}"></div> <div th:replace="~{fragments/languageEntry :: languageEntry ('zh_TW', '繁體中文')}"></div>
<div th:replace="~{fragments/languageEntry :: languageEntry ('bo_CN', 'བོད་ཡིག')}"></div> <div th:replace="~{fragments/languageEntry :: languageEntry ('zh_BO', 'བོད་ཡིག')}"></div>
<div th:replace="~{fragments/languageEntry :: languageEntry ('az_AZ', 'Azərbaycan Dili')}"></div> <div th:replace="~{fragments/languageEntry :: languageEntry ('az_AZ', 'Azərbaycan Dili')}"></div>
<div th:replace="~{fragments/languageEntry :: languageEntry ('da_DK', 'Dansk')}"></div> <div th:replace="~{fragments/languageEntry :: languageEntry ('da_DK', 'Dansk')}"></div>
<div th:replace="~{fragments/languageEntry :: languageEntry ('de_DE', 'Deutsch')}"></div> <div th:replace="~{fragments/languageEntry :: languageEntry ('de_DE', 'Deutsch')}"></div>

View File

@ -59,9 +59,6 @@
<div <div
th:replace="~{fragments/navbarEntry :: navbarEntry('markdown-to-pdf', 'markdown', 'home.MarkdownToPDF.title', 'home.MarkdownToPDF.desc', 'MarkdownToPDF.tags', 'convertto')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('markdown-to-pdf', 'markdown', 'home.MarkdownToPDF.title', 'home.MarkdownToPDF.desc', 'MarkdownToPDF.tags', 'convertto')}">
</div> </div>
<div
th:replace="~{fragments/navbarEntry :: navbarEntry('eml-to-pdf', 'email', 'home.EMLToPDF.title', 'home.EMLToPDF.desc', 'EMLToPDF.tags', 'convertto')}">
</div>
</div> </div>
</div> </div>
<div id="groupConvertFrom" class="feature-group"> <div id="groupConvertFrom" class="feature-group">
@ -267,7 +264,6 @@
<div <div
th:replace="~{fragments/navbarEntry :: navbarEntry('show-javascript', 'javascript', 'home.showJS.title', 'home.showJS.desc', 'showJS.tags', 'advance')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('show-javascript', 'javascript', 'home.showJS.title', 'home.showJS.desc', 'showJS.tags', 'advance')}">
</div> </div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry('fake-scan', 'scanner', 'fakeScan.title', 'fakeScan.description', 'fakeScan.tags', 'advance')}"></div>
<div <div
th:replace="~{fragments/navbarEntryCustom :: navbarEntry('split-by-size-or-count', '/images/split-size.svg#icon-split-size', 'home.autoSizeSplitPDF.title', 'home.autoSizeSplitPDF.desc', 'autoSizeSplitPDF.tags', 'advance')}"> th:replace="~{fragments/navbarEntryCustom :: navbarEntry('split-by-size-or-count', '/images/split-size.svg#icon-split-size', 'home.autoSizeSplitPDF.title', 'home.autoSizeSplitPDF.desc', 'autoSizeSplitPDF.tags', 'advance')}">
</div> </div>

View File

@ -57,7 +57,7 @@
</li> </li>
<li class="nav-item" th:if="${@endpointConfiguration.isEndpointEnabled('multi-tool')}"> <li class="nav-item" th:if="${@endpointConfigurationService.isEndpointEnabled('multi-tool')}">
<a class="nav-link" href="#" th:href="@{'/multi-tool'}" <a class="nav-link" href="#" th:href="@{'/multi-tool'}"
th:classappend="${currentPage}=='multi-tool' ? 'active' : ''" th:title="#{home.multiTool.desc}"> th:classappend="${currentPage}=='multi-tool' ? 'active' : ''" th:title="#{home.multiTool.desc}">
<span class="material-symbols-rounded"> <span class="material-symbols-rounded">
@ -67,7 +67,7 @@
</a> </a>
</li> </li>
<li class="nav-item" th:if="${@endpointConfiguration.isEndpointEnabled('pipeline')}"> <li class="nav-item" th:if="${@endpointConfigurationService.isEndpointEnabled('pipeline')}">
<a class="nav-link" href="#" th:href="@{'/pipeline'}" <a class="nav-link" href="#" th:href="@{'/pipeline'}"
th:classappend="${currentPage}=='pipeline' ? 'active' : ''" th:title="#{home.pipeline.desc}"> th:classappend="${currentPage}=='pipeline' ? 'active' : ''" th:title="#{home.pipeline.desc}">
<span class="material-symbols-rounded"> <span class="material-symbols-rounded">
@ -77,7 +77,7 @@
</a> </a>
</li> </li>
<li class="nav-item" th:if="${@endpointConfiguration.isEndpointEnabled('compress-pdf')}"> <li class="nav-item" th:if="${@endpointConfigurationService.isEndpointEnabled('compress-pdf')}">
<a class="nav-link" href="#" title="#{home.compressPdfs.title}" th:href="@{'/compress-pdf'}" <a class="nav-link" href="#" title="#{home.compressPdfs.title}" th:href="@{'/compress-pdf'}"
th:classappend="${currentPage}=='compress-pdf' ? 'active' : ''" th:title="#{home.compressPdfs.desc}"> th:classappend="${currentPage}=='compress-pdf' ? 'active' : ''" th:title="#{home.compressPdfs.desc}">
<span class="material-symbols-rounded"> <span class="material-symbols-rounded">

View File

@ -1,5 +1,5 @@
<th:block th:fragment="navbarEntry(endpoint, toolIcon, titleKey, descKey, tagKey, toolGroup)" <th:block th:fragment="navbarEntry(endpoint, toolIcon, titleKey, descKey, tagKey, toolGroup)"
th:if="${@endpointConfiguration.isEndpointEnabled(endpoint)}"> th:if="${@endpointConfigurationService.isEndpointEnabled(endpoint)}">
<a th:id="@{${endpoint}}" class="dropdown-item" style="position:relative" th:href="@{${endpoint}}" <a th:id="@{${endpoint}}" class="dropdown-item" style="position:relative" th:href="@{${endpoint}}"
th:data-bs-link="@{${endpoint}}" th:data-bs-link="@{${endpoint}}"
th:classappend="${endpoint.equals(currentPage)} ? ${toolGroup} + ' active' : '' + ${toolGroup}" th:classappend="${endpoint.equals(currentPage)} ? ${toolGroup} + ' active' : '' + ${toolGroup}"

View File

@ -1,5 +1,5 @@
<th:block th:fragment="navbarEntry(endpoint, toolIcon, titleKey, descKey, tagKey, toolGroup)" <th:block th:fragment="navbarEntry(endpoint, toolIcon, titleKey, descKey, tagKey, toolGroup)"
th:if="${@endpointConfiguration.isEndpointEnabled(endpoint)}"> th:if="${@endpointConfigurationService.isEndpointEnabled(endpoint)}">
<a th:id="@{${endpoint}}" class="dropdown-item" style="position:relative" th:href="@{${endpoint}}" <a th:id="@{${endpoint}}" class="dropdown-item" style="position:relative" th:href="@{${endpoint}}"
th:data-bs-link="@{${endpoint}}" th:data-bs-link="@{${endpoint}}"
th:classappend="${endpoint.equals(currentPage)} ? ${toolGroup} + ' active' : '' + ${toolGroup}" th:classappend="${endpoint.equals(currentPage)} ? ${toolGroup} + ' active' : '' + ${toolGroup}"

View File

@ -131,14 +131,20 @@
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p th:text="#{survey.meeting.1}">If you're using Stirling PDF at work, we'd love to speak to you. We're offering free technical support in exchange for a 15 minute user discovery session.</p> <p th:text="#{survey.meeting.1}">If you're using Stirling PDF at work, we'd love to speak to you. We're offering free
technical support in exchange for a 15 minute user discovery session.</p>
<p th:text="#{survey.meeting.2}">This is a chance to:</p> <p th:text="#{survey.meeting.2}">This is a chance to:</p>
<p><span>🛠️</span><span th:text="#{survey.meeting.3}">Get help with deployment, integrations, or troubleshooting</span></p> <p><span>🛠️</span><span th:text="#{survey.meeting.3}">Get help with deployment, integrations, or troubleshooting</span>
<p><span>📢</span><span th:text="#{survey.meeting.4}">Provide direct feedback on performance, edge cases, and feature gaps</span></p> </p>
<p><span>🔍</span><span th:text="#{survey.meeting.5}">Help us refine Stirling PDF for real-world enterprise use</span></p> <p><span>📢</span><span th:text="#{survey.meeting.4}">Provide direct feedback on performance, edge cases, and feature gaps</span>
</p>
<p><span>🔍</span><span th:text="#{survey.meeting.5}">Help us refine Stirling PDF for real-world enterprise use</span>
</p>
<p th:text="#{survey.meeting.6}">If you're interested, you can book time with our team directly.</p> <p th:text="#{survey.meeting.6}">If you're interested, you can book time with our team directly.</p>
<p th:text="#{survey.meeting.7}">Looking forward to digging into your use cases and making Stirling PDF even better!</p> <p th:text="#{survey.meeting.7}">Looking forward to digging into your use cases and making Stirling PDF even
<a href="https://calendly.com/d/crsr-tz6-487" target="_blank" class="btn btn-primary" id="takeSurvey2" th:text="#{survey.meeting.button}">Book meeting</a> better!</p>
<a href="https://calendly.com/d/crsr-tz6-487" target="_blank" class="btn btn-primary" id="takeSurvey2"
th:text="#{survey.meeting.button}">Book meeting</a>
</br> </br>
</br> </br>
<p th:text="#{survey.meeting.notInterested}">Not a business and/or interested in a meeting?</p> <p th:text="#{survey.meeting.notInterested}">Not a business and/or interested in a meeting?</p>
@ -181,9 +187,11 @@
</div> </div>
<div class="modal-footer justify-content-between"> <div class="modal-footer justify-content-between">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" onclick="setAnalytics(false)" <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" onclick="setAnalytics(false)"
th:text="#{analytics.disable}">Disable analytics</button> th:text="#{analytics.disable}">Disable analytics
</button>
<button type="button" class="btn btn-primary" th:text="#{analytics.enable}" <button type="button" class="btn btn-primary" th:text="#{analytics.enable}"
onclick="setAnalytics(true)">Enable analytics</button> onclick="setAnalytics(true)">Enable analytics
</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -12,85 +12,12 @@
<br><br> <br><br>
<div class="container"> <div class="container">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-6 bg-card"> <div class="col-md-6">
<div class="tool-header"> <h2 th:text="#{fakeScan.header}"></h2>
<span class="material-symbols-rounded tool-header-icon advance">scanner</span> <form method="post" enctype="multipart/form-data" th:action="@{'/api/v1/misc/fake-scan'}">
<span class="tool-header-text" th:text="#{fakeScan.title}"></span>
</div>
<form method="post" enctype="multipart/form-data" id="uploadForm" th:action="@{'/api/v1/misc/fake-scan'}">
<input type="hidden" name="advancedEnabled" id="advancedEnabled" value="false">
<div th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}"></div> <div th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}"></div>
<br> <br>
<div class="mb-3"> <button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{fakeScan.submit}"></button>
<label for="quality" class="form-label" th:text="#{fakeScan.quality}"></label>
<select class="form-select" id="quality" name="quality">
<option value="low" th:text="#{fakeScan.quality.low}"></option>
<option value="medium" th:text="#{fakeScan.quality.medium}"></option>
<option value="high" th:text="#{fakeScan.quality.high}" selected></option>
</select>
</div>
<div class="mb-3">
<label for="rotation" class="form-label" th:text="#{fakeScan.rotation}"></label>
<select class="form-select" id="rotation" name="rotation">
<option value="none" th:text="#{fakeScan.rotation.none}"></option>
<option value="slight" th:text="#{fakeScan.rotation.slight}" selected></option>
<option value="moderate" th:text="#{fakeScan.rotation.moderate}"></option>
<option value="severe" th:text="#{fakeScan.rotation.severe}"></option>
</select>
</div>
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" id="advancedSettingsToggle">
<label class="form-check-label" for="advancedSettingsToggle" th:text="#{fakeScan.advancedSettings}"></label>
</div>
<div id="advancedSettings" style="display:none; border:1px solid #eee; padding:1em; border-radius:8px; margin-bottom:1em;">
<div class="mb-3">
<label for="colorspace" class="form-label" th:text="#{fakeScan.colorspace}"></label>
<select class="form-select" id="colorspace" name="colorspace">
<option value="grayscale" th:text="#{fakeScan.colorspace.grayscale}" selected></option>
<option value="color" th:text="#{fakeScan.colorspace.color}"></option>
</select>
</div>
<div class="mb-3">
<label for="border" class="form-label" th:text="#{fakeScan.border}"></label>
<input type="number" class="form-control" id="border" name="border" min="0" max="100" value="20">
</div>
<div class="mb-3">
<label for="rotate" class="form-label" th:text="#{fakeScan.rotate}"></label>
<input type="number" class="form-control" id="rotate" name="rotate" min="-15" max="15" value="0">
</div>
<div class="mb-3">
<label for="rotateVariance" class="form-label" th:text="#{fakeScan.rotateVariance}"></label>
<input type="number" class="form-control" id="rotateVariance" name="rotateVariance" min="0" max="10" value="2">
</div>
<div class="mb-3">
<label for="brightness" class="form-label" th:text="#{fakeScan.brightness}"></label>
<input type="range" class="form-range" id="brightness" name="brightness" min="0.5" max="1.5" step="0.01" value="1.0">
</div>
<div class="mb-3">
<label for="contrast" class="form-label" th:text="#{fakeScan.contrast}"></label>
<input type="range" class="form-range" id="contrast" name="contrast" min="0.5" max="1.5" step="0.01" value="1.0">
</div>
<div class="mb-3">
<label for="blur" class="form-label" th:text="#{fakeScan.blur}"></label>
<input type="range" class="form-range" id="blur" name="blur" min="0" max="5" step="0.1" value="1.0">
</div>
<div class="mb-3">
<label for="noise" class="form-label" th:text="#{fakeScan.noise}"></label>
<input type="range" class="form-range" id="noise" name="noise" min="0" max="20" step="0.1" value="8.0">
</div>
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" id="yellowish" name="yellowish">
<label class="form-check-label" for="yellowish" th:text="#{fakeScan.yellowish}"></label>
</div>
<div class="mb-3">
<label for="resolution" class="form-label" th:text="#{fakeScan.resolution}"></label>
<input type="number" class="form-control" id="resolution" name="resolution" min="72" max="600" value="300">
</div>
</div>
<div class="mb-3 text-left">
<button type="submit" class="btn btn-primary" th:text="#{fakeScan.submit}" id="submitBtn"></button>
</div>
</form> </form>
</div> </div>
</div> </div>
@ -98,66 +25,5 @@
</div> </div>
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block> <th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div> </div>
<script th:src="@{'/js/fetch-utils.js'}"></script>
<script th:inline="javascript">
// Show/hide advanced settings
document.getElementById('advancedSettingsToggle').addEventListener('change', function() {
document.getElementById('advancedSettings').style.display = this.checked ? 'block' : 'none';
});
// Form submission handling
const form = document.getElementById('uploadForm');
if (form) {
form.addEventListener('submit', function(e) {
// If advanced settings are not enabled, remove advanced fields
if (!document.getElementById('advancedSettingsToggle').checked) {
const formData = new FormData(form);
formData.delete('colorspace');
formData.delete('border');
formData.delete('rotate');
formData.delete('rotateVariance');
formData.delete('brightness');
formData.delete('contrast');
formData.delete('blur');
formData.delete('noise');
formData.delete('yellowish');
formData.delete('resolution');
}
});
}
// Initialize advanced settings state
const advancedSettingsToggle = document.getElementById('advancedSettingsToggle');
const advancedSettings = document.getElementById('advancedSettings');
if (advancedSettingsToggle && advancedSettings) {
// Helper: enable/disable all fields in advanced settings
function setAdvancedFieldsEnabled(enabled) {
const fields = advancedSettings.querySelectorAll('input, select');
fields.forEach(field => {
field.disabled = !enabled;
// If enabling and value is empty, set to default
if (enabled && (field.value === '' || field.value == null)) {
if (field.type === 'number' || field.type === 'range') {
field.value = field.defaultValue;
} else if (field.type === 'checkbox') {
field.checked = field.defaultChecked;
} else if (field.tagName === 'SELECT') {
field.value = field.querySelector('option[selected]')?.value || field.options[0].value;
}
}
});
}
// Set initial state
setAdvancedFieldsEnabled(advancedSettingsToggle.checked);
advancedSettings.style.display = advancedSettingsToggle.checked ? 'block' : 'none';
document.getElementById('advancedEnabled').value = advancedSettingsToggle.checked ? 'true' : 'false';
// Add change listener
advancedSettingsToggle.addEventListener('change', function() {
advancedSettings.style.display = this.checked ? 'block' : 'none';
setAdvancedFieldsEnabled(this.checked);
document.getElementById('advancedEnabled').value = this.checked ? 'true' : 'false';
});
}
</script>
</body> </body>
</html> </html>

View File

@ -11,7 +11,7 @@
<br><br> <br><br>
<div class="container"> <div class="container">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-7 bg-card"> <div class="col-md-6 bg-card">
<div class="tool-header"> <div class="tool-header">
<span class="material-symbols-rounded tool-header-icon other">info</span> <span class="material-symbols-rounded tool-header-icon other">info</span>
<span class="tool-header-text" th:text="#{getPdfInfo.header}"></span> <span class="tool-header-text" th:text="#{getPdfInfo.header}"></span>
@ -22,82 +22,6 @@
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{getPdfInfo.submit}"></button> <button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{getPdfInfo.submit}"></button>
</form> </form>
<div class="container mt-0"> <div class="container mt-0">
<!-- PDF Summary section -->
<div id="pdf-summary" class="card mt-3 mb-3" style="display: none;">
<div class="card-header">
<h5 class="mb-0" id="summary-heading">PDF Summary</h5>
</div>
<div class="card-body">
<!-- Quick overview of key details -->
<div class="row">
<div class="col-md-6">
<h6 id="summary-basic-info-heading">Basic Information</h6>
<ul class="list-unstyled">
<li><strong>Pages:</strong> <span id="summary-pages">-</span></li>
<li><strong>File Size:</strong> <span id="summary-size">-</span></li>
<li><strong>PDF Version:</strong> <span id="summary-version">-</span></li>
<li><strong>Language:</strong> <span id="summary-language">-</span></li>
</ul>
</div>
<div class="col-md-6">
<h6 id="summary-doc-info-heading">Document Information</h6>
<ul class="list-unstyled">
<li><strong>Title:</strong> <span id="summary-title">-</span></li>
<li><strong>Author:</strong> <span id="summary-author">-</span></li>
<li><strong>Created:</strong> <span id="summary-created">-</span></li>
<li><strong>Modified:</strong> <span id="summary-modified">-</span></li>
</ul>
</div>
</div>
<!-- Security section -->
<div class="mt-4 mb-3">
<h6 id="summary-security-heading">Security Status</h6>
<div class="row">
<div class="col-md-4">
<div id="encryption-status" class="card mb-2 h-100">
<div class="card-body p-2 d-flex align-items-center">
<span id="encryption-icon" class="me-2"><i class="bi bi-lock"></i></span>
<span id="encryption-text" class="small">Encryption: Unknown</span>
</div>
</div>
</div>
<div class="col-md-4">
<div id="permissions-status" class="card mb-2 h-100">
<div class="card-body p-2 d-flex align-items-center">
<span id="permissions-icon" class="me-2"><i class="bi bi-shield"></i></span>
<span id="permissions-text" class="small">Permissions: Unknown</span>
</div>
</div>
</div>
<div class="col-md-4">
<div id="compliance-status" class="card mb-2 h-100">
<div class="card-body p-2 d-flex align-items-center">
<span id="compliance-icon" class="me-2"><i class="bi bi-check-circle"></i></span>
<span id="compliance-text" class="small">Compliance: Unknown</span>
</div>
</div>
</div>
</div>
</div>
<!-- Detailed alerts -->
<div id="summary-alerts" class="mt-3">
<!-- Will be populated with detailed alerts for encryption, permissions, etc. -->
</div>
<!-- Descriptive note about PDF characteristics -->
<div class="card mt-3">
<div class="card-header">
<h6 class="mb-0">PDF Overview</h6>
</div>
<div class="card-body">
<p id="summary-text" class="mb-0"></p>
</div>
</div>
</div>
</div>
<!-- Iterate over each main section in the JSON --> <!-- Iterate over each main section in the JSON -->
<div id="json-content"> <div id="json-content">
<!-- JavaScript will populate this section --> <!-- JavaScript will populate this section -->
@ -107,379 +31,21 @@
<a href="#" id="downloadJson" class="btn btn-primary mt-3" style="display: none;" th:text="#{getPdfInfo.downloadJson}">Download JSON</a> <a href="#" id="downloadJson" class="btn btn-primary mt-3" style="display: none;" th:text="#{getPdfInfo.downloadJson}">Download JSON</a>
</div> </div>
<script th:src="@{'/js/fetch-utils.js'}"></script> <script th:src="@{'/js/fetch-utils.js'}"></script>
<script th:inline="javascript"> <script>
// Pre-load message translations
const getPdfInfoSummary = /*[[#{getPdfInfo.summary}]]*/ "PDF Summary";
const getPdfInfoSummaryEncrypted = /*[[#{getPdfInfo.summary.encrypted}]]*/ "This PDF is encrypted so may face issues with some applications";
const getPdfInfoSummaryPermissions = /*[[#{getPdfInfo.summary.permissions}]]*/ "This PDF has {0} restricted permissions which may limit what you can do with it";
const getPdfInfoSummaryCompliance = /*[[#{getPdfInfo.summary.compliance}]]*/ "This PDF complies with the {0} standard, meaning it is suitable for {1}";
const getPdfInfoSummaryBasicInfo = /*[[#{getPdfInfo.summary.basicInfo}]]*/ "Basic Information";
const getPdfInfoSummaryDocInfo = /*[[#{getPdfInfo.summary.docInfo}]]*/ "Document Information";
const getPdfInfoSummarySecuritySection = /*[[#{getPdfInfo.summary.security.section}]]*/ "Security Status";
const getPdfInfoSummaryEncryptedAlert = /*[[#{getPdfInfo.summary.encrypted.alert}]]*/ "Encrypted PDF - This document is password protected";
const getPdfInfoSummaryNotEncryptedAlert = /*[[#{getPdfInfo.summary.not.encrypted.alert}]]*/ "Unencrypted PDF - No password protection";
const getPdfInfoSummaryPermissionsAlert = /*[[#{getPdfInfo.summary.permissions.alert}]]*/ "Restricted Permissions - {0} actions are not allowed";
const getPdfInfoSummaryAllPermissionsAlert = /*[[#{getPdfInfo.summary.all.permissions.alert}]]*/ "All Permissions Allowed";
const getPdfInfoSummaryComplianceAlert = /*[[#{getPdfInfo.summary.compliance.alert}]]*/ "{0} Compliant";
const getPdfInfoSummaryNoComplianceAlert = /*[[#{getPdfInfo.summary.no.compliance.alert}]]*/ "No Compliance Standards";
// Update the summary headings
document.addEventListener('DOMContentLoaded', function() {
document.getElementById('summary-heading').textContent = getPdfInfoSummary;
document.getElementById('summary-basic-info-heading').textContent = getPdfInfoSummaryBasicInfo;
document.getElementById('summary-doc-info-heading').textContent = getPdfInfoSummaryDocInfo;
document.getElementById('summary-security-heading').textContent = getPdfInfoSummarySecuritySection;
});
// Pre-load section descriptions
const getPdfInfoSectionBasicInfo = /*[[#{getPdfInfo.section.BasicInfo}]]*/ "Basic Information about the PDF document including file size, page count, and language";
const getPdfInfoSectionMetadata = /*[[#{getPdfInfo.section.Metadata}]]*/ "Document metadata including title, author, creation date and other document properties";
const getPdfInfoSectionDocumentInfo = /*[[#{getPdfInfo.section.DocumentInfo}]]*/ "Technical details about the PDF document structure and version";
const getPdfInfoSectionCompliancy = /*[[#{getPdfInfo.section.Compliancy}]]*/ "PDF standards compliance information (PDF/A, PDF/X, etc.)";
const getPdfInfoSectionEncryption = /*[[#{getPdfInfo.section.Encryption}]]*/ "Security and encryption details of the document";
const getPdfInfoSectionPermissions = /*[[#{getPdfInfo.section.Permissions}]]*/ "Document permission settings that control what actions can be performed";
const getPdfInfoSectionOther = /*[[#{getPdfInfo.section.Other}]]*/ "Additional document components like bookmarks, layers, and embedded files";
const getPdfInfoSectionFormFields = /*[[#{getPdfInfo.section.FormFields}]]*/ "Interactive form fields present in the document";
const getPdfInfoSectionPerPageInfo = /*[[#{getPdfInfo.section.PerPageInfo}]]*/ "Detailed information about each page in the document";
document.getElementById("pdfInfoForm").addEventListener("submit", function(event) { document.getElementById("pdfInfoForm").addEventListener("submit", function(event) {
event.preventDefault(); event.preventDefault();
// Clear previous results when submitting a new form
document.getElementById('json-content').innerHTML = '';
document.getElementById('pdf-summary').style.display = 'none';
document.getElementById('downloadJson').style.display = 'none';
const formData = new FormData(event.target); const formData = new FormData(event.target);
fetchWithCsrf('api/v1/security/get-info-on-pdf', { fetchWithCsrf('api/v1/security/get-info-on-pdf', {
method: 'POST', method: 'POST',
body: formData body: formData
}).then(response => response.json()).then(data => { }).then(response => response.json()).then(data => {
// Populate and display the enhanced PDF summary
populateSummarySection(data);
displayJsonData(data); displayJsonData(data);
setDownloadLink(data); setDownloadLink(data);
document.getElementById("downloadJson").style.display = "block"; document.getElementById("downloadJson").style.display = "block";
}).catch(error => console.error('Error:', error)); }).catch(error => console.error('Error:', error));
// Function to reset all summary elements to default state
function resetSummaryElements() {
// Reset basic information fields
document.getElementById('summary-pages').textContent = '-';
document.getElementById('summary-size').textContent = '-';
document.getElementById('summary-version').textContent = '-';
document.getElementById('summary-language').textContent = '-';
// Reset document information fields
document.getElementById('summary-title').textContent = '-';
document.getElementById('summary-author').textContent = '-';
document.getElementById('summary-created').textContent = '-';
document.getElementById('summary-modified').textContent = '-';
// Reset security status cards
const cards = ['encryption-status', 'permissions-status', 'compliance-status'];
cards.forEach(id => {
const card = document.getElementById(id);
// Remove all classes except the base ones
card.className = 'card mb-2 h-100';
});
// Reset status text and icons
document.getElementById('encryption-icon').innerHTML = '<i class="bi bi-lock"></i>';
document.getElementById('encryption-text').textContent = 'Encryption: Unknown';
document.getElementById('permissions-icon').innerHTML = '<i class="bi bi-shield"></i>';
document.getElementById('permissions-text').textContent = 'Permissions: Unknown';
document.getElementById('compliance-icon').innerHTML = '<i class="bi bi-check-circle"></i>';
document.getElementById('compliance-text').textContent = 'Compliance: Unknown';
// Clear alerts container
document.getElementById('summary-alerts').innerHTML = '';
// Reset summary text
document.getElementById('summary-text').innerHTML = '';
}
// Function to populate the enhanced summary section
function populateSummarySection(data) {
// Reset all elements first
resetSummaryElements();
// Get basic information
if (data.BasicInfo) {
document.getElementById('summary-pages').textContent = data.BasicInfo["Number of pages"] || "-";
// Format file size nicely
let fileSize = data.BasicInfo["FileSizeInBytes"];
if (fileSize) {
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
const i = Math.floor(Math.log(fileSize) / Math.log(1024));
fileSize = (fileSize / Math.pow(1024, i)).toFixed(2) + ' ' + sizes[i];
document.getElementById('summary-size').textContent = fileSize;
}
document.getElementById('summary-language').textContent = data.BasicInfo["Language"] || "-";
}
// Get document information
if (data.DocumentInfo) {
document.getElementById('summary-version').textContent = data.DocumentInfo["PDF version"] || "-";
}
// Get metadata
if (data.Metadata) {
document.getElementById('summary-title').textContent = data.Metadata["Title"] || "-";
document.getElementById('summary-author').textContent = data.Metadata["Author"] || "-";
document.getElementById('summary-created').textContent = data.Metadata["CreationDate"] || "-";
document.getElementById('summary-modified').textContent = data.Metadata["ModificationDate"] || "-";
}
// Update security status cards
// Encryption status
const encryptionStatusCard = document.getElementById('encryption-status');
const encryptionIcon = document.getElementById('encryption-icon');
const encryptionText = document.getElementById('encryption-text');
if (data.Encryption && data.Encryption.IsEncrypted) {
encryptionIcon.innerHTML = '<i class="bi bi-lock-fill"></i>';
encryptionText.textContent = getPdfInfoSummaryEncryptedAlert;
} else {
encryptionIcon.innerHTML = '<i class="bi bi-unlock-fill"></i>';
encryptionText.textContent = getPdfInfoSummaryNotEncryptedAlert;
}
// Permissions status
const permissionsStatusCard = document.getElementById('permissions-status');
const permissionsIcon = document.getElementById('permissions-icon');
const permissionsText = document.getElementById('permissions-text');
let restrictedPermissions = [];
if (data.Permissions) {
for (const [permission, state] of Object.entries(data.Permissions)) {
if (state === "Not Allowed") {
restrictedPermissions.push(permission);
}
}
}
if (restrictedPermissions.length > 0) {
permissionsIcon.innerHTML = '<i class="bi bi-shield-lock-fill"></i>';
const formattedAlert = getPdfInfoSummaryPermissionsAlert.replace('{0}', restrictedPermissions.length);
permissionsText.textContent = formattedAlert;
} else {
permissionsIcon.innerHTML = '<i class="bi bi-shield-check"></i>';
permissionsText.textContent = getPdfInfoSummaryAllPermissionsAlert;
}
// Compliance status
const complianceStatusCard = document.getElementById('compliance-status');
const complianceIcon = document.getElementById('compliance-icon');
const complianceText = document.getElementById('compliance-text');
let hasCompliance = false;
let compliantStandards = [];
if (data.Compliancy) {
for (const [standard, compliant] of Object.entries(data.Compliancy)) {
if (compliant === true) {
hasCompliance = true;
const standardName = standard.replace("Is", "").replace("Compliant", "");
compliantStandards.push(standardName);
}
}
}
if (hasCompliance) {
complianceIcon.innerHTML = '<i class="bi bi-check-circle-fill"></i>';
const formattedAlert = getPdfInfoSummaryComplianceAlert.replace('{0}', compliantStandards.join(', '));
complianceText.textContent = formattedAlert;
} else {
complianceIcon.innerHTML = '<i class="bi bi-dash-circle"></i>';
complianceText.textContent = getPdfInfoSummaryNoComplianceAlert;
}
// Create detailed characteristic alerts
const alertsContainer = document.getElementById('summary-alerts');
// Clear previous alerts
alertsContainer.innerHTML = '';
// Create a single comprehensive security details section
let hasSummaryInfo = false;
// Create a consolidated security details card if there are security details worth highlighting
if ((data.Encryption && data.Encryption.IsEncrypted) ||
restrictedPermissions.length > 0 ||
hasCompliance) {
const securityDetailsCard = document.createElement('div');
securityDetailsCard.className = 'card mt-3 mb-3';
const cardHeader = document.createElement('div');
cardHeader.className = 'card-header';
cardHeader.innerHTML = '<h6 class="mb-0">Detailed Security Information</h6>';
securityDetailsCard.appendChild(cardHeader);
const cardBody = document.createElement('div');
cardBody.className = 'card-body';
// Add detailed encryption info
if (data.Encryption && data.Encryption.IsEncrypted) {
const encryptionDiv = document.createElement('div');
encryptionDiv.className = 'mb-3';
encryptionDiv.innerHTML = '<h6>Encryption Details:</h6>';
const encryptionList = document.createElement('ul');
encryptionList.className = 'list-unstyled';
if (data.Encryption.EncryptionAlgorithm) {
encryptionList.innerHTML += `<li><strong>Algorithm:</strong> ${data.Encryption.EncryptionAlgorithm}</li>`;
}
if (data.Encryption.KeyLength) {
encryptionList.innerHTML += `<li><strong>Key Length:</strong> ${data.Encryption.KeyLength} bits</li>`;
}
encryptionDiv.appendChild(encryptionList);
cardBody.appendChild(encryptionDiv);
hasSummaryInfo = true;
}
// Add detailed permissions info
if (restrictedPermissions.length > 0) {
const permissionsDiv = document.createElement('div');
permissionsDiv.className = 'mb-3';
permissionsDiv.innerHTML = '<h6>Restricted Permissions:</h6>';
const permissionsList = document.createElement('ul');
restrictedPermissions.forEach(perm => {
permissionsList.innerHTML += `<li>${perm}</li>`;
});
permissionsDiv.appendChild(permissionsList);
cardBody.appendChild(permissionsDiv);
hasSummaryInfo = true;
}
// Add detailed compliance info
if (hasCompliance) {
const complianceDiv = document.createElement('div');
complianceDiv.className = 'mb-3';
complianceDiv.innerHTML = '<h6>Standards Compliance:</h6>';
const complianceList = document.createElement('ul');
complianceList.className = 'list-unstyled';
compliantStandards.forEach(standard => {
let standardDescription = '';
// Add brief descriptions for standards
if (standard === "PDF/A") {
standardDescription = 'ISO standard for long-term document archiving';
} else if (standard === "PDF/X") {
standardDescription = 'ISO standard for printing and graphic arts exchange';
} else if (standard === "PDF/UA") {
standardDescription = 'ISO standard for universal accessibility';
} else if (standard === "PDF/E") {
standardDescription = 'ISO standard for engineering documents';
} else if (standard === "PDF/VT") {
standardDescription = 'ISO standard for variable and transactional printing';
}
complianceList.innerHTML += `<li><strong>${standard}:</strong> ${standardDescription}</li>`;
});
complianceDiv.appendChild(complianceList);
cardBody.appendChild(complianceDiv);
hasSummaryInfo = true;
}
securityDetailsCard.appendChild(cardBody);
if (hasSummaryInfo) {
alertsContainer.appendChild(securityDetailsCard);
}
}
// Generate a general document summary
const summaryTextElement = document.getElementById('summary-text');
// Create a general summary for the document
let generalSummary = `This is a ${data.BasicInfo["Number of pages"] || "multi"}-page PDF`;
if (data.Metadata && data.Metadata["Title"]) {
generalSummary += ` titled "${data.Metadata["Title"]}"`;
}
if (data.Metadata && data.Metadata["Author"]) {
generalSummary += ` created by ${data.Metadata["Author"]}`;
}
if (data.DocumentInfo && data.DocumentInfo["PDF version"]) {
generalSummary += ` (PDF version ${data.DocumentInfo["PDF version"]})`;
}
// Add security information to the general summary if relevant
if (data.Encryption && data.Encryption.IsEncrypted) {
generalSummary += '. The document is password protected';
if (data.Encryption.EncryptionAlgorithm) {
generalSummary += ` using ${data.Encryption.EncryptionAlgorithm}`;
if (data.Encryption.KeyLength) {
generalSummary += ` (${data.Encryption.KeyLength} bit)`;
}
}
}
if (restrictedPermissions.length > 0) {
generalSummary += `. It has ${restrictedPermissions.length} restricted permissions`;
}
// Add compliance standards if available
if (hasCompliance && compliantStandards.length > 0) {
generalSummary += `. This document complies with the ${compliantStandards.join(', ')} PDF standard${compliantStandards.length > 1 ? 's' : ''}`;
}
generalSummary += '.';
// Remove SummaryData from JSON to avoid duplication
if (data.SummaryData) {
delete data.SummaryData;
}
summaryTextElement.innerHTML = generalSummary;
// Display the summary section
document.getElementById('pdf-summary').style.display = 'block';
}
function generateSummaryFromData(summaryData) {
let summary = [];
// Handle encryption information
if (summaryData.encrypted) {
summary.push(getPdfInfoSummaryEncrypted);
}
// Handle permissions information
if (summaryData.restrictedPermissions && summaryData.restrictedPermissions.length > 0) {
const formattedPermissionsText = getPdfInfoSummaryPermissions.replace('{0}', summaryData.restrictedPermissionsCount);
summary.push(formattedPermissionsText);
}
// Handle standard compliance information
if (summaryData.standardCompliance) {
const formattedComplianceText = getPdfInfoSummaryCompliance
.replace('{0}', summaryData.standardCompliance);
summary.push(formattedComplianceText);
}
return summary.join(' ');
}
}); });
function displayJsonData(jsonData) { function displayJsonData(jsonData) {
@ -511,9 +77,8 @@
header.className = 'card-header'; header.className = 'card-header';
header.id = `${safeKey}-heading-${depth}`; header.id = `${safeKey}-heading-${depth}`;
const h5Elem = document.createElement('h5'); const h5Elem = document.createElement('h5');
h5Elem.className = 'mb-0 d-flex align-items-center'; h5Elem.className = 'mb-0';
// Create the main content (button or text)
if (key === 'XMPMetadata' && typeof value === "string") { if (key === 'XMPMetadata' && typeof value === "string") {
const buttonElem = createButtonElement(key, safeKey, depth); const buttonElem = createButtonElement(key, safeKey, depth);
h5Elem.appendChild(buttonElem); h5Elem.appendChild(buttonElem);
@ -530,8 +95,6 @@
h5Elem.textContent = `${key}: ${String(value)}`; h5Elem.textContent = `${key}: ${String(value)}`;
} }
// Info buttons removed as requested
header.appendChild(h5Elem); header.appendChild(h5Elem);
card.appendChild(header); card.appendChild(header);