Compare commits

...

6 Commits

Author SHA1 Message Date
Abdur Rahman
6a3064f7f2 Fix issue #2511: Fix broken ZIP issue by adding zipOut.finish() (#2890)
---

# Description of Changes

### What was changed
- Added `zipOut.finish()` to ensure the ZIP file is properly finalized
after writing all entries.
- This ensures the central directory metadata is written, fixing the
issue where the ZIP file was incomplete or broken.

### Why the change was made
- The issue (#2511) reported that splitting a PDF resulted in a broken
ZIP file. The root cause was the missing central directory due to
improper stream finalization.
- Adding `zipOut.finish()` explicitly ensures the ZIP file is correctly
structured and can be extracted without errors.

### Challenges encountered

Closes #2511

---

## Checklist

### General

- [x] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [x] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [x] I have performed a self-review of my own code
- [x] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [x] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
- Tested with various PDFs to ensure the ZIP file is created correctly.
  - Verified ZIP integrity using `unzip -t` and manual extraction.

---
2025-02-07 13:36:33 +00:00
stirlingbot[bot]
158708b696 🌐 Sync Translations + Update README Progress Table (#2907)
### Description of Changes

This Pull Request was automatically generated to synchronize updates to
translation files and documentation. Below are the details of the
changes made:

#### **1. Synchronization of Translation Files**
- Updated translation files (`messages_*.properties`) to reflect changes
in the reference file `messages_en_GB.properties`.
- Ensured consistency and synchronization across all supported language
files.
- Highlighted any missing or incomplete translations.

#### **2. Update README.md**
- Generated the translation progress table in `README.md`.
- Added a summary of the current translation status for all supported
languages.
- Included up-to-date statistics on translation coverage.

#### **Why these changes are necessary**
- Keeps translation files aligned with the latest reference updates.
- Ensures the documentation reflects the current translation progress.

---

Auto-generated by [create-pull-request][1].

[1]: https://github.com/peter-evans/create-pull-request

---------

Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
2025-02-07 13:29:01 +00:00
Anthony Stirling
0233086487 pipeline bug, doc bugs, auto split new URL and doc (#2906)
# Description of Changes

Please provide a summary of the changes, including:

- What was changed
Pipeline bug where files would be processed even when incorrect format
some API docs had spaces causing format issues
Auto split doc now links to [stirlingpdf.com](http://stirlingpdf.com/)
not github + updated old logo
removed old docs not used

- Why the change was made
- Any challenges encountered

Closes #(issue_number)

---

## Checklist

### General

- [ ] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [ ] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [ ] I have performed a self-review of my own code
- [ ] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.

---------

Co-authored-by: a <a>
2025-02-07 13:17:35 +00:00
thiagoor-cpu
242aa5eae1 Update messages_pt_BR.properties (#2905)
Up-to-date 0.40.2

# Description of Changes

Up-to-date 0.40.2

Closes #(issue_number)

---

## Checklist

### General

- [X] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [ ] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [X] I have performed a self-review of my own code
- [ ] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-02-07 13:08:31 +00:00
Anthony Stirling
bf65c456d1 PDFA fixes (#2896)
# Description of Changes

Please provide a summary of the changes, including:

- What was changed
- Why the change was made
- Any challenges encountered

Closes #(issue_number)

---

## Checklist

### General

- [ ] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [ ] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [ ] I have performed a self-review of my own code
- [ ] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-02-07 13:06:19 +00:00
reecebrowne
26720c5018 Fix for tab issue (#2898)
# Description of Changes

Please provide a summary of the changes, including:

- What was changed
- Why the change was made
- Any challenges encountered

Closes #(issue_number)

---

## Checklist

### General

- [ ] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [ ] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [ ] I have performed a self-review of my own code
- [ ] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-02-06 17:08:33 +00:00
62 changed files with 167 additions and 109 deletions

View File

@@ -56,6 +56,8 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et
openssl-dev \ openssl-dev \
openjdk21-jre \ openjdk21-jre \
# Doc conversion # Doc conversion
gcompat \
libc6-compat \
libreoffice \ libreoffice \
# pdftohtml # pdftohtml
poppler-utils \ poppler-utils \

View File

@@ -57,6 +57,8 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et
openssl-dev \ openssl-dev \
openjdk21-jre \ openjdk21-jre \
# Doc conversion # Doc conversion
gcompat \
libc6-compat \
libreoffice \ libreoffice \
# pdftohtml # pdftohtml
poppler-utils \ poppler-utils \

View File

@@ -124,7 +124,7 @@ Stirling-PDF currently supports 39 languages!
| Catalan (Català) (ca_CA) | ![80%](https://geps.dev/progress/80) | | Catalan (Català) (ca_CA) | ![80%](https://geps.dev/progress/80) |
| Croatian (Hrvatski) (hr_HR) | ![87%](https://geps.dev/progress/87) | | Croatian (Hrvatski) (hr_HR) | ![87%](https://geps.dev/progress/87) |
| Czech (Česky) (cs_CZ) | ![98%](https://geps.dev/progress/98) | | Czech (Česky) (cs_CZ) | ![98%](https://geps.dev/progress/98) |
| Danish (Dansk) (da_DK) | ![85%](https://geps.dev/progress/85) | | Danish (Dansk) (da_DK) | ![86%](https://geps.dev/progress/86) |
| Dutch (Nederlands) (nl_NL) | ![85%](https://geps.dev/progress/85) | | Dutch (Nederlands) (nl_NL) | ![85%](https://geps.dev/progress/85) |
| English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) |
| English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) |
@@ -142,7 +142,7 @@ Stirling-PDF currently supports 39 languages!
| Persian (فارسی) (fa_IR) | ![94%](https://geps.dev/progress/94) | | Persian (فارسی) (fa_IR) | ![94%](https://geps.dev/progress/94) |
| Polish (Polski) (pl_PL) | ![86%](https://geps.dev/progress/86) | | Polish (Polski) (pl_PL) | ![86%](https://geps.dev/progress/86) |
| Portuguese (Português) (pt_PT) | ![97%](https://geps.dev/progress/97) | | Portuguese (Português) (pt_PT) | ![97%](https://geps.dev/progress/97) |
| Portuguese Brazilian (Português) (pt_BR) | ![97%](https://geps.dev/progress/97) | | Portuguese Brazilian (Português) (pt_BR) | ![98%](https://geps.dev/progress/98) |
| Romanian (Română) (ro_RO) | ![81%](https://geps.dev/progress/81) | | Romanian (Română) (ro_RO) | ![81%](https://geps.dev/progress/81) |
| Russian (Русский) (ru_RU) | ![98%](https://geps.dev/progress/98) | | Russian (Русский) (ru_RU) | ![98%](https://geps.dev/progress/98) |
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![64%](https://geps.dev/progress/64) | | Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![64%](https://geps.dev/progress/64) |

View File

@@ -26,7 +26,7 @@ ext {
} }
group = "stirling.software" group = "stirling.software"
version = "0.40.2" version = "0.41.0"
java { java {
// 17 is lowest but we support and recommend 21 // 17 is lowest but we support and recommend 21

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -265,9 +265,6 @@ 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");
// disabled for now while we resolve issues
disableEndpoint("pdf-to-pdfa");
} }
private void processEnvironmentConfigs() { private void processEnvironmentConfigs() {

View File

@@ -100,6 +100,8 @@ public class SplitPdfBySectionsController {
if (sectionNum == horiz * verti) pageNum++; if (sectionNum == horiz * verti) pageNum++;
} }
zipOut.finish();
data = Files.readAllBytes(zipFile); data = Files.readAllBytes(zipFile);
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
data, filename + "_split.zip", MediaType.APPLICATION_OCTET_STREAM); data, filename + "_split.zip", MediaType.APPLICATION_OCTET_STREAM);

View File

@@ -73,8 +73,8 @@ public class ConvertPDFToPDFA {
// Determine PDF/A filter based on requested format // Determine PDF/A filter based on requested format
String pdfFilter = String pdfFilter =
"pdfa".equals(outputFormat) "pdfa".equals(outputFormat)
? "writer_pdf_Export:{'SelectPdfVersion':{'Value':'2'}}:writer_pdf_Export" ? "pdf:writer_pdf_Export:{\"SelectPdfVersion\":{\"type\":\"long\",\"value\":\"2\"}}"
: "writer_pdf_Export:{'SelectPdfVersion':{'Value':'1'}}:writer_pdf_Export"; : "pdf:writer_pdf_Export:{\"SelectPdfVersion\":{\"type\":\"long\",\"value\":\"1\"}}";
// Prepare LibreOffice command // Prepare LibreOffice command
List<String> command = List<String> command =
@@ -84,7 +84,7 @@ public class ConvertPDFToPDFA {
"--headless", "--headless",
"--nologo", "--nologo",
"--convert-to", "--convert-to",
"pdf:" + pdfFilter, pdfFilter,
"--outdir", "--outdir",
tempOutputDir.toString(), tempOutputDir.toString(),
tempInputFile.toString())); tempInputFile.toString()));

View File

@@ -8,7 +8,9 @@ import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@@ -41,8 +43,12 @@ import stirling.software.SPDF.utils.WebResponseUtils;
@Tag(name = "Misc", description = "Miscellaneous APIs") @Tag(name = "Misc", description = "Miscellaneous APIs")
public class AutoSplitPdfController { public class AutoSplitPdfController {
private static final String QR_CONTENT = "https://github.com/Stirling-Tools/Stirling-PDF"; private static final Set<String> VALID_QR_CONTENTS =
private static final String QR_CONTENT_OLD = "https://github.com/Frooodle/Stirling-PDF"; new HashSet<>(
Set.of(
"https://github.com/Stirling-Tools/Stirling-PDF",
"https://github.com/Frooodle/Stirling-PDF",
"https://stirlingpdf.com"));
private final CustomPDDocumentFactory pdfDocumentFactory; private final CustomPDDocumentFactory pdfDocumentFactory;
@@ -120,13 +126,14 @@ public class AutoSplitPdfController {
for (int page = 0; page < document.getNumberOfPages(); ++page) { for (int page = 0; page < document.getNumberOfPages(); ++page) {
BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 150); BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 150);
String result = decodeQRCode(bim); String result = decodeQRCode(bim);
if ((QR_CONTENT.equals(result) || QR_CONTENT_OLD.equals(result)) && page != 0) {
boolean isValidQrCode = VALID_QR_CONTENTS.contains(result);
log.debug("detected qr code {}, code is vale={}", result, isValidQrCode);
if (isValidQrCode && page != 0) {
splitDocuments.add(new PDDocument()); splitDocuments.add(new PDDocument());
} }
if (!splitDocuments.isEmpty() if (!splitDocuments.isEmpty() && !isValidQrCode) {
&& !QR_CONTENT.equals(result)
&& !QR_CONTENT_OLD.equals(result)) {
splitDocuments.get(splitDocuments.size() - 1).addPage(document.getPage(page)); splitDocuments.get(splitDocuments.size() - 1).addPage(document.getPage(page));
} else if (page == 0) { } else if (page == 0) {
PDDocument firstDocument = new PDDocument(); PDDocument firstDocument = new PDDocument();
@@ -135,7 +142,7 @@ public class AutoSplitPdfController {
} }
// If duplexMode is true and current page is a divider, then skip next page // If duplexMode is true and current page is a divider, then skip next page
if (duplexMode && (QR_CONTENT.equals(result) || QR_CONTENT_OLD.equals(result))) { if (duplexMode && isValidQrCode) {
page++; page++;
} }
} }
@@ -168,6 +175,9 @@ public class AutoSplitPdfController {
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM); data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM);
} catch (Exception e) {
log.error("Error in auto split", e);
throw e;
} finally { } finally {
// Clean up resources // Clean up resources
if (document != null) { if (document != null) {

View File

@@ -52,7 +52,7 @@ public class ExtractImagesController {
@Operation( @Operation(
summary = "Extract images from a PDF file", summary = "Extract images from a PDF file",
description = description =
"This endpoint extracts images from a given PDF file and returns them in a zip file. Users can specify the output image format. Input: PDF Output: IMAGE/ZIP Type: SIMO") "This endpoint extracts images from a given PDF file and returns them in a zip file. Users can specify the output image format. Input:PDF Output:IMAGE/ZIP Type:SIMO")
public ResponseEntity<byte[]> extractImages(@ModelAttribute PDFExtractImagesRequest request) public ResponseEntity<byte[]> extractImages(@ModelAttribute PDFExtractImagesRequest request)
throws IOException, InterruptedException, ExecutionException { throws IOException, InterruptedException, ExecutionException {
MultipartFile file = request.getFileInput(); MultipartFile file = request.getFileInput();

View File

@@ -46,7 +46,7 @@ public class FlattenController {
@Operation( @Operation(
summary = "Flatten PDF form fields or full page", summary = "Flatten PDF form fields or full page",
description = description =
"Flattening just PDF form fields or converting each page to images to make text unselectable. Input: PDF, Output: PDF. Type: SISO") "Flattening just PDF form fields or converting each page to images to make text unselectable. Input:PDF, Output:PDF. Type:SISO")
public ResponseEntity<byte[]> flatten(@ModelAttribute FlattenRequest request) throws Exception { public ResponseEntity<byte[]> flatten(@ModelAttribute FlattenRequest request) throws Exception {
MultipartFile file = request.getFileInput(); MultipartFile file = request.getFileInput();

View File

@@ -8,7 +8,7 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
import io.swagger.v3.oas.annotations.Operation;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import org.apache.pdfbox.multipdf.PDFMergerUtility; import org.apache.pdfbox.multipdf.PDFMergerUtility;
@@ -26,6 +26,7 @@ import org.springframework.web.multipart.MultipartFile;
import io.github.pixee.security.BoundedLineReader; import io.github.pixee.security.BoundedLineReader;
import io.github.pixee.security.Filenames; import io.github.pixee.security.Filenames;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -67,7 +68,8 @@ public class OCRController {
@PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf") @PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf")
@Operation( @Operation(
summary = "Process PDF files with OCR using Tesseract", summary = "Process PDF files with OCR using Tesseract",
description = "Takes a PDF file as input, performs OCR using specified languages and OCR type (skip-text/force-ocr), and returns the processed PDF. Input:PDF Output:PDF Type:SISO") description =
"Takes a PDF file as input, performs OCR using specified languages and OCR type (skip-text/force-ocr), and returns the processed PDF. Input:PDF Output:PDF Type:SISO")
public ResponseEntity<byte[]> processPdfWithOCR( public ResponseEntity<byte[]> processPdfWithOCR(
@ModelAttribute ProcessPdfWithOcrRequest request) @ModelAttribute ProcessPdfWithOcrRequest request)
throws IOException, InterruptedException { throws IOException, InterruptedException {

View File

@@ -25,6 +25,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineConfig;
import stirling.software.SPDF.model.PipelineResult;
import stirling.software.SPDF.model.api.HandleDataRequest; import stirling.software.SPDF.model.api.HandleDataRequest;
import stirling.software.SPDF.utils.WebResponseUtils; import stirling.software.SPDF.utils.WebResponseUtils;
@@ -58,7 +59,8 @@ public class PipelineController {
if (inputFiles == null || inputFiles.size() == 0) { if (inputFiles == null || inputFiles.size() == 0) {
return null; return null;
} }
List<Resource> outputFiles = processor.runPipelineAgainstFiles(inputFiles, config); PipelineResult result = processor.runPipelineAgainstFiles(inputFiles, config);
List<Resource> outputFiles = result.getOutputFiles();
if (outputFiles != null && outputFiles.size() == 1) { if (outputFiles != null && outputFiles.size() == 1) {
// If there is only one file, return it directly // If there is only one file, return it directly
Resource singleFile = outputFiles.get(0); Resource singleFile = outputFiles.get(0);

View File

@@ -27,6 +27,7 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.config.InstallationPathConfig;
import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineConfig;
import stirling.software.SPDF.model.PipelineOperation; import stirling.software.SPDF.model.PipelineOperation;
import stirling.software.SPDF.model.PipelineResult;
import stirling.software.SPDF.utils.FileMonitor; import stirling.software.SPDF.utils.FileMonitor;
@Service @Service
@@ -143,19 +144,64 @@ public class PipelineDirectoryProcessor {
private File[] collectFilesForProcessing(Path dir, Path jsonFile, PipelineOperation operation) private File[] collectFilesForProcessing(Path dir, Path jsonFile, PipelineOperation operation)
throws IOException { throws IOException {
List<String> inputExtensions =
apiDocService.getExtensionTypes(false, operation.getOperation());
log.info(
"Allowed extensions for operation {}: {}",
operation.getOperation(),
inputExtensions);
boolean allowAllFiles = inputExtensions.contains("ALL");
try (Stream<Path> paths = Files.list(dir)) { try (Stream<Path> paths = Files.list(dir)) {
if ("automated".equals(operation.getParameters().get("fileInput"))) { File[] files =
return paths.filter( paths.filter(
path -> path -> {
!Files.isDirectory(path) if (Files.isDirectory(path)) {
&& !path.equals(jsonFile) return false;
&& fileMonitor.isFileReadyForProcessing(path)) }
if (path.equals(jsonFile)) {
return false;
}
// Get file extension
String filename = path.getFileName().toString();
String extension =
filename.contains(".")
? filename.substring(
filename.lastIndexOf(".")
+ 1)
.toLowerCase()
: "";
// Check against allowed extensions
boolean isAllowed =
allowAllFiles
|| inputExtensions.contains(extension);
if (!isAllowed) {
log.info(
"Skipping file with unsupported extension: {} ({})",
filename,
extension);
}
return isAllowed;
})
.filter(
path -> {
boolean isReady =
fileMonitor.isFileReadyForProcessing(path);
if (!isReady) {
log.info(
"File not ready for processing (locked/created last 5s): {}",
path);
}
return isReady;
})
.map(Path::toFile) .map(Path::toFile)
.toArray(File[]::new); .toArray(File[]::new);
} else { log.info("Collected {} files for processing", files.length);
String fileInput = (String) operation.getParameters().get("fileInput"); return files;
return new File[] {new File(fileInput)};
}
} }
} }
@@ -198,19 +244,37 @@ public class PipelineDirectoryProcessor {
try { try {
List<Resource> inputFiles = List<Resource> inputFiles =
processor.generateInputFiles(filesToProcess.toArray(new File[0])); processor.generateInputFiles(filesToProcess.toArray(new File[0]));
if (inputFiles == null || inputFiles.size() == 0) { if (inputFiles == null || inputFiles.isEmpty()) {
return; return;
} }
List<Resource> outputFiles = processor.runPipelineAgainstFiles(inputFiles, config); PipelineResult result = processor.runPipelineAgainstFiles(inputFiles, config);
if (outputFiles == null) return;
moveAndRenameFiles(outputFiles, config, dir); if (result.isHasErrors()) {
log.error("Errors occurred during processing, retaining original files");
moveToErrorDirectory(filesToProcess, dir);
} else {
moveAndRenameFiles(result.getOutputFiles(), config, dir);
deleteOriginalFiles(filesToProcess, processingDir); deleteOriginalFiles(filesToProcess, processingDir);
}
} catch (Exception e) { } catch (Exception e) {
log.error("error during processing", e); log.error("Error during processing", e);
moveFilesBack(filesToProcess, processingDir); moveFilesBack(filesToProcess, processingDir);
} }
} }
private void moveToErrorDirectory(List<File> files, Path originalDir) throws IOException {
Path errorDir = originalDir.resolve("error");
if (!Files.exists(errorDir)) {
Files.createDirectories(errorDir);
}
for (File file : files) {
Path target = errorDir.resolve(file.getName());
Files.move(file.toPath(), target);
log.info("Moved failed file to error directory for investigation: {}", target);
}
}
private void moveAndRenameFiles(List<Resource> resources, PipelineConfig config, Path dir) private void moveAndRenameFiles(List<Resource> resources, PipelineConfig config, Path dir)
throws IOException { throws IOException {
for (Resource resource : resources) { for (Resource resource : resources) {

View File

@@ -33,6 +33,7 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.SPDFApplication; import stirling.software.SPDF.SPDFApplication;
import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineConfig;
import stirling.software.SPDF.model.PipelineOperation; import stirling.software.SPDF.model.PipelineOperation;
import stirling.software.SPDF.model.PipelineResult;
import stirling.software.SPDF.model.Role; import stirling.software.SPDF.model.Role;
@Service @Service
@@ -84,8 +85,10 @@ public class PipelineProcessor {
return "http://localhost:" + port + contextPath + "/"; return "http://localhost:" + port + contextPath + "/";
} }
List<Resource> runPipelineAgainstFiles(List<Resource> outputFiles, PipelineConfig config) PipelineResult runPipelineAgainstFiles(List<Resource> outputFiles, PipelineConfig config)
throws Exception { throws Exception {
PipelineResult result = new PipelineResult();
ByteArrayOutputStream logStream = new ByteArrayOutputStream(); ByteArrayOutputStream logStream = new ByteArrayOutputStream();
PrintStream logPrintStream = new PrintStream(logStream); PrintStream logPrintStream = new PrintStream(logStream);
boolean hasErrors = false; boolean hasErrors = false;
@@ -130,7 +133,8 @@ public class PipelineProcessor {
if (operation.startsWith("filter-") if (operation.startsWith("filter-")
&& (response.getBody() == null && (response.getBody() == null
|| response.getBody().length == 0)) { || response.getBody().length == 0)) {
log.info("Skipping file due to failing {}", operation); result.setFiltersApplied(true);
log.info("Skipping file due to filtering {}", operation);
continue; continue;
} }
if (!response.getStatusCode().equals(HttpStatus.OK)) { if (!response.getStatusCode().equals(HttpStatus.OK)) {
@@ -208,7 +212,10 @@ public class PipelineProcessor {
if (hasErrors) { if (hasErrors) {
log.error("Errors occurred during processing. Log: {}", logStream.toString()); log.error("Errors occurred during processing. Log: {}", logStream.toString());
} }
return outputFiles; result.setHasErrors(hasErrors);
result.setFiltersApplied(hasErrors);
result.setOutputFiles(outputFiles);
return result;
} }
private ResponseEntity<byte[]> sendWebRequest(String url, MultiValueMap<String, Object> body) { private ResponseEntity<byte[]> sendWebRequest(String url, MultiValueMap<String, Object> body) {

View File

@@ -40,8 +40,7 @@ public class RemoveCertSignController {
@Operation( @Operation(
summary = "Remove digital signature from PDF", summary = "Remove digital signature from PDF",
description = description =
"This endpoint accepts a PDF file and returns the PDF file without the digital signature." "This endpoint accepts a PDF file and returns the PDF file without the digital signature. Input:PDF, Output:PDF Type:SISO")
+ " Input: PDF, Output: PDF")
public ResponseEntity<byte[]> removeCertSignPDF(@ModelAttribute PDFFile request) public ResponseEntity<byte[]> removeCertSignPDF(@ModelAttribute PDFFile request)
throws Exception { throws Exception {
MultipartFile pdf = request.getFileInput(); MultipartFile pdf = request.getFileInput();

View File

@@ -0,0 +1,14 @@
package stirling.software.SPDF.model;
import java.util.List;
import org.springframework.core.io.Resource;
import lombok.Data;
@Data
public class PipelineResult {
private List<Resource> outputFiles;
private boolean hasErrors;
private boolean filtersApplied;
}

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=ارفع ملف PDF الممسوح ضوئيًا الك
autoSplitPDF.selectText.4=يتم اكتشاف صفحات الفاصل تلقائيًا وإزالتها، مما يضمن مستندًا نهائيًا نظيفًا. autoSplitPDF.selectText.4=يتم اكتشاف صفحات الفاصل تلقائيًا وإزالتها، مما يضمن مستندًا نهائيًا نظيفًا.
autoSplitPDF.formPrompt=أرسل ملف PDF يحتوي على فواصل صفحات Stirling-PDF: autoSplitPDF.formPrompt=أرسل ملف PDF يحتوي على فواصل صفحات Stirling-PDF:
autoSplitPDF.duplexMode=وضع الطباعة على الوجهين (المسح الضوئي للوجه الأمامي والخلفي) autoSplitPDF.duplexMode=وضع الطباعة على الوجهين (المسح الضوئي للوجه الأمامي والخلفي)
autoSplitPDF.dividerDownload1=تنزيل 'فاصل التقسيم التلقائي (الحد الأدنى).pdf'
autoSplitPDF.dividerDownload2=تنزيل 'فاصل التقسيم التلقائي (مع التعليمات).pdf' autoSplitPDF.dividerDownload2=تنزيل 'فاصل التقسيم التلقائي (مع التعليمات).pdf'
autoSplitPDF.submit=إرسال autoSplitPDF.submit=إرسال

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Tək böyük skan edilmiş PDF faylını yükləyin v
autoSplitPDF.selectText.4=Ayırıcı səhifələr avtomatik aşkarlanır və silinir, səliqəli yekun sənədə zəmanət verir. autoSplitPDF.selectText.4=Ayırıcı səhifələr avtomatik aşkarlanır və silinir, səliqəli yekun sənədə zəmanət verir.
autoSplitPDF.formPrompt=Stirling-PDF ə Səhifə bölücüləri olan PDF-i təqdim edin: autoSplitPDF.formPrompt=Stirling-PDF ə Səhifə bölücüləri olan PDF-i təqdim edin:
autoSplitPDF.duplexMode=Dupleks rejimi (Ön və arxa skanlama) autoSplitPDF.duplexMode=Dupleks rejimi (Ön və arxa skanlama)
autoSplitPDF.dividerDownload1='Auto Splitter Divider (minimal).pdf'-ı yükləyin
autoSplitPDF.dividerDownload2='Auto Splitter Divider (with instructions).pdf'-ı yükləyin autoSplitPDF.dividerDownload2='Auto Splitter Divider (with instructions).pdf'-ı yükləyin
autoSplitPDF.submit=Təsdiq edin autoSplitPDF.submit=Təsdiq edin

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Качете единствения голям ска
autoSplitPDF.selectText.4=Разделителните страници се откриват и премахват автоматично, което гарантира чист краен документ. autoSplitPDF.selectText.4=Разделителните страници се откриват и премахват автоматично, което гарантира чист краен документ.
autoSplitPDF.formPrompt=Изпратете PDF, съдържащ разделители на страници на Stirling-PDF: autoSplitPDF.formPrompt=Изпратете PDF, съдържащ разделители на страници на Stirling-PDF:
autoSplitPDF.duplexMode=Дуплексен режим (сканиране отпред и отзад) autoSplitPDF.duplexMode=Дуплексен режим (сканиране отпред и отзад)
autoSplitPDF.dividerDownload1=Изтеглете 'Автоматичен сплитер разделител (минимален).pdf'
autoSplitPDF.dividerDownload2=Изтеглете 'Автоматичен сплитер разделител (с инструкции).pdf' autoSplitPDF.dividerDownload2=Изтеглете 'Автоматичен сплитер разделител (с инструкции).pdf'
autoSplitPDF.submit=Подайте autoSplitPDF.submit=Подайте

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Puja el fitxer PDF escanejat gran i deixa que Stirling
autoSplitPDF.selectText.4=Les pàgines divisòries es detecten i eliminen automàticament, garantint un document final ordenat. autoSplitPDF.selectText.4=Les pàgines divisòries es detecten i eliminen automàticament, garantint un document final ordenat.
autoSplitPDF.formPrompt=Envia un PDF que contingui les pàgines divisòries de Stirling-PDF: autoSplitPDF.formPrompt=Envia un PDF que contingui les pàgines divisòries de Stirling-PDF:
autoSplitPDF.duplexMode=Mode Dúplex (Escaneig de davant i darrere) autoSplitPDF.duplexMode=Mode Dúplex (Escaneig de davant i darrere)
autoSplitPDF.dividerDownload1=Descarrega 'Divisor Automàtic (mínim).pdf'
autoSplitPDF.dividerDownload2=Descarrega 'Divisor Automàtic (amb instruccions).pdf' autoSplitPDF.dividerDownload2=Descarrega 'Divisor Automàtic (amb instruccions).pdf'
autoSplitPDF.submit=Envia autoSplitPDF.submit=Envia

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Nahrajte jediný velký naskenovaný PDF soubor a nech
autoSplitPDF.selectText.4=Oddělovací stránky jsou automaticky detekovány a odstraněny, což zaručuje čistý finální dokument. autoSplitPDF.selectText.4=Oddělovací stránky jsou automaticky detekovány a odstraněny, což zaručuje čistý finální dokument.
autoSplitPDF.formPrompt=Odeslat PDF obsahující Stirling-PDF oddělovače stránek: autoSplitPDF.formPrompt=Odeslat PDF obsahující Stirling-PDF oddělovače stránek:
autoSplitPDF.duplexMode=Duplexní režim (skenování přední a zadní strany) autoSplitPDF.duplexMode=Duplexní režim (skenování přední a zadní strany)
autoSplitPDF.dividerDownload1=Stáhnout 'Automatický oddělovač (minimální).pdf'
autoSplitPDF.dividerDownload2=Stáhnout 'Automatický oddělovač (s instrukcemi).pdf' autoSplitPDF.dividerDownload2=Stáhnout 'Automatický oddělovač (s instrukcemi).pdf'
autoSplitPDF.submit=Odeslat autoSplitPDF.submit=Odeslat

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Upload den enkelte store scannede PDF-fil og lad Stirl
autoSplitPDF.selectText.4=Skillesider detekteres automatisk og fjernes, hvilket garanterer et pænt endeligt dokument. autoSplitPDF.selectText.4=Skillesider detekteres automatisk og fjernes, hvilket garanterer et pænt endeligt dokument.
autoSplitPDF.formPrompt=Indsend PDF indeholdende Stirling-PDF Sideopdelere: autoSplitPDF.formPrompt=Indsend PDF indeholdende Stirling-PDF Sideopdelere:
autoSplitPDF.duplexMode=Duplex-tilstand (For- og bagside scanning) autoSplitPDF.duplexMode=Duplex-tilstand (For- og bagside scanning)
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (med instruktioner).pdf' autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (med instruktioner).pdf'
autoSplitPDF.submit=Indsend autoSplitPDF.submit=Indsend

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Laden Sie die einzelne große gescannte PDF-Datei hoch
autoSplitPDF.selectText.4=Trennseiten werden automatisch erkannt und entfernt, so dass ein sauberes Enddokument garantiert ist. autoSplitPDF.selectText.4=Trennseiten werden automatisch erkannt und entfernt, so dass ein sauberes Enddokument garantiert ist.
autoSplitPDF.formPrompt=PDF mit Stirling-PDF Seitentrennern hochladen: autoSplitPDF.formPrompt=PDF mit Stirling-PDF Seitentrennern hochladen:
autoSplitPDF.duplexMode=Duplex-Modus (Scannen von Vorder- und Rückseite) autoSplitPDF.duplexMode=Duplex-Modus (Scannen von Vorder- und Rückseite)
autoSplitPDF.dividerDownload1=Herunterladen 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (mit Anleitung).pdf' autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (mit Anleitung).pdf'
autoSplitPDF.submit=Aufteilen autoSplitPDF.submit=Aufteilen

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Μεταφορτώστε το ενιαίο μεγάλ
autoSplitPDF.selectText.4=Οι σελίδες διαχωρισμού ανιχνεύονται και αφαιρούνται αυτόματα, εξασφαλίζοντας ένα καθαρό τελικό έγγραφο. autoSplitPDF.selectText.4=Οι σελίδες διαχωρισμού ανιχνεύονται και αφαιρούνται αυτόματα, εξασφαλίζοντας ένα καθαρό τελικό έγγραφο.
autoSplitPDF.formPrompt=Υποβολή PDF που περιέχει διαχωριστές σελίδων Stirling-PDF: autoSplitPDF.formPrompt=Υποβολή PDF που περιέχει διαχωριστές σελίδων Stirling-PDF:
autoSplitPDF.duplexMode=Λειτουργία διπλής όψης (Σάρωση μπρος και πίσω) autoSplitPDF.duplexMode=Λειτουργία διπλής όψης (Σάρωση μπρος και πίσω)
autoSplitPDF.dividerDownload1=Λήψη 'Αυτόματος διαχωριστής (ελάχιστος).pdf'
autoSplitPDF.dividerDownload2=Λήψη 'Αυτόματος διαχωριστής (με οδηγίες).pdf' autoSplitPDF.dividerDownload2=Λήψη 'Αυτόματος διαχωριστής (με οδηγίες).pdf'
autoSplitPDF.submit=Υποβολή autoSplitPDF.submit=Υποβολή

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirl
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document. autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning)
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit autoSplitPDF.submit=Submit
@@ -1185,7 +1184,7 @@ changeMetadata.submit=Change
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF To PDF/A pdfToPDFA.title=PDF To PDF/A
pdfToPDFA.header=PDF To PDF/A pdfToPDFA.header=PDF To PDF/A
pdfToPDFA.credit=This service uses qpdf for PDF/A conversion pdfToPDFA.credit=This service uses libreoffice for PDF/A conversion
pdfToPDFA.submit=Convert pdfToPDFA.submit=Convert
pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.tip=Currently does not work for multiple inputs at once
pdfToPDFA.outputFormat=Output format pdfToPDFA.outputFormat=Output format

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirl
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document. autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning)
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit autoSplitPDF.submit=Submit
@@ -1185,7 +1184,7 @@ changeMetadata.submit=Change
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF To PDF/A pdfToPDFA.title=PDF To PDF/A
pdfToPDFA.header=PDF To PDF/A pdfToPDFA.header=PDF To PDF/A
pdfToPDFA.credit=This service uses qpdf for PDF/A conversion pdfToPDFA.credit=This service uses libreoffice for PDF/A conversion
pdfToPDFA.submit=Convert pdfToPDFA.submit=Convert
pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.tip=Currently does not work for multiple inputs at once
pdfToPDFA.outputFormat=Output format pdfToPDFA.outputFormat=Output format

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Cargue un único archivo PDF escaneado de gran tamaño
autoSplitPDF.selectText.4=Las páginas divisorias son automáticamente detectadas y eliminadas, garantizando un buen documento final. autoSplitPDF.selectText.4=Las páginas divisorias son automáticamente detectadas y eliminadas, garantizando un buen documento final.
autoSplitPDF.formPrompt=Entregar PDF conteniendo divisores de página de Stirling-PDF: autoSplitPDF.formPrompt=Entregar PDF conteniendo divisores de página de Stirling-PDF:
autoSplitPDF.duplexMode=Modo Dúplex (Escaneado de ambas caras) autoSplitPDF.duplexMode=Modo Dúplex (Escaneado de ambas caras)
autoSplitPDF.dividerDownload1=Descargar 'Divisor automático (mínima).pdf'
autoSplitPDF.dividerDownload2=Descargar 'Divisor automático (con instrucciones).pdf' autoSplitPDF.dividerDownload2=Descargar 'Divisor automático (con instrucciones).pdf'
autoSplitPDF.submit=Entregar autoSplitPDF.submit=Entregar

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Igo eskaneatutako PDF artxibo handia, eta utzi Stirlin
autoSplitPDF.selectText.4=Orrialde zatitzaileak automatikoki detektatu eta kentzen dira, eta azken dokumentu ordenatua bermatzen da. autoSplitPDF.selectText.4=Orrialde zatitzaileak automatikoki detektatu eta kentzen dira, eta azken dokumentu ordenatua bermatzen da.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning)Duplex modua (aurreko eta atzeko azterketa) autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning)Duplex modua (aurreko eta atzeko azterketa)
autoSplitPDF.dividerDownload1=Deskargatu 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Deskargatu 'Auto Splitter Divider (with instructions).pdf' autoSplitPDF.dividerDownload2=Deskargatu 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Bidali autoSplitPDF.submit=Bidali

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=فایل PDF بزرگ اسکن شده را بارگذ
autoSplitPDF.selectText.4=صفحات جداکننده به طور خودکار تشخیص داده و حذف می‌شوند، تضمین‌کننده یک سند نهایی منظم. autoSplitPDF.selectText.4=صفحات جداکننده به طور خودکار تشخیص داده و حذف می‌شوند، تضمین‌کننده یک سند نهایی منظم.
autoSplitPDF.formPrompt=PDF حاوی جداکننده‌های Stirling-PDF را ارسال کنید: autoSplitPDF.formPrompt=PDF حاوی جداکننده‌های Stirling-PDF را ارسال کنید:
autoSplitPDF.duplexMode=حالت دوبلکس (اسکن جلو و عقب) autoSplitPDF.duplexMode=حالت دوبلکس (اسکن جلو و عقب)
autoSplitPDF.dividerDownload1=دانلود 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=دانلود 'Auto Splitter Divider (with instructions).pdf' autoSplitPDF.dividerDownload2=دانلود 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=ارسال autoSplitPDF.submit=ارسال

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Téléchargez le fichier PDF numérisé et laissez Sti
autoSplitPDF.selectText.4=Les feuilles de séparation sont automatiquement détectées et supprimées, garantissant un document final soigné. autoSplitPDF.selectText.4=Les feuilles de séparation sont automatiquement détectées et supprimées, garantissant un document final soigné.
autoSplitPDF.formPrompt=PDF contenant des feuilles de séparation de Stirling PDF : autoSplitPDF.formPrompt=PDF contenant des feuilles de séparation de Stirling PDF :
autoSplitPDF.duplexMode=Mode recto-verso autoSplitPDF.duplexMode=Mode recto-verso
autoSplitPDF.dividerDownload1=Auto Splitter Divider (minimal).pdf
autoSplitPDF.dividerDownload2=Auto Splitter Divider (with instructions).pdf autoSplitPDF.dividerDownload2=Auto Splitter Divider (with instructions).pdf
autoSplitPDF.submit=Séparer autoSplitPDF.submit=Séparer

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Uaslódáil an comhad PDF mór scanta amháin agus lig
autoSplitPDF.selectText.4=Déantar leathanaigh roinnteoirí a bhrath agus a bhaint go huathoibríoch, rud a ráthaíonn doiciméad deiridh néata. autoSplitPDF.selectText.4=Déantar leathanaigh roinnteoirí a bhrath agus a bhaint go huathoibríoch, rud a ráthaíonn doiciméad deiridh néata.
autoSplitPDF.formPrompt=Cuir PDF isteach ina bhfuil roinnteoirí Leathanaigh Stirling-PDF: autoSplitPDF.formPrompt=Cuir PDF isteach ina bhfuil roinnteoirí Leathanaigh Stirling-PDF:
autoSplitPDF.duplexMode=Mód Duplex (scanadh tosaigh agus cúil) autoSplitPDF.duplexMode=Mód Duplex (scanadh tosaigh agus cúil)
autoSplitPDF.dividerDownload1=Íoslódáil 'Auto Scoilteoir Roinnteoir (íosmhéid).pdf'
autoSplitPDF.dividerDownload2=Íoslódáil 'Auto Splitter Divider (le treoracha).pdf' autoSplitPDF.dividerDownload2=Íoslódáil 'Auto Splitter Divider (le treoracha).pdf'
autoSplitPDF.submit=Cuir isteach autoSplitPDF.submit=Cuir isteach

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=एक बड़ी स्कैन की गई PDF
autoSplitPDF.selectText.4=विभाजक पृष्ठ स्वचालित रूप से पहचाने जाते हैं और हटा दिए जाते हैं, एक साफ अंतिम दस्तावेज़ सुनिश्चित करते हैं। autoSplitPDF.selectText.4=विभाजक पृष्ठ स्वचालित रूप से पहचाने जाते हैं और हटा दिए जाते हैं, एक साफ अंतिम दस्तावेज़ सुनिश्चित करते हैं।
autoSplitPDF.formPrompt=Stirling-PDF पृष्ठ विभाजक वाली PDF जमा करें: autoSplitPDF.formPrompt=Stirling-PDF पृष्ठ विभाजक वाली PDF जमा करें:
autoSplitPDF.duplexMode=डुप्लेक्स मोड (सामने और पीछे स्कैनिंग) autoSplitPDF.duplexMode=डुप्लेक्स मोड (सामने और पीछे स्कैनिंग)
autoSplitPDF.dividerDownload1='स्वतः विभाजक (न्यूनतम).pdf' डाउनलोड करें
autoSplitPDF.dividerDownload2='स्वतः विभाजक (निर्देशों के साथ).pdf' डाउनलोड करें autoSplitPDF.dividerDownload2='स्वतः विभाजक (निर्देशों के साथ).pdf' डाउनलोड करें
autoSplitPDF.submit=जमा करें autoSplitPDF.submit=जमा करें

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Prenesite jednu veliku skeniranu PDF datoteku i pustit
autoSplitPDF.selectText.4=Razdjelne stranice automatski se otkrivaju i uklanjaju, jamčeći uredan konačni dokument. autoSplitPDF.selectText.4=Razdjelne stranice automatski se otkrivaju i uklanjaju, jamčeći uredan konačni dokument.
autoSplitPDF.formPrompt=Pošaljite PDF koji sadrži naše razdjelnike stranica: autoSplitPDF.formPrompt=Pošaljite PDF koji sadrži naše razdjelnike stranica:
autoSplitPDF.duplexMode=Obostrani način rada (skeniranje s prednje i stražnje strane) autoSplitPDF.duplexMode=Obostrani način rada (skeniranje s prednje i stražnje strane)
autoSplitPDF.dividerDownload1=Preuzmite 'Auto Splitter Divider (minimalan).pdf'
autoSplitPDF.dividerDownload2=Preuzmite 'Auto Splitter Divider (s uputama).pdf' autoSplitPDF.dividerDownload2=Preuzmite 'Auto Splitter Divider (s uputama).pdf'
autoSplitPDF.submit=Potvrdi autoSplitPDF.submit=Potvrdi

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Töltse fel az egyetlen nagy szkennelt PDF fájlt, és
autoSplitPDF.selectText.4=Az elválasztólapokat automatikusan felismeri és eltávolítja, garantálva a rendezett végeredményt. autoSplitPDF.selectText.4=Az elválasztólapokat automatikusan felismeri és eltávolítja, garantálva a rendezett végeredményt.
autoSplitPDF.formPrompt=Töltse fel a Stirling-PDF oldalelválasztókat tartalmazó PDF-et: autoSplitPDF.formPrompt=Töltse fel a Stirling-PDF oldalelválasztókat tartalmazó PDF-et:
autoSplitPDF.duplexMode=Duplex mód (Elő- és hátoldali szkennelés) autoSplitPDF.duplexMode=Duplex mód (Elő- és hátoldali szkennelés)
autoSplitPDF.dividerDownload1='Automatikus elválasztó (minimális).pdf' letöltése
autoSplitPDF.dividerDownload2='Automatikus elválasztó (utasításokkal).pdf' letöltése autoSplitPDF.dividerDownload2='Automatikus elválasztó (utasításokkal).pdf' letöltése
autoSplitPDF.submit=Küldés autoSplitPDF.submit=Küldés

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Unggah satu berkas PDF besar yang dipindai dan biarkan
autoSplitPDF.selectText.4=Halaman pembatas secara otomatis terdeteksi dan dihapus, menjamin dokumen akhir yang rapi. autoSplitPDF.selectText.4=Halaman pembatas secara otomatis terdeteksi dan dihapus, menjamin dokumen akhir yang rapi.
autoSplitPDF.formPrompt=Kirimkan PDF yang berisi pembagi Halaman Stirling-PDF: autoSplitPDF.formPrompt=Kirimkan PDF yang berisi pembagi Halaman Stirling-PDF:
autoSplitPDF.duplexMode=Mode Dupleks (Pemindaian depan dan belakang) autoSplitPDF.duplexMode=Mode Dupleks (Pemindaian depan dan belakang)
autoSplitPDF.dividerDownload1=Unduh 'Pembagi Pembagi Otomatis (minimal).pdf'
autoSplitPDF.dividerDownload2=Unduh 'Pembagi Pembagi Otomatis (dengan instruksi).pdf' autoSplitPDF.dividerDownload2=Unduh 'Pembagi Pembagi Otomatis (dengan instruksi).pdf'
autoSplitPDF.submit=Kirim autoSplitPDF.submit=Kirim

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Carica il singolo file PDF scansionato di grandi dimen
autoSplitPDF.selectText.4=Le pagine divisorie vengono rilevate e rimosse automaticamente, garantendo un documento finale ordinato. autoSplitPDF.selectText.4=Le pagine divisorie vengono rilevate e rimosse automaticamente, garantendo un documento finale ordinato.
autoSplitPDF.formPrompt=Invia PDF contenente divisori di pagina Stirling-PDF: autoSplitPDF.formPrompt=Invia PDF contenente divisori di pagina Stirling-PDF:
autoSplitPDF.duplexMode=Modalità duplex (scansione fronte e retro) autoSplitPDF.duplexMode=Modalità duplex (scansione fronte e retro)
autoSplitPDF.dividerDownload1=Scarica 'Divisore automatico (minimo).pdf'
autoSplitPDF.dividerDownload2=Scarica 'Divisore automatico (con istruzioni).pdf' autoSplitPDF.dividerDownload2=Scarica 'Divisore automatico (con istruzioni).pdf'
autoSplitPDF.submit=Invia autoSplitPDF.submit=Invia

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=スキャンしたPDFファイルをアップロード
autoSplitPDF.selectText.4=仕切りページは自動的に検出、削除されるので、最終的な文書はきれいに仕上がります。 autoSplitPDF.selectText.4=仕切りページは自動的に検出、削除されるので、最終的な文書はきれいに仕上がります。
autoSplitPDF.formPrompt=Stirling-PDF仕切り用紙を含むPDFを送信: autoSplitPDF.formPrompt=Stirling-PDF仕切り用紙を含むPDFを送信:
autoSplitPDF.duplexMode=両面モード (表裏スキャン) autoSplitPDF.duplexMode=両面モード (表裏スキャン)
autoSplitPDF.dividerDownload1=ダウンロード '自動仕切り用紙 (最小).pdf'
autoSplitPDF.dividerDownload2=ダウンロード '自動仕切り用紙 (手順書付き).pdf' autoSplitPDF.dividerDownload2=ダウンロード '自動仕切り用紙 (手順書付き).pdf'
autoSplitPDF.submit=送信 autoSplitPDF.submit=送信

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=스캔한 단일 PDF 파일을 업로드하고 나머
autoSplitPDF.selectText.4=구분자 페이지는 자동으로 감지되고 제거되어 깔끔한 최종 문서를 보장합니다. autoSplitPDF.selectText.4=구분자 페이지는 자동으로 감지되고 제거되어 깔끔한 최종 문서를 보장합니다.
autoSplitPDF.formPrompt=Stirling-PDF 페이지 구분자가 포함된 PDF 제출: autoSplitPDF.formPrompt=Stirling-PDF 페이지 구분자가 포함된 PDF 제출:
autoSplitPDF.duplexMode=양면 모드 (앞뒷면 스캔) autoSplitPDF.duplexMode=양면 모드 (앞뒷면 스캔)
autoSplitPDF.dividerDownload1='자동 분할 구분자 (최소)' PDF 다운로드
autoSplitPDF.dividerDownload2='자동 분할 구분자 (설명 포함)' PDF 다운로드 autoSplitPDF.dividerDownload2='자동 분할 구분자 (설명 포함)' PDF 다운로드
autoSplitPDF.submit=제출 autoSplitPDF.submit=제출

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Upload het enkele grote gescande PDF-bestand en laat S
autoSplitPDF.selectText.4=Scheidingspagina's worden automatisch gedetecteerd en verwijderd, wat een net einddocument garandeert. autoSplitPDF.selectText.4=Scheidingspagina's worden automatisch gedetecteerd en verwijderd, wat een net einddocument garandeert.
autoSplitPDF.formPrompt=Dien PDF in met Stirling-PDF Pagina-scheiders: autoSplitPDF.formPrompt=Dien PDF in met Stirling-PDF Pagina-scheiders:
autoSplitPDF.duplexMode=Duplex Modus (voor- en achterkant scannen) autoSplitPDF.duplexMode=Duplex Modus (voor- en achterkant scannen)
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Indienen autoSplitPDF.submit=Indienen

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Last opp den enkelte store skannede PDF-filen og la St
autoSplitPDF.selectText.4=Delingssidene blir automatisk oppdaget og fjernet, og garanterer et pent endelig dokument. autoSplitPDF.selectText.4=Delingssidene blir automatisk oppdaget og fjernet, og garanterer et pent endelig dokument.
autoSplitPDF.formPrompt=Send inn PDF som inneholder Stirling-PDF-sideskillere: autoSplitPDF.formPrompt=Send inn PDF som inneholder Stirling-PDF-sideskillere:
autoSplitPDF.duplexMode=Dupleksmodus (Front- og bakskanning) autoSplitPDF.duplexMode=Dupleksmodus (Front- og bakskanning)
autoSplitPDF.dividerDownload1=Last ned 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Last ned 'Auto Splitter Divider (med instruksjoner).pdf' autoSplitPDF.dividerDownload2=Last ned 'Auto Splitter Divider (med instruksjoner).pdf'
autoSplitPDF.submit=Send inn autoSplitPDF.submit=Send inn

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Wyślij pojedynczy duży plik PDF zawierający skan i
autoSplitPDF.selectText.4=Strony separacji są automatycznie wykrywane i usuwane, gwarantując ładny finalny dokument. autoSplitPDF.selectText.4=Strony separacji są automatycznie wykrywane i usuwane, gwarantując ładny finalny dokument.
autoSplitPDF.formPrompt=Wyślij dokument PDF zawierający strony podziału z Stirling PDF. autoSplitPDF.formPrompt=Wyślij dokument PDF zawierający strony podziału z Stirling PDF.
autoSplitPDF.duplexMode=Skanowanie dwustronne autoSplitPDF.duplexMode=Skanowanie dwustronne
autoSplitPDF.dividerDownload1=Pobierz 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Pobierz 'Auto Splitter Divider (with instructions).pdf' autoSplitPDF.dividerDownload2=Pobierz 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Wyślij autoSplitPDF.submit=Wyślij

View File

@@ -138,7 +138,7 @@ analytics.settings=Você pode alterar as configurações de coleta de dados no a
# NAVBAR # # NAVBAR #
############# #############
navbar.favorite=Favoritos navbar.favorite=Favoritos
navbar.recent=New and recently updated navbar.recent=Novos e Recentemente Atualizados
navbar.darkmode=Modo Escuro navbar.darkmode=Modo Escuro
navbar.language=Idiomas navbar.language=Idiomas
navbar.settings=Configurações navbar.settings=Configurações
@@ -266,14 +266,14 @@ home.viewPdf.title=Visualizar PDF
home.viewPdf.desc=Visualizar, anotar, adicionar texto ou imagens ao PDF. home.viewPdf.desc=Visualizar, anotar, adicionar texto ou imagens ao PDF.
viewPdf.tags=visualizar,ler,anotar,texto,imagem viewPdf.tags=visualizar,ler,anotar,texto,imagem
home.setFavorites=Set Favourites home.setFavorites=Adicionar Favoritos
home.hideFavorites=Hide Favourites home.hideFavorites=Ocultar Favoritos
home.showFavorites=Show Favourites home.showFavorites=Mostrar Favoritos
home.legacyHomepage=Old homepage home.legacyHomepage=Homepage Antiga
home.newHomePage=Try our new homepage! home.newHomePage=Experimente nossa nova Homepage!
home.alphabetical=Alphabetical home.alphabetical=Alfabética
home.globalPopularity=Global Popularity home.globalPopularity=Popularidade Global
home.sortBy=Sort by: home.sortBy=Ordenar por:
home.multiTool.title=Multiferramentas de PDF home.multiTool.title=Multiferramentas de PDF
home.multiTool.desc=Mesclar, girar, reorganizar, dividir, inserir e remover páginas. home.multiTool.desc=Mesclar, girar, reorganizar, dividir, inserir e remover páginas.
@@ -417,7 +417,7 @@ home.pageLayout.title=Layout de Múltiplas Páginas
home.pageLayout.desc=Mesclar várias páginas de um documento PDF em uma única página. home.pageLayout.desc=Mesclar várias páginas de um documento PDF em uma única página.
pageLayout.tags=mesclar,composto,vista-única,organizar pageLayout.tags=mesclar,composto,vista-única,organizar
home.scalePages.title=Ajustar Tamanho/Escala da Página home.scalePages.title=Ajustar Dimensões da Página
home.scalePages.desc=Alterar o tamanho/escala da página e/ou seu conteúdo. home.scalePages.desc=Alterar o tamanho/escala da página e/ou seu conteúdo.
scalePages.tags=redimensionar,modificar,dimensão,adaptar scalePages.tags=redimensionar,modificar,dimensão,adaptar
@@ -429,7 +429,7 @@ home.add-page-numbers.title=Adicionar Números de Página
home.add-page-numbers.desc=Adicionar números de página no documento, em um local definido. home.add-page-numbers.desc=Adicionar números de página no documento, em um local definido.
add-page-numbers.tags=paginar,rotular,organizar,índice add-page-numbers.tags=paginar,rotular,organizar,índice
home.auto-rename.title=Renomear Automaticamente o PDF home.auto-rename.title=Renomeação Automática do PDF
home.auto-rename.desc=Renomeia automaticamente o PDF com base no cabeçalho detectado. home.auto-rename.desc=Renomeia automaticamente o PDF com base no cabeçalho detectado.
auto-rename.tags=detecção-automática,baseado-em-cabeçalho,organizar,relabel auto-rename.tags=detecção-automática,baseado-em-cabeçalho,organizar,relabel
@@ -738,8 +738,8 @@ addPageNumbers.submit=Adicionar Números de Página
#auto-rename #auto-rename
auto-rename.title=Renomear Automaticamente o PDF auto-rename.title=Renomeação Automática do PDF
auto-rename.header=Renomear Automaticamente o PDF auto-rename.header=Renomeação Automática do PDF
auto-rename.submit=Renomeação Automática auto-rename.submit=Renomeação Automática
@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Faça o upload do arquivo único PDF digitalizado e de
autoSplitPDF.selectText.4=As páginas divisórias são detectadas e removidas automaticamente, garantindo um documento final organizado. autoSplitPDF.selectText.4=As páginas divisórias são detectadas e removidas automaticamente, garantindo um documento final organizado.
autoSplitPDF.formPrompt=Enviar PDF contendo folhas divisórias Stirling-PDF: autoSplitPDF.formPrompt=Enviar PDF contendo folhas divisórias Stirling-PDF:
autoSplitPDF.duplexMode=Modo Duplex (Digitalização frente e verso). autoSplitPDF.duplexMode=Modo Duplex (Digitalização frente e verso).
autoSplitPDF.dividerDownload1=Baixar 'Folha Divisória Automática (mínimo).pdf'
autoSplitPDF.dividerDownload2=Baixar 'Folha Divisória Automática (com instruções).pdf' autoSplitPDF.dividerDownload2=Baixar 'Folha Divisória Automática (com instruções).pdf'
autoSplitPDF.submit=Enviar autoSplitPDF.submit=Enviar
@@ -786,8 +785,8 @@ pageLayout.submit=Enviar
#scalePages #scalePages
scalePages.title=Ajustar Tamanho/Escala da Página scalePages.title=Ajustar Dimensões da Página
scalePages.header=Ajustar Tamanho/Escala da Página scalePages.header=Ajustar Dimensões da Página
scalePages.pageSize=Tamanho desejado do documento: scalePages.pageSize=Tamanho desejado do documento:
scalePages.keepPageSize=Tamanho Original scalePages.keepPageSize=Tamanho Original
scalePages.scaleFactor=Fator de zoom (corte) de uma página: scalePages.scaleFactor=Fator de zoom (corte) de uma página:

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Carregue o único ficheiro PDF digitalizado grande e d
autoSplitPDF.selectText.4=As páginas separadoras são automaticamente detetadas e removidas, garantindo um documento final organizado. autoSplitPDF.selectText.4=As páginas separadoras são automaticamente detetadas e removidas, garantindo um documento final organizado.
autoSplitPDF.formPrompt=Submeter PDF contendo separadores de página Stirling-PDF: autoSplitPDF.formPrompt=Submeter PDF contendo separadores de página Stirling-PDF:
autoSplitPDF.duplexMode=Modo Duplex (Digitalização frente e verso) autoSplitPDF.duplexMode=Modo Duplex (Digitalização frente e verso)
autoSplitPDF.dividerDownload1=Transferir 'Separador de Divisão Automática (minimal).pdf'
autoSplitPDF.dividerDownload2=Transferir 'Separador de Divisão Automática (com instruções).pdf' autoSplitPDF.dividerDownload2=Transferir 'Separador de Divisão Automática (com instruções).pdf'
autoSplitPDF.submit=Submeter autoSplitPDF.submit=Submeter

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Încarcă fișierul PDF scanat mare și lasă Stirling
autoSplitPDF.selectText.4=Paginile separatoare sunt detectate automat și eliminate, garantând un document final ordonat. autoSplitPDF.selectText.4=Paginile separatoare sunt detectate automat și eliminate, garantând un document final ordonat.
autoSplitPDF.formPrompt=Trimite PDF-ul conținând separatoarele de pagini Stirling-PDF: autoSplitPDF.formPrompt=Trimite PDF-ul conținând separatoarele de pagini Stirling-PDF:
autoSplitPDF.duplexMode=Mod Duplex (Scanare față-verso) autoSplitPDF.duplexMode=Mod Duplex (Scanare față-verso)
autoSplitPDF.dividerDownload1=Descarcă 'Separator Auto Splitter (minimal).pdf'
autoSplitPDF.dividerDownload2=Descarcă 'Separator Auto Splitter (cu instrucțiuni).pdf' autoSplitPDF.dividerDownload2=Descarcă 'Separator Auto Splitter (cu instrucțiuni).pdf'
autoSplitPDF.submit=Trimite autoSplitPDF.submit=Trimite

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Загрузите один большой отска
autoSplitPDF.selectText.4=Разделительные страницы автоматически обнаруживаются и удаляются, гарантируя аккуратный конечный документ. autoSplitPDF.selectText.4=Разделительные страницы автоматически обнаруживаются и удаляются, гарантируя аккуратный конечный документ.
autoSplitPDF.formPrompt=Отправить PDF, содержащий разделители страниц Stirling-PDF: autoSplitPDF.formPrompt=Отправить PDF, содержащий разделители страниц Stirling-PDF:
autoSplitPDF.duplexMode=Двусторонний режим (сканирование с двух сторон) autoSplitPDF.duplexMode=Двусторонний режим (сканирование с двух сторон)
autoSplitPDF.dividerDownload1=Скачать 'Автоматический разделитель (минимальный).pdf'
autoSplitPDF.dividerDownload2=Скачать 'Автоматический разделитель (с инструкциями).pdf' autoSplitPDF.dividerDownload2=Скачать 'Автоматический разделитель (с инструкциями).pdf'
autoSplitPDF.submit=Отправить autoSplitPDF.submit=Отправить

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Nahrajte jeden veľký naskenovaný PDF súbor a necha
autoSplitPDF.selectText.4=Rozdeľovacie stránky sú automaticky detekované a odstránené, čo zaručuje čistý konečný dokument. autoSplitPDF.selectText.4=Rozdeľovacie stránky sú automaticky detekované a odstránené, čo zaručuje čistý konečný dokument.
autoSplitPDF.formPrompt=Odoslať PDF obsahujúce Stirling-PDF rozdeľovače stránok: autoSplitPDF.formPrompt=Odoslať PDF obsahujúce Stirling-PDF rozdeľovače stránok:
autoSplitPDF.duplexMode=Duplex režim (skanovanie prednej a zadnej strany) autoSplitPDF.duplexMode=Duplex režim (skanovanie prednej a zadnej strany)
autoSplitPDF.dividerDownload1=Stiahnuť 'Auto Splitter Divider (minimálny).pdf'
autoSplitPDF.dividerDownload2=Stiahnuť 'Auto Splitter Divider (s inštrukciami).pdf' autoSplitPDF.dividerDownload2=Stiahnuť 'Auto Splitter Divider (s inštrukciami).pdf'
autoSplitPDF.submit=Odoslať autoSplitPDF.submit=Odoslať

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Naložite eno veliko optično prebrano datoteko PDF in
autoSplitPDF.selectText.4=Ločilne strani so samodejno zaznane in odstranjene, kar zagotavlja čist končni dokument. autoSplitPDF.selectText.4=Ločilne strani so samodejno zaznane in odstranjene, kar zagotavlja čist končni dokument.
autoSplitPDF.formPrompt=Pošljite PDF, ki vsebuje razdelilnike strani Stirling-PDF: autoSplitPDF.formPrompt=Pošljite PDF, ki vsebuje razdelilnike strani Stirling-PDF:
autoSplitPDF.duplexMode=Dupleksni način (skeniranje spredaj in zadaj) autoSplitPDF.duplexMode=Dupleksni način (skeniranje spredaj in zadaj)
autoSplitPDF.dividerDownload1=Prenesi 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Prenesi 'Auto Splitter Divider (z navodili).pdf' autoSplitPDF.dividerDownload2=Prenesi 'Auto Splitter Divider (z navodili).pdf'
autoSplitPDF.submit=Pošlji autoSplitPDF.submit=Pošlji

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Učitajte jedan veliki skenirani PDF fajl i dozvolite
autoSplitPDF.selectText.4=Listovi razdeljivača se automatski detektuju i uklanjaju, obezbeđujući uredan konačni dokument. autoSplitPDF.selectText.4=Listovi razdeljivača se automatski detektuju i uklanjaju, obezbeđujući uredan konačni dokument.
autoSplitPDF.formPrompt=Potvrdite PDF koji sadrži Stirling-PDF listove razdeljivača: autoSplitPDF.formPrompt=Potvrdite PDF koji sadrži Stirling-PDF listove razdeljivača:
autoSplitPDF.duplexMode=Dupleks režim (skeniranje prednje i zadnje strane) autoSplitPDF.duplexMode=Dupleks režim (skeniranje prednje i zadnje strane)
autoSplitPDF.dividerDownload1=Preuzmi 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Preuzmi 'Auto Splitter Divider (sa uputstvima).pdf' autoSplitPDF.dividerDownload2=Preuzmi 'Auto Splitter Divider (sa uputstvima).pdf'
autoSplitPDF.submit=Potvrdi autoSplitPDF.submit=Potvrdi

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Ladda upp den enda stora skannade PDF-filen och låt S
autoSplitPDF.selectText.4=Avdelarsidor detekteras automatiskt och tas bort, vilket garanterar ett prydligt slutdokument. autoSplitPDF.selectText.4=Avdelarsidor detekteras automatiskt och tas bort, vilket garanterar ett prydligt slutdokument.
autoSplitPDF.formPrompt=Skicka PDF som innehåller Stirling-PDF-sidavdelare: autoSplitPDF.formPrompt=Skicka PDF som innehåller Stirling-PDF-sidavdelare:
autoSplitPDF.duplexMode=Duplexläge (Fram- och baksideskanning) autoSplitPDF.duplexMode=Duplexläge (Fram- och baksideskanning)
autoSplitPDF.dividerDownload1=Ladda ner 'Auto-delningsavdelare (minimal).pdf'
autoSplitPDF.dividerDownload2=Ladda ner 'Auto-delningsavdelare (med instruktioner).pdf' autoSplitPDF.dividerDownload2=Ladda ner 'Auto-delningsavdelare (med instruktioner).pdf'
autoSplitPDF.submit=Skicka autoSplitPDF.submit=Skicka

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=อัปโหลดไฟล์ PDF ที่สแ
autoSplitPDF.selectText.4=หน้ากั้นจะถูกตรวจจับและลบโดยอัตโนมัติ รับประกันเอกสารสุดท้ายที่เรียบร้อย autoSplitPDF.selectText.4=หน้ากั้นจะถูกตรวจจับและลบโดยอัตโนมัติ รับประกันเอกสารสุดท้ายที่เรียบร้อย
autoSplitPDF.formPrompt=ส่ง PDF ที่มีแผ่นแยก Stirling-PDF: autoSplitPDF.formPrompt=ส่ง PDF ที่มีแผ่นแยก Stirling-PDF:
autoSplitPDF.duplexMode=โหมด Duplex (การสแกนหน้าและหลัง) autoSplitPDF.duplexMode=โหมด Duplex (การสแกนหน้าและหลัง)
autoSplitPDF.dividerDownload1=ดาวน์โหลด 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=ดาวน์โหลด 'Auto Splitter Divider (with instructions).pdf' autoSplitPDF.dividerDownload2=ดาวน์โหลด 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=ส่ง autoSplitPDF.submit=ส่ง

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Tek büyük taranmış PDF dosyasını yükleyin ve ge
autoSplitPDF.selectText.4=Ayırıcı sayfalar otomatik olarak tespit edilir ve kaldırılır, düzgün bir final belgesi garantilidir. autoSplitPDF.selectText.4=Ayırıcı sayfalar otomatik olarak tespit edilir ve kaldırılır, düzgün bir final belgesi garantilidir.
autoSplitPDF.formPrompt=Stirling-PDF Sayfa ayırıcıları içeren PDF'i gönderin: autoSplitPDF.formPrompt=Stirling-PDF Sayfa ayırıcıları içeren PDF'i gönderin:
autoSplitPDF.duplexMode=Çift Taraflı Mod (Ön ve arka tarama) autoSplitPDF.duplexMode=Çift Taraflı Mod (Ön ve arka tarama)
autoSplitPDF.dividerDownload1='Otomatik Ayırıcı Ayırıcı (minimal).pdf' indir
autoSplitPDF.dividerDownload2='Otomatik Ayırıcı Ayırıcı (talimatlarla).pdf' indir autoSplitPDF.dividerDownload2='Otomatik Ayırıcı Ayırıcı (talimatlarla).pdf' indir
autoSplitPDF.submit=Gönder autoSplitPDF.submit=Gönder

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Завантажте один великий відс
autoSplitPDF.selectText.4=Роздільні сторінки автоматично виявляються і видаляються, забезпечуючи акуратний кінцевий документ. autoSplitPDF.selectText.4=Роздільні сторінки автоматично виявляються і видаляються, забезпечуючи акуратний кінцевий документ.
autoSplitPDF.formPrompt=Надіслати PDF-файл, що містить роздільні сторінки Stirling-PDF: autoSplitPDF.formPrompt=Надіслати PDF-файл, що містить роздільні сторінки Stirling-PDF:
autoSplitPDF.duplexMode=Дуплексний режим (сканування спереду і ззаду) autoSplitPDF.duplexMode=Дуплексний режим (сканування спереду і ззаду)
autoSplitPDF.dividerDownload1=Завантажити 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Завантажити 'Auto Splitter Divider (with instructions).pdf' autoSplitPDF.dividerDownload2=Завантажити 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Надіслати autoSplitPDF.submit=Надіслати

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=Tải lên tệp PDF quét lớn duy nhất và để
autoSplitPDF.selectText.4=Các trang phân cách được tự động phát hiện và xóa, đảm bảo tài liệu cuối cùng gọn gàng. autoSplitPDF.selectText.4=Các trang phân cách được tự động phát hiện và xóa, đảm bảo tài liệu cuối cùng gọn gàng.
autoSplitPDF.formPrompt=Gửi PDF chứa trang phân cách Stirling-PDF: autoSplitPDF.formPrompt=Gửi PDF chứa trang phân cách Stirling-PDF:
autoSplitPDF.duplexMode=Chế độ hai mặt (Quét mặt trước và sau) autoSplitPDF.duplexMode=Chế độ hai mặt (Quét mặt trước và sau)
autoSplitPDF.dividerDownload1=Tải xuống 'Trang phân cách tự động (tối giản).pdf'
autoSplitPDF.dividerDownload2=Tải xuống 'Trang phân cách tự động (có hướng dẫn).pdf' autoSplitPDF.dividerDownload2=Tải xuống 'Trang phân cách tự động (có hướng dẫn).pdf'
autoSplitPDF.submit=Gửi autoSplitPDF.submit=Gửi

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=བཤེར་འབེབས་བྱས་པའི
autoSplitPDF.selectText.4=བར་མཚམས་ཤོག་ངོས་རྣམས་རང་འགུལ་གྱིས་ངོས་འཛིན་དང་སུབ་པ་བྱས་ནས་མཐའ་མའི་ཡིག་ཆ་གཙང་མ་ཞིག་ངེས་པར་དུ་ཐོབ་ཐུབ། autoSplitPDF.selectText.4=བར་མཚམས་ཤོག་ངོས་རྣམས་རང་འགུལ་གྱིས་ངོས་འཛིན་དང་སུབ་པ་བྱས་ནས་མཐའ་མའི་ཡིག་ཆ་གཙང་མ་ཞིག་ངེས་པར་དུ་ཐོབ་ཐུབ།
autoSplitPDF.formPrompt=Stirling-PDF ཤོག་ངོས་བར་མཚམས་ཡོད་པའི་ PDF ཕུལ་བ། autoSplitPDF.formPrompt=Stirling-PDF ཤོག་ངོས་བར་མཚམས་ཡོད་པའི་ PDF ཕུལ་བ།
autoSplitPDF.duplexMode=ཕྱོགས་གཉིས་ཀྱི་རྣམ་པ། (མདུན་རྒྱབ་བཤེར་འབེབས།) autoSplitPDF.duplexMode=ཕྱོགས་གཉིས་ཀྱི་རྣམ་པ། (མདུན་རྒྱབ་བཤེར་འབེབས།)
autoSplitPDF.dividerDownload1='རང་འགུལ་ཁ་གྱེས་བར་མཚམས། (ཉུང་ཤོས།).pdf' ཕབ་ལེན།
autoSplitPDF.dividerDownload2='རང་འགུལ་ཁ་གྱེས་བར་མཚམས། (བཀོལ་སྤྱོད་ལམ་སྟོན་དང་བཅས་པ།).pdf' ཕབ་ལེན། autoSplitPDF.dividerDownload2='རང་འགུལ་ཁ་གྱེས་བར་མཚམས། (བཀོལ་སྤྱོད་ལམ་སྟོན་དང་བཅས་པ།).pdf' ཕབ་ལེན།
autoSplitPDF.submit=ཕུལ་བ། autoSplitPDF.submit=ཕུལ་བ།

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=上传单个大型扫描的 PDF 文件,让 Stirling
autoSplitPDF.selectText.4=分隔页会自动检测和删除,确保最终文档整洁。 autoSplitPDF.selectText.4=分隔页会自动检测和删除,确保最终文档整洁。
autoSplitPDF.formPrompt=提交包含 Stirling-PDF 分隔页的 PDF autoSplitPDF.formPrompt=提交包含 Stirling-PDF 分隔页的 PDF
autoSplitPDF.duplexMode=双面模式(正反面扫描) autoSplitPDF.duplexMode=双面模式(正反面扫描)
autoSplitPDF.dividerDownload1=下载“自动拆分分隔页(最小化).pdf”
autoSplitPDF.dividerDownload2=下载“自动拆分分隔页(带指导说明).pdf” autoSplitPDF.dividerDownload2=下载“自动拆分分隔页(带指导说明).pdf”
autoSplitPDF.submit=提交 autoSplitPDF.submit=提交

View File

@@ -768,7 +768,6 @@ autoSplitPDF.selectText.3=上傳單一大的掃描 PDF 檔案,讓 Stirling PDF
autoSplitPDF.selectText.4=自動偵測並移除分隔頁面,確保最終文件整潔。 autoSplitPDF.selectText.4=自動偵測並移除分隔頁面,確保最終文件整潔。
autoSplitPDF.formPrompt=送出包含 Stirling-PDF 頁面分隔器的 PDF autoSplitPDF.formPrompt=送出包含 Stirling-PDF 頁面分隔器的 PDF
autoSplitPDF.duplexMode=雙面模式(正反面掃描) autoSplitPDF.duplexMode=雙面模式(正反面掃描)
autoSplitPDF.dividerDownload1=下載 '自動分割器分隔器(最小化).pdf'
autoSplitPDF.dividerDownload2=下載 '自動分割器分隔器(帶說明).pdf' autoSplitPDF.dividerDownload2=下載 '自動分割器分隔器(帶說明).pdf'
autoSplitPDF.submit=送出 autoSplitPDF.submit=送出

View File

@@ -48,7 +48,7 @@ window.tooltipSetup = () => {
tooltipElements.forEach((element) => { tooltipElements.forEach((element) => {
const tooltipText = element.getAttribute('title'); const tooltipText = element.getAttribute('title');
element.removeAttribute('title'); element.removeAttribute('title');
element.setAttribute('data-title', 'tooltipText'); element.setAttribute('data-title', tooltipText);
const customTooltip = document.createElement('div'); const customTooltip = document.createElement('div');
customTooltip.className = 'btn-tooltip'; customTooltip.className = 'btn-tooltip';
customTooltip.textContent = tooltipText; customTooltip.textContent = tooltipText;

View File

@@ -45,8 +45,6 @@
<li th:text="#{autoSplitPDF.selectText.3}"></li> <li th:text="#{autoSplitPDF.selectText.3}"></li>
<li th:text="#{autoSplitPDF.selectText.4}"></li> <li th:text="#{autoSplitPDF.selectText.4}"></li>
</ul> </ul>
<p><a th:href="@{'/files/Auto%20Splitter%20Divider%20(minimal).pdf'}" download
th:text="#{autoSplitPDF.dividerDownload1}"></a></p>
<p><a th:href="@{'/files/Auto%20Splitter%20Divider%20(with%20instructions).pdf'}" download <p><a th:href="@{'/files/Auto%20Splitter%20Divider%20(with%20instructions).pdf'}" download
th:text="#{autoSplitPDF.dividerDownload2}"></a></p> th:text="#{autoSplitPDF.dividerDownload2}"></a></p>
</div> </div>