mirror of
https://github.com/Frooodle/Stirling-PDF.git
synced 2025-11-01 01:21:18 +01:00
feat(convert): add PDF to Video converter (FFmpeg) with MP4/WebM support (#4704)
# Description of Changes This pull request introduces support for FFmpeg as a new external tool in the application. It adds configuration options for FFmpeg session limits and timeouts, updates the process execution and tool-checking utilities to handle FFmpeg, and expands endpoint configuration to include FFmpeg-dependent features. Corresponding unit tests have also been added to ensure FFmpeg detection works as expected. **FFmpeg Integration and Configuration:** * Added FFmpeg session limit and timeout configuration options to `ApplicationProperties`, with default values and getter methods. [[1]](diffhunk://#diff-1c357db0a3e88cf5bedd4a5852415fadad83b8b3b9eb56e67059d8b9d8b10702R631) [[2]](diffhunk://#diff-1c357db0a3e88cf5bedd4a5852415fadad83b8b3b9eb56e67059d8b9d8b10702R672-R675) [[3]](diffhunk://#diff-1c357db0a3e88cf5bedd4a5852415fadad83b8b3b9eb56e67059d8b9d8b10702R702) [[4]](diffhunk://#diff-1c357db0a3e88cf5bedd4a5852415fadad83b8b3b9eb56e67059d8b9d8b10702R743-R746) * Updated `ProcessExecutor` to recognize FFmpeg as a process type, and to use the new session limit and timeout configuration for FFmpeg processes. [[1]](diffhunk://#diff-8424a11112fff55cc28467c4d531e451a485911ed1aeb0aea772c9fa7dc3aa6aL305-R316) [[2]](diffhunk://#diff-8424a11112fff55cc28467c4d531e451a485911ed1aeb0aea772c9fa7dc3aa6aR74-R78) [[3]](diffhunk://#diff-8424a11112fff55cc28467c4d531e451a485911ed1aeb0aea772c9fa7dc3aa6aR133-R137) **Tool Detection and Exception Handling:** * Implemented `isFfmpegAvailable()` in `CheckProgramInstall` to detect FFmpeg installation, with caching for efficiency. [[1]](diffhunk://#diff-7b61807107c689e3824a5f8fd42c27ab072a67a5666f24445bd6895937351690R14) [[2]](diffhunk://#diff-7b61807107c689e3824a5f8fd42c27ab072a67a5666f24445bd6895937351690R60-R78) * Added a specific exception factory method for missing FFmpeg in `ExceptionUtils`. **Endpoint Configuration:** * Registered the new `pdf-to-video` endpoint under the "Convert", "Java", and "FFmpeg" groups, and updated the tool group logic to include "FFmpeg". [[1]](diffhunk://#diff-3cddb66d1cf93eeb8103ccd17cee8ed006e0c0ee006d0ee1cf42d512f177e437R265) [[2]](diffhunk://#diff-3cddb66d1cf93eeb8103ccd17cee8ed006e0c0ee006d0ee1cf42d512f177e437R395) [[3]](diffhunk://#diff-3cddb66d1cf93eeb8103ccd17cee8ed006e0c0ee006d0ee1cf42d512f177e437R452-R454) [[4]](diffhunk://#diff-3cddb66d1cf93eeb8103ccd17cee8ed006e0c0ee006d0ee1cf42d512f177e437L496-R502) **Testing Enhancements:** * Added and updated unit tests in `CheckProgramInstallTest` to verify FFmpeg detection, including scenarios for installed, not installed, and caching behavior. [[1]](diffhunk://#diff-0eaf917d935710f0f5e18f12db600be47b8439d628d65a97a3db34133231790eR29) [[2]](diffhunk://#diff-0eaf917d935710f0f5e18f12db600be47b8439d628d65a97a3db34133231790eR38-R45) [[3]](diffhunk://#diff-0eaf917d935710f0f5e18f12db600be47b8439d628d65a97a3db34133231790eR67-R75) [[4]](diffhunk://#diff-0eaf917d935710f0f5e18f12db600be47b8439d628d65a97a3db34133231790eR222-R262) --- ## Checklist ### General - [x] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [x] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [x] I have performed a self-review of my own code - [x] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing) for more details.
This commit is contained in:
parent
43e0d73338
commit
7f7d6fd1c9
@ -1,6 +1,6 @@
|
|||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
rev: v0.12.7
|
rev: v0.14.2
|
||||||
hooks:
|
hooks:
|
||||||
- id: ruff
|
- id: ruff
|
||||||
args:
|
args:
|
||||||
@ -26,7 +26,7 @@ repos:
|
|||||||
hooks:
|
hooks:
|
||||||
- id: gitleaks
|
- id: gitleaks
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: v5.0.0
|
rev: v6.0.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
files: ^.*(\.js|\.java|\.py|\.yml)$
|
files: ^.*(\.js|\.java|\.py|\.yml)$
|
||||||
|
|||||||
@ -55,6 +55,7 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a
|
|||||||
openssl \
|
openssl \
|
||||||
openssl-dev \
|
openssl-dev \
|
||||||
openjdk21-jre \
|
openjdk21-jre \
|
||||||
|
ffmpeg \
|
||||||
# Doc conversion
|
# Doc conversion
|
||||||
gcompat \
|
gcompat \
|
||||||
libc6-compat \
|
libc6-compat \
|
||||||
|
|||||||
@ -19,6 +19,7 @@ RUN apt-get update && apt-get install -y \
|
|||||||
# settings.yml | tessdataDir: /usr/share/tesseract-ocr/5/tessdata
|
# settings.yml | tessdataDir: /usr/share/tesseract-ocr/5/tessdata
|
||||||
tesseract-ocr \
|
tesseract-ocr \
|
||||||
tesseract-ocr-eng \
|
tesseract-ocr-eng \
|
||||||
|
ffmpeg \
|
||||||
fonts-terminus fonts-dejavu fonts-font-awesome fonts-noto fonts-noto-core fonts-noto-cjk fonts-noto-extra fonts-liberation fonts-linuxlibertine fonts-urw-base35 \
|
fonts-terminus fonts-dejavu fonts-font-awesome fonts-noto fonts-noto-core fonts-noto-cjk fonts-noto-extra fonts-liberation fonts-linuxlibertine fonts-urw-base35 \
|
||||||
python3-uno \
|
python3-uno \
|
||||||
python3-venv \
|
python3-venv \
|
||||||
|
|||||||
@ -69,6 +69,7 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a
|
|||||||
openssl \
|
openssl \
|
||||||
openssl-dev \
|
openssl-dev \
|
||||||
openjdk21-jre \
|
openjdk21-jre \
|
||||||
|
ffmpeg \
|
||||||
# Doc conversion
|
# Doc conversion
|
||||||
gcompat \
|
gcompat \
|
||||||
libc6-compat \
|
libc6-compat \
|
||||||
|
|||||||
@ -647,6 +647,7 @@ public class ApplicationProperties {
|
|||||||
private int tesseractSessionLimit;
|
private int tesseractSessionLimit;
|
||||||
private int ghostscriptSessionLimit;
|
private int ghostscriptSessionLimit;
|
||||||
private int ocrMyPdfSessionLimit;
|
private int ocrMyPdfSessionLimit;
|
||||||
|
private int ffmpegSessionLimit;
|
||||||
|
|
||||||
public int getQpdfSessionLimit() {
|
public int getQpdfSessionLimit() {
|
||||||
return qpdfSessionLimit > 0 ? qpdfSessionLimit : 2;
|
return qpdfSessionLimit > 0 ? qpdfSessionLimit : 2;
|
||||||
@ -687,6 +688,10 @@ public class ApplicationProperties {
|
|||||||
public int getOcrMyPdfSessionLimit() {
|
public int getOcrMyPdfSessionLimit() {
|
||||||
return ocrMyPdfSessionLimit > 0 ? ocrMyPdfSessionLimit : 2;
|
return ocrMyPdfSessionLimit > 0 ? ocrMyPdfSessionLimit : 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getFfmpegSessionLimit() {
|
||||||
|
return ffmpegSessionLimit > 0 ? ffmpegSessionLimit : 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@ -713,6 +718,7 @@ public class ApplicationProperties {
|
|||||||
private long qpdfTimeoutMinutes;
|
private long qpdfTimeoutMinutes;
|
||||||
private long ghostscriptTimeoutMinutes;
|
private long ghostscriptTimeoutMinutes;
|
||||||
private long ocrMyPdfTimeoutMinutes;
|
private long ocrMyPdfTimeoutMinutes;
|
||||||
|
private long ffmpegTimeoutMinutes;
|
||||||
|
|
||||||
public long getTesseractTimeoutMinutes() {
|
public long getTesseractTimeoutMinutes() {
|
||||||
return tesseractTimeoutMinutes > 0 ? tesseractTimeoutMinutes : 30;
|
return tesseractTimeoutMinutes > 0 ? tesseractTimeoutMinutes : 30;
|
||||||
@ -753,6 +759,10 @@ public class ApplicationProperties {
|
|||||||
public long getOcrMyPdfTimeoutMinutes() {
|
public long getOcrMyPdfTimeoutMinutes() {
|
||||||
return ocrMyPdfTimeoutMinutes > 0 ? ocrMyPdfTimeoutMinutes : 30;
|
return ocrMyPdfTimeoutMinutes > 0 ? ocrMyPdfTimeoutMinutes : 30;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getFfmpegTimeoutMinutes() {
|
||||||
|
return ffmpegTimeoutMinutes > 0 ? ffmpegTimeoutMinutes : 30;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,6 +11,8 @@ public class CheckProgramInstall {
|
|||||||
private static final List<String> PYTHON_COMMANDS = Arrays.asList("python3", "python");
|
private static final List<String> PYTHON_COMMANDS = Arrays.asList("python3", "python");
|
||||||
private static boolean pythonAvailableChecked = false;
|
private static boolean pythonAvailableChecked = false;
|
||||||
private static String availablePythonCommand = null;
|
private static String availablePythonCommand = null;
|
||||||
|
private static boolean ffmpegAvailableChecked = false;
|
||||||
|
private static boolean ffmpegAvailable = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks which Python command is available and returns it.
|
* Checks which Python command is available and returns it.
|
||||||
@ -56,4 +58,25 @@ public class CheckProgramInstall {
|
|||||||
public static boolean isPythonAvailable() {
|
public static boolean isPythonAvailable() {
|
||||||
return getAvailablePythonCommand() != null;
|
return getAvailablePythonCommand() != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if FFmpeg is available on the system.
|
||||||
|
*
|
||||||
|
* @return true if FFmpeg is installed and accessible, false otherwise.
|
||||||
|
*/
|
||||||
|
public static boolean isFfmpegAvailable() {
|
||||||
|
if (!ffmpegAvailableChecked) {
|
||||||
|
try {
|
||||||
|
ProcessExecutorResult result =
|
||||||
|
ProcessExecutor.getInstance(ProcessExecutor.Processes.FFMPEG)
|
||||||
|
.runCommandWithOutputHandling(Arrays.asList("ffmpeg", "-version"));
|
||||||
|
ffmpegAvailable = true;
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
ffmpegAvailable = false;
|
||||||
|
} finally {
|
||||||
|
ffmpegAvailableChecked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ffmpegAvailable;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,11 +34,14 @@ public class ExceptionUtils {
|
|||||||
if (context != null && !context.isEmpty()) {
|
if (context != null && !context.isEmpty()) {
|
||||||
message =
|
message =
|
||||||
String.format(
|
String.format(
|
||||||
"Error %s: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.",
|
"Error %s: PDF file appears to be corrupted or damaged. Please try"
|
||||||
|
+ " using the 'Repair PDF' feature first to fix the file before"
|
||||||
|
+ " proceeding with this operation.",
|
||||||
context);
|
context);
|
||||||
} else {
|
} else {
|
||||||
message =
|
message =
|
||||||
"PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.";
|
"PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF'"
|
||||||
|
+ " feature first to fix the file before proceeding with this operation.";
|
||||||
}
|
}
|
||||||
return new IOException(message, cause);
|
return new IOException(message, cause);
|
||||||
}
|
}
|
||||||
@ -51,7 +54,8 @@ public class ExceptionUtils {
|
|||||||
*/
|
*/
|
||||||
public static IOException createMultiplePdfCorruptedException(Exception cause) {
|
public static IOException createMultiplePdfCorruptedException(Exception cause) {
|
||||||
String message =
|
String message =
|
||||||
"One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.";
|
"One or more PDF files appear to be corrupted or damaged. Please try using the"
|
||||||
|
+ " 'Repair PDF' feature on each file first before attempting to merge them.";
|
||||||
return new IOException(message, cause);
|
return new IOException(message, cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,7 +67,10 @@ public class ExceptionUtils {
|
|||||||
*/
|
*/
|
||||||
public static IOException createPdfEncryptionException(Exception cause) {
|
public static IOException createPdfEncryptionException(Exception cause) {
|
||||||
String message =
|
String message =
|
||||||
"The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.";
|
"The PDF appears to have corrupted encryption data. This can happen when the PDF"
|
||||||
|
+ " was created with incompatible encryption methods. Please try using the"
|
||||||
|
+ " 'Repair PDF' feature first, or contact the document creator for a new"
|
||||||
|
+ " copy.";
|
||||||
return new IOException(message, cause);
|
return new IOException(message, cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,7 +82,8 @@ public class ExceptionUtils {
|
|||||||
*/
|
*/
|
||||||
public static IOException createPdfPasswordException(Exception cause) {
|
public static IOException createPdfPasswordException(Exception cause) {
|
||||||
String message =
|
String message =
|
||||||
"The PDF Document is passworded and either the password was not provided or was incorrect";
|
"The PDF Document is passworded and either the password was not provided or was"
|
||||||
|
+ " incorrect";
|
||||||
return new IOException(message, cause);
|
return new IOException(message, cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,6 +188,15 @@ public class ExceptionUtils {
|
|||||||
"error.toolRequired", "{0} is required for {1}", null, "Python", "WebP conversion");
|
"error.toolRequired", "{0} is required for {1}", null, "Python", "WebP conversion");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IOException createFfmpegRequiredException() {
|
||||||
|
return createIOException(
|
||||||
|
"error.toolRequired",
|
||||||
|
"{0} is required for {1}",
|
||||||
|
null,
|
||||||
|
"FFmpeg",
|
||||||
|
"PDF to Video Slideshow conversion");
|
||||||
|
}
|
||||||
|
|
||||||
/** Create file operation exceptions. */
|
/** Create file operation exceptions. */
|
||||||
public static IOException createFileNotFoundException(String fileId) {
|
public static IOException createFileNotFoundException(String fileId) {
|
||||||
return createIOException("error.fileNotFound", "File not found with ID: {0}", null, fileId);
|
return createIOException("error.fileNotFound", "File not found with ID: {0}", null, fileId);
|
||||||
@ -345,9 +362,11 @@ public class ExceptionUtils {
|
|||||||
int pageNumber, int dpi, Throwable cause) {
|
int pageNumber, int dpi, Throwable cause) {
|
||||||
String message =
|
String message =
|
||||||
MessageFormat.format(
|
MessageFormat.format(
|
||||||
"Out of memory or image-too-large error while rendering PDF page {0} at {1} DPI. "
|
"Out of memory or image-too-large error while rendering PDF page {0} at {1}"
|
||||||
+ "This can occur when the resulting image exceeds Java's array/memory limits (e.g., NegativeArraySizeException). "
|
+ " DPI. This can occur when the resulting image exceeds Java's"
|
||||||
+ "Please use a lower DPI value (recommended: 150 or less) or process the document in smaller chunks.",
|
+ " array/memory limits (e.g., NegativeArraySizeException). Please use"
|
||||||
|
+ " a lower DPI value (recommended: 150 or less) or process the"
|
||||||
|
+ " document in smaller chunks.",
|
||||||
pageNumber, dpi);
|
pageNumber, dpi);
|
||||||
return new RuntimeException(message, cause);
|
return new RuntimeException(message, cause);
|
||||||
}
|
}
|
||||||
@ -378,9 +397,11 @@ public class ExceptionUtils {
|
|||||||
public static RuntimeException createOutOfMemoryDpiException(int dpi, Throwable cause) {
|
public static RuntimeException createOutOfMemoryDpiException(int dpi, Throwable cause) {
|
||||||
String message =
|
String message =
|
||||||
MessageFormat.format(
|
MessageFormat.format(
|
||||||
"Out of memory or image-too-large error while rendering PDF at {0} DPI. "
|
"Out of memory or image-too-large error while rendering PDF at {0} DPI."
|
||||||
+ "This can occur when the resulting image exceeds Java's array/memory limits (e.g., NegativeArraySizeException). "
|
+ " This can occur when the resulting image exceeds Java's array/memory"
|
||||||
+ "Please use a lower DPI value (recommended: 150 or less) or process the document in smaller chunks.",
|
+ " limits (e.g., NegativeArraySizeException). Please use a lower DPI"
|
||||||
|
+ " value (recommended: 150 or less) or process the document in smaller"
|
||||||
|
+ " chunks.",
|
||||||
dpi);
|
dpi);
|
||||||
return new RuntimeException(message, cause);
|
return new RuntimeException(message, cause);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -71,6 +71,11 @@ public class ProcessExecutor {
|
|||||||
.getProcessExecutor()
|
.getProcessExecutor()
|
||||||
.getSessionLimit()
|
.getSessionLimit()
|
||||||
.getInstallAppSessionLimit();
|
.getInstallAppSessionLimit();
|
||||||
|
case FFMPEG ->
|
||||||
|
applicationProperties
|
||||||
|
.getProcessExecutor()
|
||||||
|
.getSessionLimit()
|
||||||
|
.getFfmpegSessionLimit();
|
||||||
case TESSERACT ->
|
case TESSERACT ->
|
||||||
applicationProperties
|
applicationProperties
|
||||||
.getProcessExecutor()
|
.getProcessExecutor()
|
||||||
@ -125,6 +130,11 @@ public class ProcessExecutor {
|
|||||||
.getProcessExecutor()
|
.getProcessExecutor()
|
||||||
.getTimeoutMinutes()
|
.getTimeoutMinutes()
|
||||||
.getInstallAppTimeoutMinutes();
|
.getInstallAppTimeoutMinutes();
|
||||||
|
case FFMPEG ->
|
||||||
|
applicationProperties
|
||||||
|
.getProcessExecutor()
|
||||||
|
.getTimeoutMinutes()
|
||||||
|
.getFfmpegTimeoutMinutes();
|
||||||
case TESSERACT ->
|
case TESSERACT ->
|
||||||
applicationProperties
|
applicationProperties
|
||||||
.getProcessExecutor()
|
.getProcessExecutor()
|
||||||
@ -302,7 +312,8 @@ public class ProcessExecutor {
|
|||||||
TESSERACT,
|
TESSERACT,
|
||||||
QPDF,
|
QPDF,
|
||||||
GHOSTSCRIPT,
|
GHOSTSCRIPT,
|
||||||
OCR_MY_PDF
|
OCR_MY_PDF,
|
||||||
|
FFMPEG
|
||||||
}
|
}
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
|
|||||||
@ -2,6 +2,7 @@ package stirling.software.common.model;
|
|||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -45,11 +46,15 @@ class ApplicationPropertiesLogicTest {
|
|||||||
String expectedLibre = Paths.get(expectedBase, "libreoffice").toString();
|
String expectedLibre = Paths.get(expectedBase, "libreoffice").toString();
|
||||||
assertEquals(expectedLibre, tfm.getLibreofficeDir());
|
assertEquals(expectedLibre, tfm.getLibreofficeDir());
|
||||||
|
|
||||||
tfm.setBaseTmpDir("/custom/base");
|
tfm.setBaseTmpDir(File.separator + "custom" + File.separator + "base");
|
||||||
assertEquals("/custom/base", normalize.apply(tfm.getBaseTmpDir()));
|
assertEquals(
|
||||||
|
File.separator + "custom" + File.separator + "base",
|
||||||
|
normalize.apply(tfm.getBaseTmpDir()));
|
||||||
|
|
||||||
tfm.setLibreofficeDir("/opt/libre");
|
tfm.setLibreofficeDir(File.separator + "opt" + File.separator + "libre");
|
||||||
assertEquals("/opt/libre", normalize.apply(tfm.getLibreofficeDir()));
|
assertEquals(
|
||||||
|
File.separator + "opt" + File.separator + "libre",
|
||||||
|
normalize.apply(tfm.getLibreofficeDir()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -240,12 +245,13 @@ class ApplicationPropertiesLogicTest {
|
|||||||
void collection_isValid_true_when_non_empty_even_if_element_is_blank() {
|
void collection_isValid_true_when_non_empty_even_if_element_is_blank() {
|
||||||
ApplicationProperties.Security.OAUTH2 oauth2 = new ApplicationProperties.Security.OAUTH2();
|
ApplicationProperties.Security.OAUTH2 oauth2 = new ApplicationProperties.Security.OAUTH2();
|
||||||
|
|
||||||
// Aktuelles Verhalten: prüft NUR !isEmpty(), nicht Inhalt
|
// Current behavior: checks ONLY !isEmpty(), not the content
|
||||||
Collection<String> oneBlank = new ArrayList<>();
|
Collection<String> oneBlank = new ArrayList<>();
|
||||||
oneBlank.add(" ");
|
oneBlank.add(" ");
|
||||||
|
|
||||||
assertTrue(
|
assertTrue(
|
||||||
oauth2.isValid(oneBlank, "scopes"),
|
oauth2.isValid(oneBlank, "scopes"),
|
||||||
"Dokumentiert aktuelles Verhalten: nicht-leere Liste gilt als gültig, auch wenn Element leer/blank ist");
|
"Documents current behavior: non-empty list is considered valid, even if an element"
|
||||||
|
+ " is empty/blank");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,6 +26,7 @@ class CheckProgramInstallTest {
|
|||||||
|
|
||||||
private MockedStatic<ProcessExecutor> mockProcessExecutor;
|
private MockedStatic<ProcessExecutor> mockProcessExecutor;
|
||||||
private ProcessExecutor mockExecutor;
|
private ProcessExecutor mockExecutor;
|
||||||
|
private ProcessExecutor mockFfmpegExecutor;
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
void setUp() throws Exception {
|
void setUp() throws Exception {
|
||||||
@ -34,10 +35,14 @@ class CheckProgramInstallTest {
|
|||||||
|
|
||||||
// Set up mock for ProcessExecutor
|
// Set up mock for ProcessExecutor
|
||||||
mockExecutor = Mockito.mock(ProcessExecutor.class);
|
mockExecutor = Mockito.mock(ProcessExecutor.class);
|
||||||
|
mockFfmpegExecutor = Mockito.mock(ProcessExecutor.class);
|
||||||
mockProcessExecutor = mockStatic(ProcessExecutor.class);
|
mockProcessExecutor = mockStatic(ProcessExecutor.class);
|
||||||
mockProcessExecutor
|
mockProcessExecutor
|
||||||
.when(() -> ProcessExecutor.getInstance(ProcessExecutor.Processes.PYTHON_OPENCV))
|
.when(() -> ProcessExecutor.getInstance(ProcessExecutor.Processes.PYTHON_OPENCV))
|
||||||
.thenReturn(mockExecutor);
|
.thenReturn(mockExecutor);
|
||||||
|
mockProcessExecutor
|
||||||
|
.when(() -> ProcessExecutor.getInstance(ProcessExecutor.Processes.FFMPEG))
|
||||||
|
.thenReturn(mockFfmpegExecutor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@AfterEach
|
@AfterEach
|
||||||
@ -59,6 +64,15 @@ class CheckProgramInstallTest {
|
|||||||
CheckProgramInstall.class.getDeclaredField("availablePythonCommand");
|
CheckProgramInstall.class.getDeclaredField("availablePythonCommand");
|
||||||
availablePythonCommandField.setAccessible(true);
|
availablePythonCommandField.setAccessible(true);
|
||||||
availablePythonCommandField.set(null, null);
|
availablePythonCommandField.set(null, null);
|
||||||
|
|
||||||
|
Field ffmpegAvailableCheckedField =
|
||||||
|
CheckProgramInstall.class.getDeclaredField("ffmpegAvailableChecked");
|
||||||
|
ffmpegAvailableCheckedField.setAccessible(true);
|
||||||
|
ffmpegAvailableCheckedField.set(null, false);
|
||||||
|
|
||||||
|
Field ffmpegAvailableField = CheckProgramInstall.class.getDeclaredField("ffmpegAvailable");
|
||||||
|
ffmpegAvailableField.setAccessible(true);
|
||||||
|
ffmpegAvailableField.set(null, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -204,4 +218,45 @@ class CheckProgramInstallTest {
|
|||||||
// Verify getAvailablePythonCommand was called internally
|
// Verify getAvailablePythonCommand was called internally
|
||||||
verify(mockExecutor).runCommandWithOutputHandling(Arrays.asList("python3", "--version"));
|
verify(mockExecutor).runCommandWithOutputHandling(Arrays.asList("python3", "--version"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testIsFfmpegAvailable_WhenInstalled() throws Exception {
|
||||||
|
resetStaticFields();
|
||||||
|
ProcessExecutorResult result = Mockito.mock(ProcessExecutorResult.class);
|
||||||
|
when(mockFfmpegExecutor.runCommandWithOutputHandling(Arrays.asList("ffmpeg", "-version")))
|
||||||
|
.thenReturn(result);
|
||||||
|
|
||||||
|
assertTrue(CheckProgramInstall.isFfmpegAvailable());
|
||||||
|
verify(mockFfmpegExecutor)
|
||||||
|
.runCommandWithOutputHandling(Arrays.asList("ffmpeg", "-version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testIsFfmpegAvailable_WhenNotInstalled() throws Exception {
|
||||||
|
resetStaticFields();
|
||||||
|
when(mockFfmpegExecutor.runCommandWithOutputHandling(Arrays.asList("ffmpeg", "-version")))
|
||||||
|
.thenThrow(new IOException("Command not found"));
|
||||||
|
|
||||||
|
assertFalse(CheckProgramInstall.isFfmpegAvailable());
|
||||||
|
verify(mockFfmpegExecutor)
|
||||||
|
.runCommandWithOutputHandling(Arrays.asList("ffmpeg", "-version"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testIsFfmpegAvailable_CachesResult() throws Exception {
|
||||||
|
resetStaticFields();
|
||||||
|
ProcessExecutorResult result = Mockito.mock(ProcessExecutorResult.class);
|
||||||
|
when(mockFfmpegExecutor.runCommandWithOutputHandling(Arrays.asList("ffmpeg", "-version")))
|
||||||
|
.thenReturn(result);
|
||||||
|
|
||||||
|
assertTrue(CheckProgramInstall.isFfmpegAvailable());
|
||||||
|
|
||||||
|
when(mockFfmpegExecutor.runCommandWithOutputHandling(Arrays.asList("ffmpeg", "-version")))
|
||||||
|
.thenThrow(new IOException("Command not found"));
|
||||||
|
|
||||||
|
assertTrue(CheckProgramInstall.isFfmpegAvailable());
|
||||||
|
|
||||||
|
verify(mockFfmpegExecutor, times(1))
|
||||||
|
.runCommandWithOutputHandling(Arrays.asList("ffmpeg", "-version"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -262,6 +262,7 @@ public class EndpointConfiguration {
|
|||||||
addEndpointToGroup("Convert", "eml-to-pdf");
|
addEndpointToGroup("Convert", "eml-to-pdf");
|
||||||
addEndpointToGroup("Convert", "pdf-to-vector");
|
addEndpointToGroup("Convert", "pdf-to-vector");
|
||||||
addEndpointToGroup("Convert", "vector-to-pdf");
|
addEndpointToGroup("Convert", "vector-to-pdf");
|
||||||
|
addEndpointToGroup("Convert", "pdf-to-video");
|
||||||
|
|
||||||
// Adding endpoints to "Security" group
|
// Adding endpoints to "Security" group
|
||||||
addEndpointToGroup("Security", "add-password");
|
addEndpointToGroup("Security", "add-password");
|
||||||
@ -391,6 +392,7 @@ public class EndpointConfiguration {
|
|||||||
addEndpointToGroup("Java", "add-attachments");
|
addEndpointToGroup("Java", "add-attachments");
|
||||||
addEndpointToGroup("Java", "compress-pdf");
|
addEndpointToGroup("Java", "compress-pdf");
|
||||||
addEndpointToGroup("rar", "pdf-to-cbr");
|
addEndpointToGroup("rar", "pdf-to-cbr");
|
||||||
|
addEndpointToGroup("Java", "pdf-to-video");
|
||||||
|
|
||||||
// Javascript
|
// Javascript
|
||||||
addEndpointToGroup("Javascript", "pdf-organizer");
|
addEndpointToGroup("Javascript", "pdf-organizer");
|
||||||
@ -447,6 +449,9 @@ public class EndpointConfiguration {
|
|||||||
// Pdftohtml dependent endpoints
|
// Pdftohtml dependent endpoints
|
||||||
addEndpointToGroup("Pdftohtml", "pdf-to-html");
|
addEndpointToGroup("Pdftohtml", "pdf-to-html");
|
||||||
addEndpointToGroup("Pdftohtml", "pdf-to-markdown");
|
addEndpointToGroup("Pdftohtml", "pdf-to-markdown");
|
||||||
|
|
||||||
|
// FFmpeg dependent endpoints
|
||||||
|
addEndpointToGroup("FFmpeg", "pdf-to-video");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processEnvironmentConfigs() {
|
private void processEnvironmentConfigs() {
|
||||||
@ -493,7 +498,8 @@ public class EndpointConfiguration {
|
|||||||
|| "Javascript".equals(group)
|
|| "Javascript".equals(group)
|
||||||
|| "Weasyprint".equals(group)
|
|| "Weasyprint".equals(group)
|
||||||
|| "Pdftohtml".equals(group)
|
|| "Pdftohtml".equals(group)
|
||||||
|| "rar".equals(group);
|
|| "rar".equals(group)
|
||||||
|
|| "FFmpeg".equals(group);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isEndpointEnabledDirectly(String endpoint) {
|
private boolean isEndpointEnabledDirectly(String endpoint) {
|
||||||
|
|||||||
@ -67,6 +67,7 @@ public class ExternalAppDepConfig {
|
|||||||
tmp.put("qpdf", List.of("qpdf"));
|
tmp.put("qpdf", List.of("qpdf"));
|
||||||
tmp.put("tesseract", List.of("tesseract"));
|
tmp.put("tesseract", List.of("tesseract"));
|
||||||
tmp.put("rar", List.of("rar"));
|
tmp.put("rar", List.of("rar"));
|
||||||
|
tmp.put("ffmpeg", List.of("FFmpeg"));
|
||||||
this.commandToGroupMapping = Collections.unmodifiableMap(tmp);
|
this.commandToGroupMapping = Collections.unmodifiableMap(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,281 @@
|
|||||||
|
package stirling.software.SPDF.controller.api.converters;
|
||||||
|
|
||||||
|
import java.awt.AlphaComposite;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Font;
|
||||||
|
import java.awt.FontMetrics;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.geom.AffineTransform;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
import java.text.DecimalFormatSymbols;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
|
import org.apache.pdfbox.rendering.ImageType;
|
||||||
|
import org.apache.pdfbox.rendering.PDFRenderer;
|
||||||
|
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 stirling.software.SPDF.model.api.converters.PdfToVideoRequest;
|
||||||
|
import stirling.software.common.model.ApplicationProperties;
|
||||||
|
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||||
|
import stirling.software.common.util.ApplicationContextProvider;
|
||||||
|
import stirling.software.common.util.CheckProgramInstall;
|
||||||
|
import stirling.software.common.util.ExceptionUtils;
|
||||||
|
import stirling.software.common.util.ProcessExecutor;
|
||||||
|
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
|
||||||
|
import stirling.software.common.util.TempDirectory;
|
||||||
|
import stirling.software.common.util.TempFile;
|
||||||
|
import stirling.software.common.util.TempFileManager;
|
||||||
|
import stirling.software.common.util.WebResponseUtils;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/convert")
|
||||||
|
@Tag(name = "Convert", description = "Convert APIs")
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class ConvertPdfToVideoController {
|
||||||
|
|
||||||
|
private static final Set<String> SUPPORTED_FORMATS = Set.of("mp4", "webm");
|
||||||
|
private static final Map<String, String> RESOLUTION_FILTERS =
|
||||||
|
Map.of(
|
||||||
|
"ORIGINAL", "scale=trunc(iw/2)*2:trunc(ih/2)*2,setsar=1",
|
||||||
|
"1080P", "scale=-2:1080,setsar=1",
|
||||||
|
"720P", "scale=-2:720,setsar=1",
|
||||||
|
"480P", "scale=-2:480,setsar=1");
|
||||||
|
|
||||||
|
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||||
|
private final TempFileManager tempFileManager;
|
||||||
|
|
||||||
|
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/video")
|
||||||
|
@Operation(
|
||||||
|
summary = "Convert PDF to Video Slideshow",
|
||||||
|
description =
|
||||||
|
"This endpoint converts a PDF document into a slideshow-style video."
|
||||||
|
+ " Input:PDF Output:Video Type:SISO")
|
||||||
|
public ResponseEntity<byte[]> convertPdfToVideo(@ModelAttribute PdfToVideoRequest request)
|
||||||
|
throws Exception {
|
||||||
|
if (!CheckProgramInstall.isFfmpegAvailable()) {
|
||||||
|
throw ExceptionUtils.createFfmpegRequiredException();
|
||||||
|
}
|
||||||
|
|
||||||
|
MultipartFile inputFile = request.getFileInput();
|
||||||
|
if (inputFile == null || inputFile.isEmpty()) {
|
||||||
|
throw ExceptionUtils.createPdfFileRequiredException();
|
||||||
|
}
|
||||||
|
if (!MediaType.APPLICATION_PDF_VALUE.equals(inputFile.getContentType())) {
|
||||||
|
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
float opacity = request.getOpacity() != null ? request.getOpacity() : 1.0f;
|
||||||
|
if (opacity < 0.0f || opacity > 1.0f) {
|
||||||
|
throw ExceptionUtils.createIllegalArgumentException(
|
||||||
|
"error.invalidFormat", "Invalid {0} format: {1}", "opacity", opacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
String format = normalizeFormat(request.getVideoFormat());
|
||||||
|
int secondsPerPage = request.getSecondsPerPage() != null ? request.getSecondsPerPage() : 3;
|
||||||
|
if (secondsPerPage <= 0) {
|
||||||
|
throw ExceptionUtils.createIllegalArgumentException(
|
||||||
|
"error.invalidFormat",
|
||||||
|
"Invalid {0} format: {1}",
|
||||||
|
"secondsPerPage",
|
||||||
|
secondsPerPage);
|
||||||
|
}
|
||||||
|
int dpi = request.getDpi() != null ? request.getDpi() : 150;
|
||||||
|
int maxDpi = getMaxDpi();
|
||||||
|
if (dpi > maxDpi) {
|
||||||
|
throw ExceptionUtils.createIllegalArgumentException(
|
||||||
|
"error.dpiExceedsLimit",
|
||||||
|
"DPI value {0} exceeds maximum safe limit of {1}.",
|
||||||
|
dpi,
|
||||||
|
maxDpi);
|
||||||
|
}
|
||||||
|
if (dpi < 72) {
|
||||||
|
throw ExceptionUtils.createIllegalArgumentException(
|
||||||
|
"error.invalidFormat", "Invalid {0} format: {1}", "dpi", dpi);
|
||||||
|
}
|
||||||
|
|
||||||
|
String resolution =
|
||||||
|
request.getResolution() != null
|
||||||
|
? request.getResolution().toUpperCase(Locale.ROOT)
|
||||||
|
: "ORIGINAL";
|
||||||
|
if (!RESOLUTION_FILTERS.containsKey(resolution)) {
|
||||||
|
resolution = "ORIGINAL";
|
||||||
|
}
|
||||||
|
|
||||||
|
String watermarkText = request.getWatermarkText();
|
||||||
|
boolean isWatermarkEnabled = watermarkText != null && !watermarkText.isBlank();
|
||||||
|
|
||||||
|
String originalPdfFileName = Filenames.toSimpleFileName(inputFile.getOriginalFilename());
|
||||||
|
if (originalPdfFileName == null || originalPdfFileName.isBlank()) {
|
||||||
|
originalPdfFileName = "document.pdf";
|
||||||
|
}
|
||||||
|
String pdfBaseName =
|
||||||
|
originalPdfFileName.contains(".")
|
||||||
|
? originalPdfFileName.substring(0, originalPdfFileName.lastIndexOf('.'))
|
||||||
|
: originalPdfFileName;
|
||||||
|
|
||||||
|
try (TempFile inputTempFile = new TempFile(tempFileManager, ".pdf");
|
||||||
|
TempDirectory framesDirectory = new TempDirectory(tempFileManager);
|
||||||
|
TempFile outputVideo = new TempFile(tempFileManager, "." + format)) {
|
||||||
|
|
||||||
|
inputFile.transferTo(inputTempFile.getFile());
|
||||||
|
|
||||||
|
generateFrames(
|
||||||
|
inputTempFile.getPath(),
|
||||||
|
framesDirectory.getPath(),
|
||||||
|
dpi,
|
||||||
|
opacity,
|
||||||
|
watermarkText,
|
||||||
|
isWatermarkEnabled);
|
||||||
|
|
||||||
|
DecimalFormat decimalFormat =
|
||||||
|
new DecimalFormat("0.######", DecimalFormatSymbols.getInstance(Locale.ROOT));
|
||||||
|
String frameRate = decimalFormat.format(1.0d / secondsPerPage);
|
||||||
|
List<String> command = buildFfmpegCommand(format, resolution, frameRate, outputVideo);
|
||||||
|
|
||||||
|
ProcessExecutorResult result =
|
||||||
|
ProcessExecutor.getInstance(ProcessExecutor.Processes.FFMPEG)
|
||||||
|
.runCommandWithOutputHandling(
|
||||||
|
command, framesDirectory.getPath().toFile());
|
||||||
|
|
||||||
|
byte[] videoBytes = Files.readAllBytes(outputVideo.getPath());
|
||||||
|
MediaType mediaType = getMediaType(format);
|
||||||
|
String outputName = pdfBaseName + "-video." + format;
|
||||||
|
return WebResponseUtils.bytesToWebResponse(videoBytes, outputName, mediaType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateFrames(
|
||||||
|
Path inputPdf,
|
||||||
|
Path outputDir,
|
||||||
|
int dpi,
|
||||||
|
float opacity,
|
||||||
|
String watermarkText,
|
||||||
|
boolean isWatermarkEnabled)
|
||||||
|
throws IOException {
|
||||||
|
try (PDDocument document = pdfDocumentFactory.load(inputPdf.toFile())) {
|
||||||
|
PDFRenderer renderer = new PDFRenderer(document);
|
||||||
|
renderer.setSubsamplingAllowed(true);
|
||||||
|
int pageCount = document.getNumberOfPages();
|
||||||
|
if (pageCount == 0) {
|
||||||
|
throw ExceptionUtils.createIllegalArgumentException(
|
||||||
|
"error.invalidFormat", "Invalid {0} format: {1}", "PDF", "no pages");
|
||||||
|
}
|
||||||
|
for (int pageIndex = 0; pageIndex < pageCount; pageIndex++) {
|
||||||
|
BufferedImage image = renderer.renderImageWithDPI(pageIndex, dpi, ImageType.RGB);
|
||||||
|
if (isWatermarkEnabled) {
|
||||||
|
applyWatermark(image, opacity, watermarkText);
|
||||||
|
}
|
||||||
|
Path framePath =
|
||||||
|
outputDir.resolve(
|
||||||
|
String.format(Locale.ROOT, "frame_%05d.png", pageIndex + 1));
|
||||||
|
ImageIO.write(image, "png", framePath.toFile());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applyWatermark(BufferedImage image, float opacity, String watermarkText) {
|
||||||
|
Graphics2D graphics = image.createGraphics();
|
||||||
|
try {
|
||||||
|
graphics.setRenderingHint(
|
||||||
|
java.awt.RenderingHints.KEY_TEXT_ANTIALIASING,
|
||||||
|
java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
|
||||||
|
int baseDimension = Math.min(image.getWidth(), image.getHeight());
|
||||||
|
int fontSize = Math.max(32, baseDimension / 5);
|
||||||
|
Font font = new Font(Font.SANS_SERIF, Font.BOLD, fontSize);
|
||||||
|
graphics.setFont(font);
|
||||||
|
|
||||||
|
FontMetrics metrics = graphics.getFontMetrics(font);
|
||||||
|
int textWidth = metrics.stringWidth(watermarkText);
|
||||||
|
int textHeight = metrics.getAscent();
|
||||||
|
|
||||||
|
AffineTransform originalTransform = graphics.getTransform();
|
||||||
|
double angle = Math.atan2(image.getHeight(), image.getWidth());
|
||||||
|
graphics.translate(image.getWidth() / 2.0, image.getHeight() / 2.0);
|
||||||
|
graphics.rotate(-angle);
|
||||||
|
|
||||||
|
// Draw shadow
|
||||||
|
graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity / 2));
|
||||||
|
graphics.setColor(Color.BLACK);
|
||||||
|
graphics.drawString(watermarkText, -textWidth / 2f + 3, textHeight / 2f + 3);
|
||||||
|
|
||||||
|
// Draw main text
|
||||||
|
graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity));
|
||||||
|
graphics.setColor(Color.WHITE);
|
||||||
|
graphics.drawString(watermarkText, -textWidth / 2f, textHeight / 2f);
|
||||||
|
|
||||||
|
graphics.setTransform(originalTransform);
|
||||||
|
} finally {
|
||||||
|
graphics.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> buildFfmpegCommand(
|
||||||
|
String format, String resolution, String frameRate, TempFile outputVideo) {
|
||||||
|
List<String> command = new ArrayList<>();
|
||||||
|
command.add("ffmpeg");
|
||||||
|
command.add("-y");
|
||||||
|
command.add("-framerate");
|
||||||
|
command.add(frameRate);
|
||||||
|
command.add("-i");
|
||||||
|
command.add("frame_%05d.png");
|
||||||
|
command.add("-vf");
|
||||||
|
command.add(
|
||||||
|
RESOLUTION_FILTERS.getOrDefault(resolution, RESOLUTION_FILTERS.get("ORIGINAL")));
|
||||||
|
if ("mp4".equals(format)) {
|
||||||
|
command.addAll(
|
||||||
|
List.of("-c:v", "libx264", "-pix_fmt", "yuv420p", "-movflags", "+faststart"));
|
||||||
|
} else if ("webm".equals(format)) {
|
||||||
|
command.addAll(List.of("-c:v", "libvpx-vp9", "-b:v", "0", "-crf", "30"));
|
||||||
|
}
|
||||||
|
command.add(outputVideo.getAbsolutePath());
|
||||||
|
return command;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String normalizeFormat(String requestedFormat) {
|
||||||
|
String format = requestedFormat != null ? requestedFormat.toLowerCase(Locale.ROOT) : "mp4";
|
||||||
|
if (!SUPPORTED_FORMATS.contains(format)) {
|
||||||
|
format = "mp4";
|
||||||
|
}
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getMaxDpi() {
|
||||||
|
ApplicationProperties properties =
|
||||||
|
ApplicationContextProvider.getBean(ApplicationProperties.class);
|
||||||
|
if (properties != null && properties.getSystem() != null) {
|
||||||
|
return properties.getSystem().getMaxDPI();
|
||||||
|
}
|
||||||
|
return 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MediaType getMediaType(String format) {
|
||||||
|
return switch (format) {
|
||||||
|
case "webm" -> MediaType.valueOf("video/webm");
|
||||||
|
default -> MediaType.valueOf("video/mp4");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -186,4 +186,18 @@ public class ConverterWebController {
|
|||||||
model.addAttribute("currentPage", "eml-to-pdf");
|
model.addAttribute("currentPage", "eml-to-pdf");
|
||||||
return "convert/eml-to-pdf";
|
return "convert/eml-to-pdf";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/pdf-to-video")
|
||||||
|
@Hidden
|
||||||
|
public String pdfToVideo(Model model) {
|
||||||
|
ApplicationProperties properties =
|
||||||
|
ApplicationContextProvider.getBean(ApplicationProperties.class);
|
||||||
|
if (properties != null && properties.getSystem() != null) {
|
||||||
|
model.addAttribute("maxDPI", properties.getSystem().getMaxDPI());
|
||||||
|
} else {
|
||||||
|
model.addAttribute("maxDPI", 500);
|
||||||
|
}
|
||||||
|
model.addAttribute("currentPage", "pdf-to-video");
|
||||||
|
return "convert/pdf-to-video";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,53 @@
|
|||||||
|
package stirling.software.SPDF.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 PdfToVideoRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(
|
||||||
|
description = "The output video format",
|
||||||
|
allowableValues = {"mp4", "webm"},
|
||||||
|
defaultValue = "mp4")
|
||||||
|
private String videoFormat = "mp4";
|
||||||
|
|
||||||
|
@Schema(
|
||||||
|
description = "Seconds each page should appear in the video",
|
||||||
|
minimum = "1",
|
||||||
|
maximum = "30",
|
||||||
|
defaultValue = "3")
|
||||||
|
private Integer secondsPerPage = 3;
|
||||||
|
|
||||||
|
@Schema(
|
||||||
|
description = "Target video resolution",
|
||||||
|
allowableValues = {"ORIGINAL", "1080p", "720p", "480p"},
|
||||||
|
defaultValue = "ORIGINAL")
|
||||||
|
private String resolution = "ORIGINAL";
|
||||||
|
|
||||||
|
@Schema(
|
||||||
|
description = "DPI to render PDF pages before encoding",
|
||||||
|
minimum = "72",
|
||||||
|
maximum = "500",
|
||||||
|
defaultValue = "150")
|
||||||
|
private Integer dpi = 150;
|
||||||
|
|
||||||
|
@Schema(
|
||||||
|
description =
|
||||||
|
"Opacity of the watermark (only applied if a watermark text is specified)",
|
||||||
|
minimum = "0.0",
|
||||||
|
maximum = "1.0",
|
||||||
|
defaultValue = "0.1")
|
||||||
|
private Float opacity = 0.1f;
|
||||||
|
|
||||||
|
@Schema(
|
||||||
|
description = "Watermark text to overlay on the video",
|
||||||
|
example = "Stirling Software",
|
||||||
|
defaultValue = "Stirling Software")
|
||||||
|
private String watermarkText;
|
||||||
|
}
|
||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=تحويل PDF إلى صورة
|
|||||||
home.pdfToImage.desc=تحويل ملف PDF إلى صورة. (PNG ، JPEG ، GIF)
|
home.pdfToImage.desc=تحويل ملف PDF إلى صورة. (PNG ، JPEG ، GIF)
|
||||||
pdfToImage.tags=تحويل,صورة,jpg,صورة,صورة فوتوغرافية
|
pdfToImage.tags=تحويل,صورة,jpg,صورة,صورة فوتوغرافية
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=منظم
|
home.pdfOrganiser.title=منظم
|
||||||
home.pdfOrganiser.desc=إزالة / إعادة ترتيب الصفحات بأي ترتيب
|
home.pdfOrganiser.desc=إزالة / إعادة ترتيب الصفحات بأي ترتيب
|
||||||
pdfOrganiser.tags=مزدوج,زوجي,فردي,ترتيب,نقل
|
pdfOrganiser.tags=مزدوج,زوجي,فردي,ترتيب,نقل
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(مثال: 1,2,8 أو 4,7,12-16 أو 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=إضافة كلمة مرور
|
addPassword.title=إضافة كلمة مرور
|
||||||
addPassword.header=إضافة كلمة مرور (تشفير)
|
addPassword.header=إضافة كلمة مرور (تشفير)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF-dən Şəkilə
|
|||||||
home.pdfToImage.desc=PDF-i Şəkilə Çevir. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=PDF-i Şəkilə Çevir. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=çevirmə,şəkil,jpg,fotoşəkil,foto
|
pdfToImage.tags=çevirmə,şəkil,jpg,fotoşəkil,foto
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Səhifələri Sırala
|
home.pdfOrganiser.title=Səhifələri Sırala
|
||||||
home.pdfOrganiser.desc=Səhifələri Sil/Sırasını Dəyiş
|
home.pdfOrganiser.desc=Səhifələri Sil/Sırasını Dəyiş
|
||||||
pdfOrganiser.tags=duplex,tək,cüt,sırala,yerini dəyiş
|
pdfOrganiser.tags=duplex,tək,cüt,sırala,yerini dəyiş
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(məsələn, 1,2,8 və ya 4,7,12-16 və ya 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Şifr Əlavə Et
|
addPassword.title=Şifr Əlavə Et
|
||||||
addPassword.header=Şifr Əlavə Et (Şifrləmə)
|
addPassword.header=Şifr Əlavə Et (Şifrləmə)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF към изображение
|
|||||||
home.pdfToImage.desc=Преобразуване на PDF към изображение. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Преобразуване на PDF към изображение. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=преобразуване,img,jpg,изображение,снимка
|
pdfToImage.tags=преобразуване,img,jpg,изображение,снимка
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Организиране
|
home.pdfOrganiser.title=Организиране
|
||||||
home.pdfOrganiser.desc=Премахване/пренареждане на страници към произволен ред
|
home.pdfOrganiser.desc=Премахване/пренареждане на страници към произволен ред
|
||||||
pdfOrganiser.tags=дуплекс,четно,нечетно,сортиране,преместване
|
pdfOrganiser.tags=дуплекс,четно,нечетно,сортиране,преместване
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Добавяне на парола
|
addPassword.title=Добавяне на парола
|
||||||
addPassword.header=Добавяне на парола (Шифроване)
|
addPassword.header=Добавяне на парола (Шифроване)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF ནས་པར་རིས་ལ།
|
|||||||
home.pdfToImage.desc=PDF ནས་པར་རིས་ (PNG, JPEG, GIF) ལ་བསྒྱུར་བ།
|
home.pdfToImage.desc=PDF ནས་པར་རིས་ (PNG, JPEG, GIF) ལ་བསྒྱུར་བ།
|
||||||
pdfToImage.tags=བསྒྱུར་བ།,པར་རིས།,jpg,པར།,འདྲ་པར།
|
pdfToImage.tags=བསྒྱུར་བ།,པར་རིས།,jpg,པར།,འདྲ་པར།
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=གོ་སྒྲིག
|
home.pdfOrganiser.title=གོ་སྒྲིག
|
||||||
home.pdfOrganiser.desc=ཤོག་ངོས་རྣམས་གོ་རིམ་གང་རུང་དུ་སུབ་པའམ་བསྐྱར་སྒྲིག་བྱེད་པ།
|
home.pdfOrganiser.desc=ཤོག་ངོས་རྣམས་གོ་རིམ་གང་རུང་དུ་སུབ་པའམ་བསྐྱར་སྒྲིག་བྱེད་པ།
|
||||||
pdfOrganiser.tags=ཤོག་ངོས་གཉིས་མ།,ཨང་གྲངས་ཟུང་ལྡན།,ཨང་གྲངས་ཡ་གྲངས།,གོ་རིམ་སྒྲིག་པ།,སྤོ་བ།
|
pdfOrganiser.tags=ཤོག་ངོས་གཉིས་མ།,ཨང་གྲངས་ཟུང་ལྡན།,ཨང་གྲངས་ཡ་གྲངས།,གོ་རིམ་སྒྲིག་པ།,སྤོ་བ།
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(དཔེར་ན། 1,2,8 ཡང་ན་ 4,7,12-16
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=གསང་ཚིག་སྣོན་པ།
|
addPassword.title=གསང་ཚིག་སྣོན་པ།
|
||||||
addPassword.header=གསང་ཚིག་སྣོན་པ། (གསང་སྡོམ།)
|
addPassword.header=གསང་ཚིག་སྣོན་པ། (གསང་སྡོམ།)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF a Imatge
|
|||||||
home.pdfToImage.desc=Converteix PDF a imatge (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Converteix PDF a imatge (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=conversió,img,jpg,imatge,foto
|
pdfToImage.tags=conversió,img,jpg,imatge,foto
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organitza
|
home.pdfOrganiser.title=Organitza
|
||||||
home.pdfOrganiser.desc=Elimina/reorganitza pàgines en qualsevol ordre
|
home.pdfOrganiser.desc=Elimina/reorganitza pàgines en qualsevol ordre
|
||||||
pdfOrganiser.tags=duplex,parells,senars,ordenar,moure
|
pdfOrganiser.tags=duplex,parells,senars,ordenar,moure
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(p. ex. 1,2,8 o 4,7,12-16 o 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Afegir Contrasenya
|
addPassword.title=Afegir Contrasenya
|
||||||
addPassword.header=Afegir contrasenya (Encriptat)
|
addPassword.header=Afegir contrasenya (Encriptat)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF na obrázek
|
|||||||
home.pdfToImage.desc=Převést PDF na obrázek. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Převést PDF na obrázek. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=převod,img,jpg,obrázek,fotka
|
pdfToImage.tags=převod,img,jpg,obrázek,fotka
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Uspořádat
|
home.pdfOrganiser.title=Uspořádat
|
||||||
home.pdfOrganiser.desc=Odstranit/přeuspořádat stránky v libovolném pořadí
|
home.pdfOrganiser.desc=Odstranit/přeuspořádat stránky v libovolném pořadí
|
||||||
pdfOrganiser.tags=duplex,sudý,lichý,seřadit,přesunout
|
pdfOrganiser.tags=duplex,sudý,lichý,seřadit,přesunout
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(např. 1,2,8 nebo 4,7,12-16 nebo 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Přidat heslo
|
addPassword.title=Přidat heslo
|
||||||
addPassword.header=Přidat heslo (Zašifrovat)
|
addPassword.header=Přidat heslo (Zašifrovat)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF til Billede
|
|||||||
home.pdfToImage.desc=Konvertér en PDF til et billede. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Konvertér en PDF til et billede. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=konvertering,img,jpg,billede,foto
|
pdfToImage.tags=konvertering,img,jpg,billede,foto
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organisér
|
home.pdfOrganiser.title=Organisér
|
||||||
home.pdfOrganiser.desc=Fjern/Omarrangér sider i vilkårlig rækkefølge
|
home.pdfOrganiser.desc=Fjern/Omarrangér sider i vilkårlig rækkefølge
|
||||||
pdfOrganiser.tags=duplex,lige,ulige,sortér,flyt
|
pdfOrganiser.tags=duplex,lige,ulige,sortér,flyt
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(f.eks. 1,2,8 eller 4,7,12-16 eller 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Tilføj Adgangskode
|
addPassword.title=Tilføj Adgangskode
|
||||||
addPassword.header=Tilføj adgangskode (Kryptér)
|
addPassword.header=Tilføj adgangskode (Kryptér)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF zu Bild
|
|||||||
home.pdfToImage.desc=Konvertieren Sie ein PDF in ein Bild (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Konvertieren Sie ein PDF in ein Bild (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=konvertierung,img,jpg,bild,foto
|
pdfToImage.tags=konvertierung,img,jpg,bild,foto
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF zu Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Konvertieren Sie ein PDF in ein Slideshow-Video.
|
||||||
|
PDFToVideo.tags=konvertierung,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organisieren
|
home.pdfOrganiser.title=Organisieren
|
||||||
home.pdfOrganiser.desc=Seiten entfernen und Seitenreihenfolge ändern
|
home.pdfOrganiser.desc=Seiten entfernen und Seitenreihenfolge ändern
|
||||||
pdfOrganiser.tags=duplex,gerade,ungerade,sortieren,verschieben
|
pdfOrganiser.tags=duplex,gerade,ungerade,sortieren,verschieben
|
||||||
@ -1260,8 +1264,8 @@ repair.submit=Reparieren
|
|||||||
flatten.title=Abflachen
|
flatten.title=Abflachen
|
||||||
flatten.header=PDFs reduzieren
|
flatten.header=PDFs reduzieren
|
||||||
flatten.flattenOnlyForms=Nur Formulare abflachen
|
flatten.flattenOnlyForms=Nur Formulare abflachen
|
||||||
flatten.renderDpi=Rendering DPI (optional, recommended 150 DPI):
|
flatten.renderDpi=Rendering-DPI (optional, empfohlen 150 DPI):
|
||||||
flatten.renderDpi.help=Leave blank to use the system default. Higher DPI sharpens output but increases processing time and file size.
|
flatten.renderDpi.help=Leer lassen, um den Systemstandard zu verwenden. Höhere DPI verbessern die Schärfe der Ausgabe, erhöhen jedoch die Verarbeitungszeit und Dateigröße.
|
||||||
flatten.submit=Abflachen
|
flatten.submit=Abflachen
|
||||||
|
|
||||||
|
|
||||||
@ -1402,8 +1406,8 @@ multiTool.delete=Löschen
|
|||||||
multiTool.dragDropMessage=Ausgewählte Seite(n)
|
multiTool.dragDropMessage=Ausgewählte Seite(n)
|
||||||
multiTool.undo=Rückgängig machen
|
multiTool.undo=Rückgängig machen
|
||||||
multiTool.redo=Wiederherstellen
|
multiTool.redo=Wiederherstellen
|
||||||
multiTool.duplicate=Duplicate
|
multiTool.duplicate=Duplizieren
|
||||||
multiTool.svgNotSupported=SVG files are not supported in Multi Tool and were ignored.
|
multiTool.svgNotSupported=SVG-Dateien werden in Multi Tool nicht unterstützt und wurden ignoriert.
|
||||||
|
|
||||||
#decrypt
|
#decrypt
|
||||||
decrypt.passwordPrompt=Diese Datei ist passwortgeschützt. Bitte geben Sie das Passwort ein:
|
decrypt.passwordPrompt=Diese Datei ist passwortgeschützt. Bitte geben Sie das Passwort ein:
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(z.B. 1,2,8 oder 4,7,12-16 oder 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Kommentare, Markierungen usw. einbeziehen
|
pdfToImage.includeAnnotations=Kommentare, Markierungen usw. einbeziehen
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF zu Video Slideshow
|
||||||
|
pdfToVideo.header=PDF zu Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Videoformat
|
||||||
|
pdfToVideo.secondsPerPage=Sekunden pro Seite
|
||||||
|
pdfToVideo.resolution=Auflösung
|
||||||
|
pdfToVideo.watermarkText=Wasserzeichen-Text (leer lassen für kein Wasserzeichen)
|
||||||
|
pdfToVideo.opacity=Deckkraft des Wasserzeichens (nur angewendet, wenn ein Wasserzeichen-Text angegeben ist)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (PDF-Seitengröße beibehalten)
|
||||||
|
pdfToVideo.dpiLabel=DPI (Das Serverlimit beträgt {0} dpi)
|
||||||
|
pdfToVideo.submit=Konvertieren
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Passwort hinzufügen
|
addPassword.title=Passwort hinzufügen
|
||||||
addPassword.header=Passwort hinzufügen (Verschlüsseln)
|
addPassword.header=Passwort hinzufügen (Verschlüsseln)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF σε εικόνα
|
|||||||
home.pdfToImage.desc=Μετατροπή PDF σε εικόνα. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Μετατροπή PDF σε εικόνα. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=μετατροπή,εικόνα,jpg,φωτογραφία
|
pdfToImage.tags=μετατροπή,εικόνα,jpg,φωτογραφία
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Οργάνωση
|
home.pdfOrganiser.title=Οργάνωση
|
||||||
home.pdfOrganiser.desc=Αφαίρεση/Αναδιάταξη σελίδων σε οποιαδήποτε σειρά
|
home.pdfOrganiser.desc=Αφαίρεση/Αναδιάταξη σελίδων σε οποιαδήποτε σειρά
|
||||||
pdfOrganiser.tags=duplex,ζυγός,μονός,ταξινόμηση,μετακίνηση
|
pdfOrganiser.tags=duplex,ζυγός,μονός,ταξινόμηση,μετακίνηση
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(π.χ. 1,2,8 ή 4,7,12-16 ή 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Προσθήκη κωδικού
|
addPassword.title=Προσθήκη κωδικού
|
||||||
addPassword.header=Προσθήκη κωδικού (Κρυπτογράφηση)
|
addPassword.header=Προσθήκη κωδικού (Κρυπτογράφηση)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF to Image
|
|||||||
home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF, PSD)
|
home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF, PSD)
|
||||||
pdfToImage.tags=conversion,img,jpg,picture,photo,psd,photoshop
|
pdfToImage.tags=conversion,img,jpg,picture,photo,psd,photoshop
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organise
|
home.pdfOrganiser.title=Organise
|
||||||
home.pdfOrganiser.desc=Remove/Rearrange pages in any order
|
home.pdfOrganiser.desc=Remove/Rearrange pages in any order
|
||||||
pdfOrganiser.tags=duplex,even,odd,sort,move
|
pdfOrganiser.tags=duplex,even,odd,sort,move
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Add Password
|
addPassword.title=Add Password
|
||||||
addPassword.header=Add password (Encrypt)
|
addPassword.header=Add password (Encrypt)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF to Image
|
|||||||
home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF, PSD)
|
home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF, PSD)
|
||||||
pdfToImage.tags=conversion,img,jpg,picture,photo,psd,photoshop
|
pdfToImage.tags=conversion,img,jpg,picture,photo,psd,photoshop
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organize
|
home.pdfOrganiser.title=Organize
|
||||||
home.pdfOrganiser.desc=Remove/Rearrange pages in any order
|
home.pdfOrganiser.desc=Remove/Rearrange pages in any order
|
||||||
pdfOrganiser.tags=duplex,even,odd,sort,move
|
pdfOrganiser.tags=duplex,even,odd,sort,move
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Add Password
|
addPassword.title=Add Password
|
||||||
addPassword.header=Add password (Encrypt)
|
addPassword.header=Add password (Encrypt)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF a Imagen
|
|||||||
home.pdfToImage.desc=Convertir un PDF a una imagen (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Convertir un PDF a una imagen (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=conversión,img,jpg,imagen,fotografía
|
pdfToImage.tags=conversión,img,jpg,imagen,fotografía
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organizador
|
home.pdfOrganiser.title=Organizador
|
||||||
home.pdfOrganiser.desc=Eliminar/Reorganizar páginas en cualquier orden
|
home.pdfOrganiser.desc=Eliminar/Reorganizar páginas en cualquier orden
|
||||||
pdfOrganiser.tags=doble cara,pares,impares,ordenar,mover
|
pdfOrganiser.tags=doble cara,pares,impares,ordenar,mover
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(por ejemplo 1,2,8 o 4,7,12-16 o 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Añadir contraseña
|
addPassword.title=Añadir contraseña
|
||||||
addPassword.header=Añadir contraseña (cifrar)
|
addPassword.header=Añadir contraseña (cifrar)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDFa irudi bihurtu
|
|||||||
home.pdfToImage.desc=PDF bat irudi (PNG, JPEG, GIF) bihurtu
|
home.pdfToImage.desc=PDF bat irudi (PNG, JPEG, GIF) bihurtu
|
||||||
pdfToImage.tags=conversion,img,jpg,picture,photo,psd,photoshop
|
pdfToImage.tags=conversion,img,jpg,picture,photo,psd,photoshop
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Antolatzailea
|
home.pdfOrganiser.title=Antolatzailea
|
||||||
home.pdfOrganiser.desc=Ezabatu/Berrantolatu orrialdeak edozein ordenatan
|
home.pdfOrganiser.desc=Ezabatu/Berrantolatu orrialdeak edozein ordenatan
|
||||||
pdfOrganiser.tags=duplex,even,odd,sort,move
|
pdfOrganiser.tags=duplex,even,odd,sort,move
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Gehitu pasahitza
|
addPassword.title=Gehitu pasahitza
|
||||||
addPassword.header=Gehitu pasahitza (enkriptatu)
|
addPassword.header=Gehitu pasahitza (enkriptatu)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF به تصویر
|
|||||||
home.pdfToImage.desc=تبدیل یک فایل PDF به یک تصویر. (PNG، JPEG، GIF)
|
home.pdfToImage.desc=تبدیل یک فایل PDF به یک تصویر. (PNG، JPEG، GIF)
|
||||||
pdfToImage.tags=تبدیل،عکس،jpg،تصویر،عکس
|
pdfToImage.tags=تبدیل،عکس،jpg،تصویر،عکس
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=سازماندهی
|
home.pdfOrganiser.title=سازماندهی
|
||||||
home.pdfOrganiser.desc=حذف/بازآرایی صفحات به ترتیب دلخواه
|
home.pdfOrganiser.desc=حذف/بازآرایی صفحات به ترتیب دلخواه
|
||||||
pdfOrganiser.tags=دوطرفه،زوج،فرد،مرتبسازی،جابجایی
|
pdfOrganiser.tags=دوطرفه،زوج،فرد،مرتبسازی،جابجایی
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(مثال: 1,2,8 یا 4,7,12-16 یا 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=افزودن گذرواژه
|
addPassword.title=افزودن گذرواژه
|
||||||
addPassword.header=افزودن گذرواژه (رمزنگاری)
|
addPassword.header=افزودن گذرواژه (رمزنگاری)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF en image
|
|||||||
home.pdfToImage.desc=Convertissez un PDF en image (PNG, JPEG, GIF).
|
home.pdfToImage.desc=Convertissez un PDF en image (PNG, JPEG, GIF).
|
||||||
pdfToImage.tags=conversion,img,jpg,image,photo
|
pdfToImage.tags=conversion,img,jpg,image,photo
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organiser
|
home.pdfOrganiser.title=Organiser
|
||||||
home.pdfOrganiser.desc=Supprimez ou réorganisez les pages dans n'importe quel ordre.
|
home.pdfOrganiser.desc=Supprimez ou réorganisez les pages dans n'importe quel ordre.
|
||||||
pdfOrganiser.tags=organiser,recto-verso,duplex,even,odd,sort,move
|
pdfOrganiser.tags=organiser,recto-verso,duplex,even,odd,sort,move
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(par exemple : 1,2,8 ou 4,7,12-16 ou 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Inclure les annotations (commentaires, souligné etc.)
|
pdfToImage.includeAnnotations=Inclure les annotations (commentaires, souligné etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Ajouter un mot de passe
|
addPassword.title=Ajouter un mot de passe
|
||||||
addPassword.header=Ajouter un mot de passe
|
addPassword.header=Ajouter un mot de passe
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF go íomhá
|
|||||||
home.pdfToImage.desc=Tiontaigh PDF a íomhá. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Tiontaigh PDF a íomhá. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=comhshó, img, jpg, pictiúr, grianghraf
|
pdfToImage.tags=comhshó, img, jpg, pictiúr, grianghraf
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Eagraigh
|
home.pdfOrganiser.title=Eagraigh
|
||||||
home.pdfOrganiser.desc=Bain/Atheagraigh na leathanaigh in ord ar bith
|
home.pdfOrganiser.desc=Bain/Atheagraigh na leathanaigh in ord ar bith
|
||||||
pdfOrganiser.tags=déphléacsacha, cothrom, corr, sórtáil, bogadh
|
pdfOrganiser.tags=déphléacsacha, cothrom, corr, sórtáil, bogadh
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(m.sh. 1,2,8 nó 4,7,12-16 nó 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Cuir Pasfhocal leis
|
addPassword.title=Cuir Pasfhocal leis
|
||||||
addPassword.header=Cuir pasfhocal leis (Criptigh)
|
addPassword.header=Cuir pasfhocal leis (Criptigh)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF से छवि
|
|||||||
home.pdfToImage.desc=PDF को छवि में बदलें। (PNG, JPEG, GIF)
|
home.pdfToImage.desc=PDF को छवि में बदलें। (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=रूपांतरण,img,jpg,चित्र,फोटो
|
pdfToImage.tags=रूपांतरण,img,jpg,चित्र,फोटो
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=व्यवस्थित करें
|
home.pdfOrganiser.title=व्यवस्थित करें
|
||||||
home.pdfOrganiser.desc=किसी भी क्रम में पृष्ठ निकालें/पुनर्व्यवस्थित करें
|
home.pdfOrganiser.desc=किसी भी क्रम में पृष्ठ निकालें/पुनर्व्यवस्थित करें
|
||||||
pdfOrganiser.tags=डुप्लेक्स,सम,विषम,क्रमबद्ध करें,मूव
|
pdfOrganiser.tags=डुप्लेक्स,सम,विषम,क्रमबद्ध करें,मूव
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(जैसे 1,2,8 या 4,7,12-16 या 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=पासवर्ड जोड़ें
|
addPassword.title=पासवर्ड जोड़ें
|
||||||
addPassword.header=पासवर्ड जोड़ें (एन्क्रिप्ट)
|
addPassword.header=पासवर्ड जोड़ें (एन्क्रिप्ट)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF u sliku
|
|||||||
home.pdfToImage.desc=Pretvorite PDF u sliku (PNG, JPEG, GIF, PSD).
|
home.pdfToImage.desc=Pretvorite PDF u sliku (PNG, JPEG, GIF, PSD).
|
||||||
pdfToImage.tags=pretvorba,img,jpg,slika,fotografija,psd,photoshop
|
pdfToImage.tags=pretvorba,img,jpg,slika,fotografija,psd,photoshop
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organiziranje
|
home.pdfOrganiser.title=Organiziranje
|
||||||
home.pdfOrganiser.desc=Uklonite/preuredite stranice u bilo kojem redoslijedu
|
home.pdfOrganiser.desc=Uklonite/preuredite stranice u bilo kojem redoslijedu
|
||||||
pdfOrganiser.tags=dvostrano,parno,neparno,sortiranje,pomicanje
|
pdfOrganiser.tags=dvostrano,parno,neparno,sortiranje,pomicanje
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(npr. 1,2,8 ili 4,7,12-16 ili 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Dodaj lozinku
|
addPassword.title=Dodaj lozinku
|
||||||
addPassword.header=Dodaj lozinku (šifriraj)
|
addPassword.header=Dodaj lozinku (šifriraj)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF képpé
|
|||||||
home.pdfToImage.desc=PDF konvertálása képpé (PNG, JPEG, GIF).
|
home.pdfToImage.desc=PDF konvertálása képpé (PNG, JPEG, GIF).
|
||||||
pdfToImage.tags=konverzió,kép,jpg,fotó,fénykép
|
pdfToImage.tags=konverzió,kép,jpg,fotó,fénykép
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Rendszerezés
|
home.pdfOrganiser.title=Rendszerezés
|
||||||
home.pdfOrganiser.desc=Oldalak eltávolítása/átrendezése tetszőleges sorrendben
|
home.pdfOrganiser.desc=Oldalak eltávolítása/átrendezése tetszőleges sorrendben
|
||||||
pdfOrganiser.tags=duplex,páros,páratlan,rendezés,mozgatás
|
pdfOrganiser.tags=duplex,páros,páratlan,rendezés,mozgatás
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(pl. 1,2,8 vagy 4,7,12-16 vagy 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Megjegyzések belefoglalása (kommentek, kiemelések stb.)
|
pdfToImage.includeAnnotations=Megjegyzések belefoglalása (kommentek, kiemelések stb.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Jelszó hozzáadása
|
addPassword.title=Jelszó hozzáadása
|
||||||
addPassword.header=Jelszó hozzáadása (Titkosítás)
|
addPassword.header=Jelszó hozzáadása (Titkosítás)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF ke Gambar
|
|||||||
home.pdfToImage.desc=Mengonversi PDF ke gambar. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Mengonversi PDF ke gambar. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=konversi,img,jpg,gambar,foto
|
pdfToImage.tags=konversi,img,jpg,gambar,foto
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Mengatur
|
home.pdfOrganiser.title=Mengatur
|
||||||
home.pdfOrganiser.desc=Menghapus/Mengatur ulang halaman dalam urutan apa pun
|
home.pdfOrganiser.desc=Menghapus/Mengatur ulang halaman dalam urutan apa pun
|
||||||
pdfOrganiser.tags=dupleks,genap,ganjil,sortir,pindah
|
pdfOrganiser.tags=dupleks,genap,ganjil,sortir,pindah
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(misalnya 1,2,8 atau 4,7,12-16 atau 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Tambahkan kata sandi
|
addPassword.title=Tambahkan kata sandi
|
||||||
addPassword.header=Tambahkan kata sandi (Enkrip)
|
addPassword.header=Tambahkan kata sandi (Enkrip)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=Da PDF a immagine
|
|||||||
home.pdfToImage.desc=Converti un PDF in un'immagine. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Converti un PDF in un'immagine. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=conversione,img,jpg,immagine,foto
|
pdfToImage.tags=conversione,img,jpg,immagine,foto
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organizza
|
home.pdfOrganiser.title=Organizza
|
||||||
home.pdfOrganiser.desc=Rimuovi/Riordina le pagine in qualsiasi ordine.
|
home.pdfOrganiser.desc=Rimuovi/Riordina le pagine in qualsiasi ordine.
|
||||||
pdfOrganiser.tags=duplex,pari,dispari,ordinamento,spostamento
|
pdfOrganiser.tags=duplex,pari,dispari,ordinamento,spostamento
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(es. 1,2,8 o 4,7,12-16 o 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Includi annotazioni (commenti, evidenziazioni, ecc.)
|
pdfToImage.includeAnnotations=Includi annotazioni (commenti, evidenziazioni, ecc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Aggiungi Password
|
addPassword.title=Aggiungi Password
|
||||||
addPassword.header=Aggiungi password (crittografa)
|
addPassword.header=Aggiungi password (crittografa)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDFを画像に変換
|
|||||||
home.pdfToImage.desc=PDFを画像 (PNG, JPEG, GIF) に変換します。
|
home.pdfToImage.desc=PDFを画像 (PNG, JPEG, GIF) に変換します。
|
||||||
pdfToImage.tags=conversion,img,jpg,picture,photo,psd,photoshop
|
pdfToImage.tags=conversion,img,jpg,picture,photo,psd,photoshop
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=整理
|
home.pdfOrganiser.title=整理
|
||||||
home.pdfOrganiser.desc=ページの削除/並べ替えします。
|
home.pdfOrganiser.desc=ページの削除/並べ替えします。
|
||||||
pdfOrganiser.tags=duplex,even,odd,sort,move
|
pdfOrganiser.tags=duplex,even,odd,sort,move
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(例:1,2,8、4,7,12-16、2n-1)
|
|||||||
pdfToImage.includeAnnotations=注釈(コメント、ハイライトなど)を含める
|
pdfToImage.includeAnnotations=注釈(コメント、ハイライトなど)を含める
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=パスワードの追加
|
addPassword.title=パスワードの追加
|
||||||
addPassword.header=パスワードの追加(暗号化)
|
addPassword.header=パスワードの追加(暗号化)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF를 이미지로
|
|||||||
home.pdfToImage.desc=PDF를 이미지로 변환합니다. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=PDF를 이미지로 변환합니다. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=변환,이미지,jpg,사진
|
pdfToImage.tags=변환,이미지,jpg,사진
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=정리
|
home.pdfOrganiser.title=정리
|
||||||
home.pdfOrganiser.desc=원하는 순서로 페이지 제거/재배치
|
home.pdfOrganiser.desc=원하는 순서로 페이지 제거/재배치
|
||||||
pdfOrganiser.tags=양면,짝수,홀수,정렬,이동
|
pdfOrganiser.tags=양면,짝수,홀수,정렬,이동
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(예: 1,2,8 또는 4,7,12-16 또는 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=비밀번호 추가
|
addPassword.title=비밀번호 추가
|
||||||
addPassword.header=비밀번호 추가 (암호화)
|
addPassword.header=비밀번호 추가 (암호화)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF ചിത്രത്തിലേക്ക്
|
|||||||
home.pdfToImage.desc=ഒരു PDF ചിത്രത്തിലേക്ക് മാറ്റുക. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=ഒരു PDF ചിത്രത്തിലേക്ക് മാറ്റുക. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=പരിവർത്തനം,img,jpg,ചിത്രം,ഫോട്ടോ
|
pdfToImage.tags=പരിവർത്തനം,img,jpg,ചിത്രം,ഫോട്ടോ
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=ക്രമീകരിക്കുക
|
home.pdfOrganiser.title=ക്രമീകരിക്കുക
|
||||||
home.pdfOrganiser.desc=ഏത് ക്രമത്തിലും പേജുകൾ നീക്കം ചെയ്യുക/പുനഃക്രമീകരിക്കുക
|
home.pdfOrganiser.desc=ഏത് ക്രമത്തിലും പേജുകൾ നീക്കം ചെയ്യുക/പുനഃക്രമീകരിക്കുക
|
||||||
pdfOrganiser.tags=ഡ്യൂപ്ലെക്സ്,ഇരട്ട,ഒറ്റ,അടുക്കുക,നീക്കുക
|
pdfOrganiser.tags=ഡ്യൂപ്ലെക്സ്,ഇരട്ട,ഒറ്റ,അടുക്കുക,നീക്കുക
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(ഉദാ. 1,2,8 അല്ലെങ്കിൽ 4,7,12-1
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=പാസ്വേഡ് ചേർക്കുക
|
addPassword.title=പാസ്വേഡ് ചേർക്കുക
|
||||||
addPassword.header=പാസ്വേഡ് ചേർക്കുക (എൻക്രിപ്റ്റ് ചെയ്യുക)
|
addPassword.header=പാസ്വേഡ് ചേർക്കുക (എൻക്രിപ്റ്റ് ചെയ്യുക)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF naar Afbeelding
|
|||||||
home.pdfToImage.desc=Converteer een PDF naar een afbeelding. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Converteer een PDF naar een afbeelding. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=conversie,img,jpg,foto
|
pdfToImage.tags=conversie,img,jpg,foto
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organiseren
|
home.pdfOrganiser.title=Organiseren
|
||||||
home.pdfOrganiser.desc=Verwijder/herschik pagina's in een volgorde naar keus
|
home.pdfOrganiser.desc=Verwijder/herschik pagina's in een volgorde naar keus
|
||||||
pdfOrganiser.tags=duplex,even oneven,sorteren,verplaatsen
|
pdfOrganiser.tags=duplex,even oneven,sorteren,verplaatsen
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(bijv. 1,2,8 of 4,7,12-16 of 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Wachtwoord toevoegen
|
addPassword.title=Wachtwoord toevoegen
|
||||||
addPassword.header=Wachtwoord toevoegen (Versleutelen)
|
addPassword.header=Wachtwoord toevoegen (Versleutelen)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF til Bilde
|
|||||||
home.pdfToImage.desc=Konverter en PDF til et bilde. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Konverter en PDF til et bilde. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=konvertering,bilde,jpg,foto
|
pdfToImage.tags=konvertering,bilde,jpg,foto
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organiser
|
home.pdfOrganiser.title=Organiser
|
||||||
home.pdfOrganiser.desc=Fjern/omorganiser sider i hvilken som helst rekkefølge
|
home.pdfOrganiser.desc=Fjern/omorganiser sider i hvilken som helst rekkefølge
|
||||||
pdfOrganiser.tags=dupleks,par,single,sorter,flytt
|
pdfOrganiser.tags=dupleks,par,single,sorter,flytt
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(f.eks. 1,2,8 eller 4,7,12-16 eller 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Legg til passord
|
addPassword.title=Legg til passord
|
||||||
addPassword.header=Legg til passord (Krypter)
|
addPassword.header=Legg til passord (Krypter)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF na Obraz
|
|||||||
home.pdfToImage.desc=Konwertuj plik PDF na obraz (PNG, JPEG, GIF).
|
home.pdfToImage.desc=Konwertuj plik PDF na obraz (PNG, JPEG, GIF).
|
||||||
pdfToImage.tags=konwersja,img,jpg,obraz,zdjęcie
|
pdfToImage.tags=konwersja,img,jpg,obraz,zdjęcie
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Uporządkuj
|
home.pdfOrganiser.title=Uporządkuj
|
||||||
home.pdfOrganiser.desc=Usuń/Zmień kolejność stron w dowolnej kolejności
|
home.pdfOrganiser.desc=Usuń/Zmień kolejność stron w dowolnej kolejności
|
||||||
pdfOrganiser.tags=duplex,parzyste,nieparzyste,sortuj,przenieś
|
pdfOrganiser.tags=duplex,parzyste,nieparzyste,sortuj,przenieś
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(przykład 1,2,8 lub 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Dodaj hasło
|
addPassword.title=Dodaj hasło
|
||||||
addPassword.header=Dodaj hasło (zaszyfruj)
|
addPassword.header=Dodaj hasło (zaszyfruj)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF para Imagem
|
|||||||
home.pdfToImage.desc=Converter PDF em uma imagem (PNG, JPG, GIF e outros).
|
home.pdfToImage.desc=Converter PDF em uma imagem (PNG, JPG, GIF e outros).
|
||||||
pdfToImage.tags=conversão,img,jpg,imagem,foto
|
pdfToImage.tags=conversão,img,jpg,imagem,foto
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organizar Páginas
|
home.pdfOrganiser.title=Organizar Páginas
|
||||||
home.pdfOrganiser.desc=Remover/reorganizar as páginas de diversas formas diferentes.
|
home.pdfOrganiser.desc=Remover/reorganizar as páginas de diversas formas diferentes.
|
||||||
pdfOrganiser.tags=duplex,par,ímpar,ordenar,mover
|
pdfOrganiser.tags=duplex,par,ímpar,ordenar,mover
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(por exemplo 1,2,8 ou 4,7,12-16 ou 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Proteger PDF
|
addPassword.title=Proteger PDF
|
||||||
addPassword.header=Proteger PDF (Criptografar)
|
addPassword.header=Proteger PDF (Criptografar)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF para Imagem
|
|||||||
home.pdfToImage.desc=Converter um PDF para uma imagem. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Converter um PDF para uma imagem. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=conversão,img,jpg,imagem,foto
|
pdfToImage.tags=conversão,img,jpg,imagem,foto
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organizar
|
home.pdfOrganiser.title=Organizar
|
||||||
home.pdfOrganiser.desc=Remover/Reorganizar páginas em qualquer ordem
|
home.pdfOrganiser.desc=Remover/Reorganizar páginas em qualquer ordem
|
||||||
pdfOrganiser.tags=duplex,par,ímpar,ordenar,mover
|
pdfOrganiser.tags=duplex,par,ímpar,ordenar,mover
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(ex. 1,2,8 ou 4,7,12-16 ou 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Adicionar Palavra-passe
|
addPassword.title=Adicionar Palavra-passe
|
||||||
addPassword.header=Adicionar palavra-passe (Encriptar)
|
addPassword.header=Adicionar palavra-passe (Encriptar)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF în Imagine
|
|||||||
home.pdfToImage.desc=Convertește un fișier PDF în imagine (PNG, JPEG, GIF).
|
home.pdfToImage.desc=Convertește un fișier PDF în imagine (PNG, JPEG, GIF).
|
||||||
pdfToImage.tags=conversie,img,jpg,poză,fotografie
|
pdfToImage.tags=conversie,img,jpg,poză,fotografie
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organizează
|
home.pdfOrganiser.title=Organizează
|
||||||
home.pdfOrganiser.desc=Elimină/rearanjează pagini în orice ordine
|
home.pdfOrganiser.desc=Elimină/rearanjează pagini în orice ordine
|
||||||
pdfOrganiser.tags=duplex,par,impar,sortează,mută
|
pdfOrganiser.tags=duplex,par,impar,sortează,mută
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(ex. 1,2,8 sau 4,7,12-16 sau 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Adaugă parolă
|
addPassword.title=Adaugă parolă
|
||||||
addPassword.header=Adaugă o parolă (Criptare)
|
addPassword.header=Adaugă o parolă (Criptare)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF в изображение
|
|||||||
home.pdfToImage.desc=Преобразование PDF в изображение (PNG, JPEG, GIF).
|
home.pdfToImage.desc=Преобразование PDF в изображение (PNG, JPEG, GIF).
|
||||||
pdfToImage.tags=png,jpeg,gif,конвертация,изображение,картинка,фото
|
pdfToImage.tags=png,jpeg,gif,конвертация,изображение,картинка,фото
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Организация
|
home.pdfOrganiser.title=Организация
|
||||||
home.pdfOrganiser.desc=Удаление/переупорядочивание страниц в любом порядке
|
home.pdfOrganiser.desc=Удаление/переупорядочивание страниц в любом порядке
|
||||||
pdfOrganiser.tags=двусторонняя печать,четные,нечетные,сортировка,перемещение
|
pdfOrganiser.tags=двусторонняя печать,четные,нечетные,сортировка,перемещение
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(например, 1,2,8 или 4,7,12-16 или 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Добавьте аннотации (комментарии, основные моменты и т.д.).
|
pdfToImage.includeAnnotations=Добавьте аннотации (комментарии, основные моменты и т.д.).
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Добавить пароль
|
addPassword.title=Добавить пароль
|
||||||
addPassword.header=Добавить пароль (Шифрование)
|
addPassword.header=Добавить пароль (Шифрование)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF na obrázok
|
|||||||
home.pdfToImage.desc=Konvertujte PDF na obrázok. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Konvertujte PDF na obrázok. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=konverzia,img,jpg,obrázok,fotografia
|
pdfToImage.tags=konverzia,img,jpg,obrázok,fotografia
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organizovať
|
home.pdfOrganiser.title=Organizovať
|
||||||
home.pdfOrganiser.desc=Odstráňte/preusporiadajte stránky v ľubovoľnom poradí
|
home.pdfOrganiser.desc=Odstráňte/preusporiadajte stránky v ľubovoľnom poradí
|
||||||
pdfOrganiser.tags=duplex,nepárne,párne,zoradiť,posunúť
|
pdfOrganiser.tags=duplex,nepárne,párne,zoradiť,posunúť
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(napr. 1,2,8 alebo 4,7,12-16 alebo 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Pridať heslo
|
addPassword.title=Pridať heslo
|
||||||
addPassword.header=Pridať heslo (Zašifrovať)
|
addPassword.header=Pridať heslo (Zašifrovať)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF v sliko
|
|||||||
home.pdfToImage.desc=Pretvori PDF v sliko. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Pretvori PDF v sliko. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=pretvorba,img,jpg,slika,fotografija
|
pdfToImage.tags=pretvorba,img,jpg,slika,fotografija
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organiziraj
|
home.pdfOrganiser.title=Organiziraj
|
||||||
home.pdfOrganiser.desc=Odstrani/Prerazporedi strani v poljubnem vrstnem redu
|
home.pdfOrganiser.desc=Odstrani/Prerazporedi strani v poljubnem vrstnem redu
|
||||||
pdfOrganiser.tags=dvostranski,sodi,lihi,razvrsti,premakni
|
pdfOrganiser.tags=dvostranski,sodi,lihi,razvrsti,premakni
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(npr. 1,2,8 ali 4,7,12-16 ali 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Dodaj geslo
|
addPassword.title=Dodaj geslo
|
||||||
addPassword.header=Dodaj geslo (Šifriraj)
|
addPassword.header=Dodaj geslo (Šifriraj)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF u Sliku
|
|||||||
home.pdfToImage.desc=Konvertovanje PDF u sliku (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Konvertovanje PDF u sliku (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=konverzija,img,jpg,slika,foto
|
pdfToImage.tags=konverzija,img,jpg,slika,foto
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organizacija
|
home.pdfOrganiser.title=Organizacija
|
||||||
home.pdfOrganiser.desc=Uklanjanje/premeštanje stranica po bilo kom redosledu
|
home.pdfOrganiser.desc=Uklanjanje/premeštanje stranica po bilo kom redosledu
|
||||||
pdfOrganiser.tags=dupleks,parne,neparne,sortiranje,pomeranje
|
pdfOrganiser.tags=dupleks,parne,neparne,sortiranje,pomeranje
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(npr. 1,2,8 ili 4,7,12-16 ili 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Uključi napomene (komentare, isticanja itd.)
|
pdfToImage.includeAnnotations=Uključi napomene (komentare, isticanja itd.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Dodaj šifru
|
addPassword.title=Dodaj šifru
|
||||||
addPassword.header=Dodaj šifru (enkripcija)
|
addPassword.header=Dodaj šifru (enkripcija)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF till bild
|
|||||||
home.pdfToImage.desc=Konvertera en PDF till en bild. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Konvertera en PDF till en bild. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=konvertering,img,jpg,bild,foto
|
pdfToImage.tags=konvertering,img,jpg,bild,foto
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Ordna
|
home.pdfOrganiser.title=Ordna
|
||||||
home.pdfOrganiser.desc=Ta bort/ordna om sidor i valfri ordning
|
home.pdfOrganiser.desc=Ta bort/ordna om sidor i valfri ordning
|
||||||
pdfOrganiser.tags=duplex,jämn,udda,sortera,flytta
|
pdfOrganiser.tags=duplex,jämn,udda,sortera,flytta
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(t.ex. 1,2,8 eller 4,7,12-16 eller 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Lägg till lösenord
|
addPassword.title=Lägg till lösenord
|
||||||
addPassword.header=Lägg till lösenord (kryptera)
|
addPassword.header=Lägg till lösenord (kryptera)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF เป็นรูปภาพ
|
|||||||
home.pdfToImage.desc=แปลง PDF เป็นรูปภาพ (PNG, JPEG, GIF)
|
home.pdfToImage.desc=แปลง PDF เป็นรูปภาพ (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=การแปลง, รูปภาพ, JPG, ภาพ, รูปถ่าย
|
pdfToImage.tags=การแปลง, รูปภาพ, JPG, ภาพ, รูปถ่าย
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=จัดระเบียบ
|
home.pdfOrganiser.title=จัดระเบียบ
|
||||||
home.pdfOrganiser.desc=ลบ/จัดเรียงหน้าต่างๆ ในลำดับที่ต้องการ
|
home.pdfOrganiser.desc=ลบ/จัดเรียงหน้าต่างๆ ในลำดับที่ต้องการ
|
||||||
pdfOrganiser.tags=สองหน้า, คู่ขนาน, เรียงลำดับ, เคลื่อนย้าย
|
pdfOrganiser.tags=สองหน้า, คู่ขนาน, เรียงลำดับ, เคลื่อนย้าย
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(เช่น 1,2,8 หรือ 4,7,12-16 หรือ 2
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=เพิ่มรหัสผ่าน
|
addPassword.title=เพิ่มรหัสผ่าน
|
||||||
addPassword.header=เพิ่มรหัสผ่าน (เข้ารหัส)
|
addPassword.header=เพิ่มรหัสผ่าน (เข้ารหัส)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF'den Resme
|
|||||||
home.pdfToImage.desc=PDF'yi bir resme dönüştürün. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=PDF'yi bir resme dönüştürün. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=dönüşüm,img,jpg,fotoğraf,resim
|
pdfToImage.tags=dönüşüm,img,jpg,fotoğraf,resim
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Düzenle
|
home.pdfOrganiser.title=Düzenle
|
||||||
home.pdfOrganiser.desc=Sayfaları herhangi bir sırayla kaldırın/düzenleyin
|
home.pdfOrganiser.desc=Sayfaları herhangi bir sırayla kaldırın/düzenleyin
|
||||||
pdfOrganiser.tags=çift,çift,yan,yana,sırala,taşı
|
pdfOrganiser.tags=çift,çift,yan,yana,sırala,taşı
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(örneğin 1,2,8 veya 4,7,12-16 ya da 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Parola Ekle
|
addPassword.title=Parola Ekle
|
||||||
addPassword.header=Parola Ekle (Şifrele)
|
addPassword.header=Parola Ekle (Şifrele)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF в зображення
|
|||||||
home.pdfToImage.desc=Перетворення PDF в зображення. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Перетворення PDF в зображення. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=конвертація,зображення,jpg,картинка,фото
|
pdfToImage.tags=конвертація,зображення,jpg,картинка,фото
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Реорганізація
|
home.pdfOrganiser.title=Реорганізація
|
||||||
home.pdfOrganiser.desc=Видалення/перестановка сторінок у будь-якому порядку
|
home.pdfOrganiser.desc=Видалення/перестановка сторінок у будь-якому порядку
|
||||||
pdfOrganiser.tags=двосторонній друк,парні,непарні,сортування,переміщення
|
pdfOrganiser.tags=двосторонній друк,парні,непарні,сортування,переміщення
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(наприклад 1,2,8 або 4,7,12-16 або 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Додати пароль
|
addPassword.title=Додати пароль
|
||||||
addPassword.header=Додати пароль (зашифрувати)
|
addPassword.header=Додати пароль (зашифрувати)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF sang Hình ảnh
|
|||||||
home.pdfToImage.desc=Chuyển đổi PDF sang hình ảnh. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Chuyển đổi PDF sang hình ảnh. (PNG, JPEG, GIF)
|
||||||
pdfToImage.tags=chuyển đổi,img,jpg,hình ảnh,ảnh
|
pdfToImage.tags=chuyển đổi,img,jpg,hình ảnh,ảnh
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=Sắp xếp
|
home.pdfOrganiser.title=Sắp xếp
|
||||||
home.pdfOrganiser.desc=Xóa/Sắp xếp lại trang theo bất kỳ thứ tự nào
|
home.pdfOrganiser.desc=Xóa/Sắp xếp lại trang theo bất kỳ thứ tự nào
|
||||||
pdfOrganiser.tags=duplex,chẵn,lẻ,sắp xếp,di chuyển
|
pdfOrganiser.tags=duplex,chẵn,lẻ,sắp xếp,di chuyển
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(ví dụ: 1,2,8 hoặc 4,7,12-16 hoặc 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Thêm mật khẩu
|
addPassword.title=Thêm mật khẩu
|
||||||
addPassword.header=Thêm mật khẩu (Mã hóa)
|
addPassword.header=Thêm mật khẩu (Mã hóa)
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=转换 PDF 到图像
|
|||||||
home.pdfToImage.desc=将 PDF 转换为图像(PNG、JPEG、GIF)。
|
home.pdfToImage.desc=将 PDF 转换为图像(PNG、JPEG、GIF)。
|
||||||
pdfToImage.tags=转换、图像、JPG、图片、照片
|
pdfToImage.tags=转换、图像、JPG、图片、照片
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=整理
|
home.pdfOrganiser.title=整理
|
||||||
home.pdfOrganiser.desc=按任意顺序删除/重新排列页面。
|
home.pdfOrganiser.desc=按任意顺序删除/重新排列页面。
|
||||||
pdfOrganiser.tags=双面、偶数、奇数、排序、移动
|
pdfOrganiser.tags=双面、偶数、奇数、排序、移动
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(例如:1,2,8 或 4,7,12-16 或 2n-1)
|
|||||||
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
pdfToImage.includeAnnotations=Include annotations (comments, highlights etc.)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=添加密码
|
addPassword.title=添加密码
|
||||||
addPassword.header=添加密码(加密)。
|
addPassword.header=添加密码(加密)。
|
||||||
|
|||||||
@ -628,6 +628,10 @@ home.pdfToImage.title=PDF 轉圖片
|
|||||||
home.pdfToImage.desc=將 PDF 轉換為圖片(PNG、JPEG、GIF)。
|
home.pdfToImage.desc=將 PDF 轉換為圖片(PNG、JPEG、GIF)。
|
||||||
pdfToImage.tags=轉換,img,jpg,圖片,照片
|
pdfToImage.tags=轉換,img,jpg,圖片,照片
|
||||||
|
|
||||||
|
home.PDFToVideo.title=PDF to Video Slideshow
|
||||||
|
home.PDFToVideo.desc=Convert a PDF into a slideshow-style video.
|
||||||
|
PDFToVideo.tags=conversion,video,slideshow,presentation
|
||||||
|
|
||||||
home.pdfOrganiser.title=整理
|
home.pdfOrganiser.title=整理
|
||||||
home.pdfOrganiser.desc=移除或重新排列頁面順序
|
home.pdfOrganiser.desc=移除或重新排列頁面順序
|
||||||
pdfOrganiser.tags=雙面,偶數,奇數,排序,移動
|
pdfOrganiser.tags=雙面,偶數,奇數,排序,移動
|
||||||
@ -1512,6 +1516,19 @@ pdfToImage.placeholder=(例如 1,2,8 或 4,7,12-16 或 2n-1)
|
|||||||
pdfToImage.includeAnnotations=包含註釋(評論、醒目提示等)
|
pdfToImage.includeAnnotations=包含註釋(評論、醒目提示等)
|
||||||
|
|
||||||
|
|
||||||
|
#pdfToVideo
|
||||||
|
pdfToVideo.title=PDF to Video Slideshow
|
||||||
|
pdfToVideo.header=PDF to Video Slideshow
|
||||||
|
pdfToVideo.videoFormat=Video format
|
||||||
|
pdfToVideo.secondsPerPage=Seconds per page
|
||||||
|
pdfToVideo.resolution=Resolution
|
||||||
|
pdfToVideo.watermarkText=Watermark Text (empty for no watermark)
|
||||||
|
pdfToVideo.opacity=Opacity of the watermark (only applied if a watermark text is specified)
|
||||||
|
pdfToVideo.resolutionOriginal=Original (keep PDF page size)
|
||||||
|
pdfToVideo.dpiLabel=DPI (The server limit is {0} dpi)
|
||||||
|
pdfToVideo.submit=Convert
|
||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=新增密碼
|
addPassword.title=新增密碼
|
||||||
addPassword.header=新增密碼(加密)
|
addPassword.header=新增密碼(加密)
|
||||||
|
|||||||
@ -0,0 +1,84 @@
|
|||||||
|
<!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=#{pdfToVideo.title}, header=#{pdfToVideo.header})}"></th:block>
|
||||||
|
<script th:inline="javascript">
|
||||||
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
const maxDPI = /*[[${maxDPI}]]*/ 500;
|
||||||
|
const labelTemplate = /*[[#{pdfToVideo.dpiLabel}]]*/ "DPI (The server limit is {0} dpi)";
|
||||||
|
const dpiLabel = document.querySelector('label[for="dpi"]');
|
||||||
|
if (dpiLabel) {
|
||||||
|
dpiLabel.textContent = labelTemplate.replace("{0}", maxDPI);
|
||||||
|
}
|
||||||
|
const dpiInput = document.getElementById("dpi");
|
||||||
|
if (dpiInput) {
|
||||||
|
dpiInput.setAttribute("max", maxDPI);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<th:block th:insert="~{fragments/common :: game}"></th:block>
|
||||||
|
<div id="page-container">
|
||||||
|
<div id="content-wrap">
|
||||||
|
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
||||||
|
<br><br>
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-md-6 bg-card">
|
||||||
|
<div class="tool-header">
|
||||||
|
<span class="material-symbols-rounded tool-header-icon convert">movie</span>
|
||||||
|
<span class="tool-header-text" th:text="#{pdfToVideo.header}"></span>
|
||||||
|
</div>
|
||||||
|
<p th:text="#{processTimeWarning}"></p>
|
||||||
|
<form method="post" enctype="multipart/form-data" th:action="@{'/api/v1/convert/pdf/video'}">
|
||||||
|
<div
|
||||||
|
th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="videoFormat" th:text="#{pdfToVideo.videoFormat}"></label>
|
||||||
|
<select id="videoFormat" class="form-control" name="videoFormat">
|
||||||
|
<option value="mp4">MP4</option>
|
||||||
|
<option value="webm">WebM</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="secondsPerPage" th:text="#{pdfToVideo.secondsPerPage}"></label>
|
||||||
|
<input id="secondsPerPage" type="number" class="form-control" name="secondsPerPage" min="1" max="30" value="3"
|
||||||
|
required>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="resolution" th:text="#{pdfToVideo.resolution}"></label>
|
||||||
|
<select id="resolution" class="form-control" name="resolution">
|
||||||
|
<option value="ORIGINAL" th:text="#{pdfToVideo.resolutionOriginal}"></option>
|
||||||
|
<option value="1080p">1080p</option>
|
||||||
|
<option value="720p">720p</option>
|
||||||
|
<option value="480p">480p</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="dpi">DPI</label>
|
||||||
|
<input id="dpi" type="number" class="form-control" name="dpi" min="72" max="500" value="150" required>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="watermarkText" th:text="#{pdfToVideo.watermarkText}"></label>
|
||||||
|
<input id="watermarkText" type="text" class="form-control" name="watermarkText" placeholder="Stirling Software">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="opacity" th:text="#{pdfToVideo.opacity}"></label>
|
||||||
|
<input id="opacity" type="number" step="0.01" class="form-control" name="opacity" min="0.0" max="1.0" value="0.1">
|
||||||
|
</div>
|
||||||
|
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{pdfToVideo.submit}"></button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@ -113,6 +113,9 @@
|
|||||||
<div
|
<div
|
||||||
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-vector', 'stroke_full', 'home.pdfToVector.title', 'home.pdfToVector.desc', 'pdfToVector.tags', 'convert')}">
|
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-vector', 'stroke_full', 'home.pdfToVector.title', 'home.pdfToVector.desc', 'pdfToVector.tags', 'convert')}">
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-video', 'movie', 'home.PDFToVideo.title', 'home.PDFToVideo.desc', 'PDFToVideo.tags', 'convert')}">
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -175,6 +178,9 @@
|
|||||||
<div
|
<div
|
||||||
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-vector', 'stroke_full', 'home.pdfToVector.title', 'home.pdfToVector.desc', 'pdfToVector.tags', 'convert')}">
|
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-vector', 'stroke_full', 'home.pdfToVector.title', 'home.pdfToVector.desc', 'pdfToVector.tags', 'convert')}">
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-video', 'movie', 'home.PDFToVideo.title', 'home.PDFToVideo.desc', 'PDFToVideo.tags', 'convert')}">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="groupSecurity" class="feature-group">
|
<div id="groupSecurity" class="feature-group">
|
||||||
|
|||||||
@ -195,6 +195,9 @@
|
|||||||
<div
|
<div
|
||||||
th:replace="~{fragments/card :: card(id='pdf-to-csv', cardTitle=#{home.tableExtraxt.title}, cardText=#{home.tableExtraxt.desc}, cardLink='pdf-to-csv', toolIcon='csv', tags=#{tableExtraxt.tags}, toolGroup='convert')}">
|
th:replace="~{fragments/card :: card(id='pdf-to-csv', cardTitle=#{home.tableExtraxt.title}, cardText=#{home.tableExtraxt.desc}, cardLink='pdf-to-csv', toolIcon='csv', tags=#{tableExtraxt.tags}, toolGroup='convert')}">
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
th:replace="~{fragments/card :: card(id='pdf-to-video', cardTitle=#{home.PDFToVideo.title}, cardText=#{home.PDFToVideo.desc}, cardLink='pdf-to-video', toolIcon='movie', tags=#{PDFToVideo.tags}, toolGroup='convert')}">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@ -182,6 +182,7 @@ processExecutor:
|
|||||||
calibreSessionLimit: 1
|
calibreSessionLimit: 1
|
||||||
ghostscriptSessionLimit: 8
|
ghostscriptSessionLimit: 8
|
||||||
ocrMyPdfSessionLimit: 2
|
ocrMyPdfSessionLimit: 2
|
||||||
|
ffmpegSessionLimit: 2
|
||||||
timeoutMinutes: # Process executor timeout in minutes
|
timeoutMinutes: # Process executor timeout in minutes
|
||||||
libreOfficetimeoutMinutes: 30
|
libreOfficetimeoutMinutes: 30
|
||||||
pdfToHtmltimeoutMinutes: 20
|
pdfToHtmltimeoutMinutes: 20
|
||||||
@ -193,3 +194,4 @@ processExecutor:
|
|||||||
qpdfTimeoutMinutes: 30
|
qpdfTimeoutMinutes: 30
|
||||||
ghostscriptTimeoutMinutes: 30
|
ghostscriptTimeoutMinutes: 30
|
||||||
ocrMyPdfTimeoutMinutes: 30
|
ocrMyPdfTimeoutMinutes: 30
|
||||||
|
ffmpegTimeoutMinutes: 30
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user