mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2025-06-23 16:05:09 +00:00
Compare commits
13 Commits
7ef56889ce
...
a5479e76d7
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a5479e76d7 | ||
![]() |
a681d039f0 | ||
![]() |
e7625c27aa | ||
![]() |
ba53ad3d9a | ||
![]() |
50f02e88ca | ||
![]() |
4f7e47cf29 | ||
![]() |
430021d606 | ||
![]() |
878e7e5cce | ||
![]() |
b1d052fc6b | ||
![]() |
396e63dccc | ||
![]() |
baaaa5a0b2 | ||
![]() |
461f98be3e | ||
![]() |
9fbb0325b5 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -197,4 +197,3 @@ id_ed25519.pub
|
|||||||
|
|
||||||
# node_modules
|
# node_modules
|
||||||
node_modules/
|
node_modules/
|
||||||
*.mjs
|
|
||||||
|
60
README.md
60
README.md
@ -116,46 +116,46 @@ Stirling-PDF currently supports 40 languages!
|
|||||||
|
|
||||||
| Language | Progress |
|
| Language | Progress |
|
||||||
| -------------------------------------------- | -------------------------------------- |
|
| -------------------------------------------- | -------------------------------------- |
|
||||||
| Arabic (العربية) (ar_AR) |  |
|
| Arabic (العربية) (ar_AR) |  |
|
||||||
| Azerbaijani (Azərbaycan Dili) (az_AZ) |  |
|
| Azerbaijani (Azərbaycan Dili) (az_AZ) |  |
|
||||||
| Basque (Euskara) (eu_ES) |  |
|
| Basque (Euskara) (eu_ES) |  |
|
||||||
| Bulgarian (Български) (bg_BG) |  |
|
| Bulgarian (Български) (bg_BG) |  |
|
||||||
| Catalan (Català) (ca_CA) |  |
|
| Catalan (Català) (ca_CA) |  |
|
||||||
| Croatian (Hrvatski) (hr_HR) |  |
|
| Croatian (Hrvatski) (hr_HR) |  |
|
||||||
| Czech (Česky) (cs_CZ) |  |
|
| Czech (Česky) (cs_CZ) |  |
|
||||||
| Danish (Dansk) (da_DK) |  |
|
| Danish (Dansk) (da_DK) |  |
|
||||||
| Dutch (Nederlands) (nl_NL) |  |
|
| Dutch (Nederlands) (nl_NL) |  |
|
||||||
| English (English) (en_GB) |  |
|
| English (English) (en_GB) |  |
|
||||||
| English (US) (en_US) |  |
|
| English (US) (en_US) |  |
|
||||||
| French (Français) (fr_FR) |  |
|
| French (Français) (fr_FR) |  |
|
||||||
| German (Deutsch) (de_DE) |  |
|
| German (Deutsch) (de_DE) |  |
|
||||||
| Greek (Ελληνικά) (el_GR) |  |
|
| Greek (Ελληνικά) (el_GR) |  |
|
||||||
| Hindi (हिंदी) (hi_IN) |  |
|
| Hindi (हिंदी) (hi_IN) |  |
|
||||||
| Hungarian (Magyar) (hu_HU) |  |
|
| Hungarian (Magyar) (hu_HU) |  |
|
||||||
| Indonesian (Bahasa Indonesia) (id_ID) |  |
|
| Indonesian (Bahasa Indonesia) (id_ID) |  |
|
||||||
| Irish (Gaeilge) (ga_IE) |  |
|
| Irish (Gaeilge) (ga_IE) |  |
|
||||||
| Italian (Italiano) (it_IT) |  |
|
| Italian (Italiano) (it_IT) |  |
|
||||||
| Japanese (日本語) (ja_JP) |  |
|
| Japanese (日本語) (ja_JP) |  |
|
||||||
| Korean (한국어) (ko_KR) |  |
|
| Korean (한국어) (ko_KR) |  |
|
||||||
| Norwegian (Norsk) (no_NB) |  |
|
| Norwegian (Norsk) (no_NB) |  |
|
||||||
| Persian (فارسی) (fa_IR) |  |
|
| Persian (فارسی) (fa_IR) |  |
|
||||||
| Polish (Polski) (pl_PL) |  |
|
| Polish (Polski) (pl_PL) |  |
|
||||||
| Portuguese (Português) (pt_PT) |  |
|
| Portuguese (Português) (pt_PT) |  |
|
||||||
| Portuguese Brazilian (Português) (pt_BR) |  |
|
| Portuguese Brazilian (Português) (pt_BR) |  |
|
||||||
| Romanian (Română) (ro_RO) |  |
|
| Romanian (Română) (ro_RO) |  |
|
||||||
| Russian (Русский) (ru_RU) |  |
|
| Russian (Русский) (ru_RU) |  |
|
||||||
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
||||||
| Simplified Chinese (简体中文) (zh_CN) |  |
|
| Simplified Chinese (简体中文) (zh_CN) |  |
|
||||||
| Slovakian (Slovensky) (sk_SK) |  |
|
| Slovakian (Slovensky) (sk_SK) |  |
|
||||||
| Slovenian (Slovenščina) (sl_SI) |  |
|
| Slovenian (Slovenščina) (sl_SI) |  |
|
||||||
| Spanish (Español) (es_ES) |  |
|
| Spanish (Español) (es_ES) |  |
|
||||||
| Swedish (Svenska) (sv_SE) |  |
|
| Swedish (Svenska) (sv_SE) |  |
|
||||||
| Thai (ไทย) (th_TH) |  |
|
| Thai (ไทย) (th_TH) |  |
|
||||||
| Tibetan (བོད་ཡིག་) (bo_CN) |  |
|
| Tibetan (བོད་ཡིག་) (bo_CN) |  |
|
||||||
| Traditional Chinese (繁體中文) (zh_TW) |  |
|
| Traditional Chinese (繁體中文) (zh_TW) |  |
|
||||||
| Turkish (Türkçe) (tr_TR) |  |
|
| Turkish (Türkçe) (tr_TR) |  |
|
||||||
| Ukrainian (Українська) (uk_UA) |  |
|
| Ukrainian (Українська) (uk_UA) |  |
|
||||||
| Vietnamese (Tiếng Việt) (vi_VN) |  |
|
| Vietnamese (Tiếng Việt) (vi_VN) |  |
|
||||||
| Malayalam (മലയാളം) (ml_IN) |  |
|
| Malayalam (മലയാളം) (ml_IN) |  |
|
||||||
|
|
||||||
## Stirling PDF Enterprise
|
## Stirling PDF Enterprise
|
||||||
|
1
common/.gitignore
vendored
1
common/.gitignore
vendored
@ -194,4 +194,3 @@ id_ed25519.pub
|
|||||||
|
|
||||||
# node_modules
|
# node_modules
|
||||||
node_modules/
|
node_modules/
|
||||||
*.mjs
|
|
||||||
|
@ -11,4 +11,5 @@ 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'
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,39 @@
|
|||||||
|
package stirling.software.common.model.api.converters;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.common.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public class EmlToPdfRequest extends PDFFile {
|
||||||
|
|
||||||
|
// fileInput is inherited from PDFFile
|
||||||
|
|
||||||
|
@Schema(
|
||||||
|
description = "Include email attachments in the PDF output",
|
||||||
|
requiredMode = Schema.RequiredMode.NOT_REQUIRED,
|
||||||
|
example = "false")
|
||||||
|
private boolean includeAttachments = false;
|
||||||
|
|
||||||
|
@Schema(
|
||||||
|
description = "Maximum attachment size in MB to include (default 10MB, range: 1-100)",
|
||||||
|
requiredMode = Schema.RequiredMode.NOT_REQUIRED,
|
||||||
|
example = "10",
|
||||||
|
minimum = "1",
|
||||||
|
maximum = "100")
|
||||||
|
private int maxAttachmentSizeMB = 10;
|
||||||
|
|
||||||
|
@Schema(
|
||||||
|
description = "Download HTML intermediate file instead of PDF",
|
||||||
|
requiredMode = Schema.RequiredMode.NOT_REQUIRED,
|
||||||
|
example = "false")
|
||||||
|
private boolean downloadHtml = false;
|
||||||
|
|
||||||
|
@Schema(
|
||||||
|
description = "Include CC and BCC recipients in header (if available)",
|
||||||
|
requiredMode = Schema.RequiredMode.NOT_REQUIRED,
|
||||||
|
example = "true")
|
||||||
|
private boolean includeAllRecipients = true;
|
||||||
|
}
|
1565
common/src/main/java/stirling/software/common/util/EmlToPdf.java
Normal file
1565
common/src/main/java/stirling/software/common/util/EmlToPdf.java
Normal file
File diff suppressed because it is too large
Load Diff
1
proprietary/.gitignore
vendored
1
proprietary/.gitignore
vendored
@ -194,4 +194,3 @@ id_ed25519.pub
|
|||||||
|
|
||||||
# node_modules
|
# node_modules
|
||||||
node_modules/
|
node_modules/
|
||||||
*.mjs
|
|
||||||
|
5
stirling-pdf/.gitignore
vendored
5
stirling-pdf/.gitignore
vendored
@ -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,4 +194,3 @@ id_ed25519.pub
|
|||||||
|
|
||||||
# node_modules
|
# node_modules
|
||||||
node_modules/
|
node_modules/
|
||||||
*.mjs
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package stirling.software.SPDF.service;
|
package stirling.software.SPDF.config;
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@Service
|
@Service
|
||||||
public class EndpointConfigurationService {
|
@Slf4j
|
||||||
|
public class EndpointConfiguration {
|
||||||
|
|
||||||
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 EndpointConfigurationService {
|
|||||||
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 EndpointConfigurationService(
|
public EndpointConfiguration(
|
||||||
ApplicationProperties applicationProperties,
|
ApplicationProperties applicationProperties,
|
||||||
@Qualifier("runningProOrHigher") boolean runningProOrHigher) {
|
@Qualifier("runningProOrHigher") boolean runningProOrHigher) {
|
||||||
this.applicationProperties = applicationProperties;
|
this.applicationProperties = applicationProperties;
|
@ -8,14 +8,13 @@ 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 EndpointConfigurationService endpointConfigurationService;
|
private final EndpointConfiguration endpointConfiguration;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean preHandle(
|
public boolean preHandle(
|
||||||
@ -38,10 +37,10 @@ public class EndpointInterceptor implements HandlerInterceptor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
log.debug("Request endpoint: {}", requestEndpoint);
|
log.debug("Request endpoint: {}", requestEndpoint);
|
||||||
isEnabled = endpointConfigurationService.isEndpointEnabled(requestEndpoint);
|
isEnabled = endpointConfiguration.isEndpointEnabled(requestEndpoint);
|
||||||
log.debug("Is endpoint enabled: {}", isEnabled);
|
log.debug("Is endpoint enabled: {}", isEnabled);
|
||||||
} else {
|
} else {
|
||||||
isEnabled = endpointConfigurationService.isEndpointEnabled(requestURI);
|
isEnabled = endpointConfiguration.isEndpointEnabled(requestURI);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isEnabled) {
|
if (!isEnabled) {
|
||||||
|
@ -13,21 +13,20 @@ 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 EndpointConfigurationService endpointConfigurationService;
|
private final EndpointConfiguration endpointConfiguration;
|
||||||
|
|
||||||
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(
|
||||||
EndpointConfigurationService endpointConfigurationService, RuntimePathConfig runtimePathConfig) {
|
EndpointConfiguration endpointConfiguration, RuntimePathConfig runtimePathConfig) {
|
||||||
this.endpointConfigurationService = endpointConfigurationService;
|
this.endpointConfiguration = endpointConfiguration;
|
||||||
weasyprintPath = runtimePathConfig.getWeasyPrintPath();
|
weasyprintPath = runtimePathConfig.getWeasyPrintPath();
|
||||||
unoconvPath = runtimePathConfig.getUnoConvertPath();
|
unoconvPath = runtimePathConfig.getUnoConvertPath();
|
||||||
|
|
||||||
@ -63,7 +62,7 @@ public class ExternalAppDepConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private List<String> getAffectedFeatures(String group) {
|
private List<String> getAffectedFeatures(String group) {
|
||||||
return endpointConfigurationService.getEndpointsForGroup(group).stream()
|
return endpointConfiguration.getEndpointsForGroup(group).stream()
|
||||||
.map(endpoint -> formatEndpointAsFeature(endpoint))
|
.map(endpoint -> formatEndpointAsFeature(endpoint))
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
@ -94,7 +93,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);
|
||||||
endpointConfigurationService.disableGroup(group);
|
endpointConfiguration.disableGroup(group);
|
||||||
log.warn(
|
log.warn(
|
||||||
"Missing dependency: {} - Disabling group: {} (Affected features: {})",
|
"Missing dependency: {} - Disabling group: {} (Affected features: {})",
|
||||||
command,
|
command,
|
||||||
@ -121,8 +120,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");
|
||||||
endpointConfigurationService.disableGroup("Python");
|
endpointConfiguration.disableGroup("Python");
|
||||||
endpointConfigurationService.disableGroup("OpenCV");
|
endpointConfiguration.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),
|
||||||
@ -140,20 +139,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");
|
||||||
endpointConfigurationService.disableGroup("OpenCV");
|
endpointConfiguration.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");
|
||||||
endpointConfigurationService.disableGroup("OpenCV");
|
endpointConfiguration.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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
endpointConfigurationService.logDisabledEndpointsSummary();
|
endpointConfiguration.logDisabledEndpointsSummary();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,77 @@
|
|||||||
|
// 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);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
@ -16,7 +16,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
|||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
import stirling.software.SPDF.service.EndpointConfigurationService;
|
import stirling.software.SPDF.config.EndpointConfiguration;
|
||||||
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 EndpointConfigurationService endpointConfigurationService;
|
private final EndpointConfiguration endpointConfiguration;
|
||||||
|
|
||||||
@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(endpointConfigurationService.getEndpointStatuses());
|
return ResponseEntity.ok(endpointConfiguration.getEndpointStatuses());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,157 @@
|
|||||||
|
package stirling.software.SPDF.controller.api.converters;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import io.github.pixee.security.Filenames;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import stirling.software.common.configuration.RuntimePathConfig;
|
||||||
|
import stirling.software.common.model.api.converters.EmlToPdfRequest;
|
||||||
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
|
import stirling.software.common.util.EmlToPdf;
|
||||||
|
import stirling.software.common.util.WebResponseUtils;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/convert")
|
||||||
|
@Tag(name = "Convert", description = "Convert APIs")
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class ConvertEmlToPDF {
|
||||||
|
|
||||||
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
|
private final RuntimePathConfig runtimePathConfig;
|
||||||
|
|
||||||
|
@PostMapping(consumes = "multipart/form-data", value = "/eml/pdf")
|
||||||
|
@Operation(
|
||||||
|
summary = "Convert EML to PDF",
|
||||||
|
description =
|
||||||
|
"This endpoint converts EML (email) files to PDF format with extensive"
|
||||||
|
+ " customization options. Features include font settings, image constraints, display modes, attachment handling,"
|
||||||
|
+ " and HTML debug output. Input: EML file, Output: PDF"
|
||||||
|
+ " or HTML file. Type: SISO")
|
||||||
|
public ResponseEntity<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;
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,8 @@
|
|||||||
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;
|
||||||
@ -17,14 +20,17 @@ 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;
|
||||||
@ -38,24 +44,13 @@ 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 io.github.pixee.security.Filenames;
|
import stirling.software.SPDF.model.api.misc.OptimizePdfRequest;
|
||||||
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")
|
||||||
@ -68,9 +63,9 @@ public class CompressController {
|
|||||||
|
|
||||||
public CompressController(
|
public CompressController(
|
||||||
CustomPDFDocumentFactory pdfDocumentFactory,
|
CustomPDFDocumentFactory pdfDocumentFactory,
|
||||||
EndpointConfigurationService endpointConfigurationService) {
|
EndpointConfiguration endpointConfiguration) {
|
||||||
this.pdfDocumentFactory = pdfDocumentFactory;
|
this.pdfDocumentFactory = pdfDocumentFactory;
|
||||||
this.qpdfEnabled = endpointConfigurationService.isGroupEnabled("qpdf");
|
this.qpdfEnabled = endpointConfiguration.isGroupEnabled("qpdf");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
|
@ -7,7 +7,6 @@ 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
|
||||||
@ -121,4 +120,11 @@ 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";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -621,6 +621,22 @@ 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
|
||||||
|
@ -621,6 +621,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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.
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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 में बदलें
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML konvertálása PDF-be
|
|||||||
home.HTMLToPDF.desc=HTML fájl vagy ZIP konvertálása PDF-be
|
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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -621,6 +621,22 @@ 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に変換します。
|
||||||
|
@ -489,6 +489,22 @@ 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로 변환
|
||||||
|
@ -489,6 +489,22 @@ 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-ലേക്ക് മാറ്റുന്നു
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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.
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ home.HTMLToPDF.title=HTML'den PDF'e
|
|||||||
home.HTMLToPDF.desc=Herhangi bir HTML dosyasını veya zip'i PDF'e dönüştürür
|
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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ home.HTMLToPDF.title=HTML sang PDF
|
|||||||
home.HTMLToPDF.desc=Chuyển đổi bất kỳ tệp HTML hoặc zip nào thành PDF
|
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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
@ -489,6 +489,22 @@ 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
|
||||||
|
18511
stirling-pdf/src/main/resources/static/pdfjs-legacy/js/viewer.mjs
vendored
Normal file
18511
stirling-pdf/src/main/resources/static/pdfjs-legacy/js/viewer.mjs
vendored
Normal file
File diff suppressed because one or more lines are too long
24320
stirling-pdf/src/main/resources/static/pdfjs-legacy/pdf.mjs
vendored
Normal file
24320
stirling-pdf/src/main/resources/static/pdfjs-legacy/pdf.mjs
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3796
stirling-pdf/src/main/resources/static/pdfjs-legacy/pdf.sandbox.mjs
vendored
Normal file
3796
stirling-pdf/src/main/resources/static/pdfjs-legacy/pdf.sandbox.mjs
vendored
Normal file
File diff suppressed because one or more lines are too long
61184
stirling-pdf/src/main/resources/static/pdfjs-legacy/pdf.worker.mjs
vendored
Normal file
61184
stirling-pdf/src/main/resources/static/pdfjs-legacy/pdf.worker.mjs
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -0,0 +1,93 @@
|
|||||||
|
<!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>
|
@ -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="${@endpointConfigurationService.isEndpointEnabled('pdf-to-rtf')}" value="rtf">RTF</option>
|
<option th:if="${@endpointConfiguration.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="${@endpointConfigurationService.isEndpointEnabled('pdf-to-rtf')}" class="mt-3" th:text="#{PDFToText.credit}"></p>
|
<p th:if="${@endpointConfiguration.isEndpointEnabled('pdf-to-rtf')}" class="mt-3" th:text="#{PDFToText.credit}"></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<div th:fragment="card" class="feature-card hidden" th:id="${id}" th:if="${@endpointConfigurationService.isEndpointEnabled(cardLink)} "
|
<div th:fragment="card" class="feature-card hidden" th:id="${id}" th:if="${@endpointConfiguration.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}">
|
||||||
|
@ -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 ('zh_BO', 'བོད་ཡིག')}"></div>
|
<div th:replace="~{fragments/languageEntry :: languageEntry ('bo_CN', 'བོད་ཡིག')}"></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>
|
||||||
|
@ -59,6 +59,9 @@
|
|||||||
<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">
|
||||||
@ -264,6 +267,7 @@
|
|||||||
<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>
|
||||||
|
@ -57,7 +57,7 @@
|
|||||||
|
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item" th:if="${@endpointConfigurationService.isEndpointEnabled('multi-tool')}">
|
<li class="nav-item" th:if="${@endpointConfiguration.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="${@endpointConfigurationService.isEndpointEnabled('pipeline')}">
|
<li class="nav-item" th:if="${@endpointConfiguration.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="${@endpointConfigurationService.isEndpointEnabled('compress-pdf')}">
|
<li class="nav-item" th:if="${@endpointConfiguration.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">
|
||||||
|
@ -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="${@endpointConfigurationService.isEndpointEnabled(endpoint)}">
|
th:if="${@endpointConfiguration.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}"
|
||||||
|
@ -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="${@endpointConfigurationService.isEndpointEnabled(endpoint)}">
|
th:if="${@endpointConfiguration.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}"
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div id="page-container">
|
<div id="page-container">
|
||||||
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
||||||
<div style="transform-origin: top;"
|
<div style="transform-origin: top;"
|
||||||
id="scale-wrap">
|
id="scale-wrap">
|
||||||
@ -60,7 +60,7 @@
|
|||||||
style="height:2.5rem; display: flex; align-items: center; cursor: pointer; justify-content: center;">
|
style="height:2.5rem; display: flex; align-items: center; cursor: pointer; justify-content: center;">
|
||||||
<label for="sort-options" th:text="#{home.sortBy}">Sort by:</label>
|
<label for="sort-options" th:text="#{home.sortBy}">Sort by:</label>
|
||||||
<select id="sort-options" style="border:none;">
|
<select id="sort-options" style="border:none;">
|
||||||
<option value="alphabetical" th:text="#{home.alphabetical}"></option>
|
<option value="alphabetical" th:text="#{home.alphabetical}"> </option>
|
||||||
<!-- <option value="personal">Your most used</option> -->
|
<!-- <option value="personal">Your most used</option> -->
|
||||||
<option value="global" th:text="#{home.globalPopularity}"></option>
|
<option value="global" th:text="#{home.globalPopularity}"></option>
|
||||||
<!-- <option value="server">Popularity in organisation</option> -->
|
<!-- <option value="server">Popularity in organisation</option> -->
|
||||||
@ -118,11 +118,11 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<!-- Survey Modal -->
|
<!-- Survey Modal -->
|
||||||
<div class="modal fade" id="surveyModal" tabindex="-1" role="dialog" aria-labelledby="surveyModalLabel"
|
<div class="modal fade" id="surveyModal" tabindex="-1" role="dialog" aria-labelledby="surveyModalLabel"
|
||||||
aria-hidden="true">
|
aria-hidden="true">
|
||||||
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
|
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
@ -131,20 +131,14 @@
|
|||||||
<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
|
<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>
|
||||||
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><span>🛠️</span><span th:text="#{survey.meeting.3}">Get help with deployment, integrations, or troubleshooting</span></p>
|
||||||
</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.4}">Provide direct feedback on performance, edge cases, and feature gaps</span>
|
<p><span>🔍</span><span th:text="#{survey.meeting.5}">Help us refine Stirling PDF for real-world enterprise use</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 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
|
<p th:text="#{survey.meeting.7}">Looking forward to digging into your use cases and making Stirling PDF even better!</p>
|
||||||
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>
|
||||||
<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>
|
||||||
@ -164,11 +158,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<!-- Analytics Modal -->
|
<!-- Analytics Modal -->
|
||||||
<div class="modal fade" id="analyticsModal" tabindex="-1" role="dialog" aria-labelledby="analyticsModalLabel"
|
<div class="modal fade" id="analyticsModal" tabindex="-1" role="dialog" aria-labelledby="analyticsModalLabel"
|
||||||
aria-hidden="true" th:if="${@analyticsPrompt}">
|
aria-hidden="true" th:if="${@analyticsPrompt}">
|
||||||
<div class="modal-dialog modal-dialog-centered" role="document">
|
<div class="modal-dialog modal-dialog-centered" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
@ -187,18 +181,16 @@
|
|||||||
</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
|
th:text="#{analytics.disable}">Disable analytics</button>
|
||||||
</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
|
onclick="setAnalytics(true)">Enable analytics</button>
|
||||||
</button>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.favorite-icon {
|
.favorite-icon {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
width: 0rem;
|
width: 0rem;
|
||||||
@ -212,17 +204,17 @@
|
|||||||
.toggle-favourites.active {
|
.toggle-favourites.active {
|
||||||
color: gold;
|
color: gold;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<script th:src="@{'/js/fetch-utils.js'}"></script>
|
<script th:src="@{'/js/fetch-utils.js'}"></script>
|
||||||
<script th:inline="javascript">
|
<script th:inline="javascript">
|
||||||
/*<![CDATA[*/
|
/*<![CDATA[*/
|
||||||
window.analyticsPromptBoolean = /*[[${@analyticsPrompt}]]*/ false;
|
window.analyticsPromptBoolean = /*[[${@analyticsPrompt}]]*/ false;
|
||||||
/*]]>*/
|
/*]]>*/
|
||||||
|
|
||||||
window.showSurvey = /*[[${showSurveyFromDocker}]]*/ true
|
window.showSurvey = /*[[${showSurveyFromDocker}]]*/ true
|
||||||
</script>
|
</script>
|
||||||
<script th:src="@{'/js/pages/home.js'}" th:inline="javascript"></script>
|
<script th:src="@{'/js/pages/home.js'}" th:inline="javascript"></script>
|
||||||
<script>
|
<script>
|
||||||
function applyScale() {
|
function applyScale() {
|
||||||
const baseWidth = 1440;
|
const baseWidth = 1440;
|
||||||
const baseHeight = 1000;
|
const baseHeight = 1000;
|
||||||
@ -235,7 +227,7 @@
|
|||||||
|
|
||||||
window.addEventListener('resize', applyScale);
|
window.addEventListener('resize', applyScale);
|
||||||
window.addEventListener('load', applyScale);
|
window.addEventListener('load', applyScale);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
@ -12,12 +12,85 @@
|
|||||||
<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">
|
<div class="col-md-6 bg-card">
|
||||||
<h2 th:text="#{fakeScan.header}"></h2>
|
<div class="tool-header">
|
||||||
<form method="post" enctype="multipart/form-data" th:action="@{'/api/v1/misc/fake-scan'}">
|
<span class="material-symbols-rounded tool-header-icon advance">scanner</span>
|
||||||
|
<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>
|
||||||
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{fakeScan.submit}"></button>
|
<div class="mb-3">
|
||||||
|
<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>
|
||||||
@ -25,5 +98,66 @@
|
|||||||
</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>
|
@ -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-6 bg-card">
|
<div class="col-md-7 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,6 +22,82 @@
|
|||||||
<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 -->
|
||||||
@ -31,21 +107,379 @@
|
|||||||
<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>
|
<script th:inline="javascript">
|
||||||
|
// 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) {
|
||||||
@ -77,8 +511,9 @@
|
|||||||
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';
|
h5Elem.className = 'mb-0 d-flex align-items-center';
|
||||||
|
|
||||||
|
// 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);
|
||||||
@ -95,6 +530,8 @@
|
|||||||
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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user