Compare commits
15 Commits
Frooodle-p
...
v0.41.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6a3064f7f2 | ||
|
|
158708b696 | ||
|
|
0233086487 | ||
|
|
242aa5eae1 | ||
|
|
bf65c456d1 | ||
|
|
26720c5018 | ||
|
|
2ed07e3fcb | ||
|
|
e382d254ee | ||
|
|
507d21772d | ||
|
|
5bf050d77f | ||
|
|
976caeb79d | ||
|
|
2d3611fd00 | ||
|
|
118de1789a | ||
|
|
b56d54a35a | ||
|
|
b9bfcd59cd |
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -141,4 +141,4 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
chmod +x ./testing/test_webpages.sh
|
chmod +x ./testing/test_webpages.sh
|
||||||
chmod +x ./testing/test.sh
|
chmod +x ./testing/test.sh
|
||||||
./testing/test.sh "${{ github.event.pull_request.user.login == 'dependabot[bot]' }}"
|
./testing/test.sh
|
||||||
|
|||||||
2
.github/workflows/licenses-update.yml
vendored
2
.github/workflows/licenses-update.yml
vendored
@@ -38,7 +38,7 @@ jobs:
|
|||||||
java-version: "17"
|
java-version: "17"
|
||||||
distribution: "adopt"
|
distribution: "adopt"
|
||||||
|
|
||||||
- uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
|
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0
|
||||||
|
|
||||||
- name: check the licenses for compatibility
|
- name: check the licenses for compatibility
|
||||||
run: ./gradlew clean checkLicense
|
run: ./gradlew clean checkLicense
|
||||||
|
|||||||
4
.github/workflows/multiOSReleases.yml
vendored
4
.github/workflows/multiOSReleases.yml
vendored
@@ -63,7 +63,7 @@ jobs:
|
|||||||
java-version: "21"
|
java-version: "21"
|
||||||
distribution: "temurin"
|
distribution: "temurin"
|
||||||
|
|
||||||
- uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
|
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0
|
||||||
with:
|
with:
|
||||||
gradle-version: 8.12
|
gradle-version: 8.12
|
||||||
|
|
||||||
@@ -151,7 +151,7 @@ jobs:
|
|||||||
java-version: "21"
|
java-version: "21"
|
||||||
distribution: "temurin"
|
distribution: "temurin"
|
||||||
|
|
||||||
- uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
|
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0
|
||||||
with:
|
with:
|
||||||
gradle-version: 8.12
|
gradle-version: 8.12
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/push-docker.yml
vendored
2
.github/workflows/push-docker.yml
vendored
@@ -30,7 +30,7 @@ jobs:
|
|||||||
java-version: "17"
|
java-version: "17"
|
||||||
distribution: "temurin"
|
distribution: "temurin"
|
||||||
|
|
||||||
- uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
|
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0
|
||||||
with:
|
with:
|
||||||
gradle-version: 8.12
|
gradle-version: 8.12
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/releaseArtifacts.yml
vendored
2
.github/workflows/releaseArtifacts.yml
vendored
@@ -35,7 +35,7 @@ jobs:
|
|||||||
java-version: "17"
|
java-version: "17"
|
||||||
distribution: "temurin"
|
distribution: "temurin"
|
||||||
|
|
||||||
- uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
|
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0
|
||||||
with:
|
with:
|
||||||
gradle-version: 8.12
|
gradle-version: 8.12
|
||||||
|
|
||||||
|
|||||||
14
.github/workflows/sonarqube.yml
vendored
14
.github/workflows/sonarqube.yml
vendored
@@ -31,20 +31,6 @@ jobs:
|
|||||||
java-version: '17'
|
java-version: '17'
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
|
|
||||||
- name: Cache SonarCloud packages
|
|
||||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
|
||||||
with:
|
|
||||||
path: ~/.sonar/cache
|
|
||||||
key: ${{ runner.os }}-sonar
|
|
||||||
restore-keys: ${{ runner.os }}-sonar
|
|
||||||
|
|
||||||
- name: Cache Gradle packages
|
|
||||||
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
|
||||||
with:
|
|
||||||
path: ~/.gradle/caches
|
|
||||||
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
|
|
||||||
restore-keys: ${{ runner.os }}-gradle
|
|
||||||
|
|
||||||
- name: Build and analyze with Gradle
|
- name: Build and analyze with Gradle
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
2
.github/workflows/swagger.yml
vendored
2
.github/workflows/swagger.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
|||||||
java-version: "17"
|
java-version: "17"
|
||||||
distribution: "temurin"
|
distribution: "temurin"
|
||||||
|
|
||||||
- uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
|
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0
|
||||||
|
|
||||||
- name: Generate Swagger documentation
|
- name: Generate Swagger documentation
|
||||||
run: ./gradlew generateOpenApiDocs
|
run: ./gradlew generateOpenApiDocs
|
||||||
|
|||||||
19
.github/workflows/sync_files.yml
vendored
19
.github/workflows/sync_files.yml
vendored
@@ -8,8 +8,6 @@ on:
|
|||||||
paths:
|
paths:
|
||||||
- "build.gradle"
|
- "build.gradle"
|
||||||
- "README.md"
|
- "README.md"
|
||||||
- "gradle/verification-keyring.keys"
|
|
||||||
- "gradle/verification-metadata.xml"
|
|
||||||
- "src/main/resources/messages_*.properties"
|
- "src/main/resources/messages_*.properties"
|
||||||
- "src/main/resources/static/3rdPartyLicenses.json"
|
- "src/main/resources/static/3rdPartyLicenses.json"
|
||||||
- "scripts/ignore_translation.toml"
|
- "scripts/ignore_translation.toml"
|
||||||
@@ -104,12 +102,6 @@ jobs:
|
|||||||
git add README.md
|
git add README.md
|
||||||
git diff --staged --quiet || git commit -m ":memo: Sync README.md" || echo "no changes"
|
git diff --staged --quiet || git commit -m ":memo: Sync README.md" || echo "no changes"
|
||||||
|
|
||||||
- name: Run git add
|
|
||||||
run: |
|
|
||||||
git add gradle/verification-keyring.keys
|
|
||||||
git add gradle/verification-metadata.xml
|
|
||||||
git diff --staged --quiet || git commit -m ":memo: Generate verification metadata with signatures and checksums" || echo "no changes"
|
|
||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6
|
uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6
|
||||||
with:
|
with:
|
||||||
@@ -119,11 +111,11 @@ jobs:
|
|||||||
author: ${{ needs.read_bot_entries.outputs.committer }}
|
author: ${{ needs.read_bot_entries.outputs.committer }}
|
||||||
signoff: true
|
signoff: true
|
||||||
branch: sync_readme
|
branch: sync_readme
|
||||||
title: ":globe_with_meridians: Sync Translations + Update README Progress Table + Update Verification Metadata"
|
title: ":globe_with_meridians: Sync Translations + Update README Progress Table"
|
||||||
body: |
|
body: |
|
||||||
### Description of Changes
|
### Description of Changes
|
||||||
|
|
||||||
This Pull Request was automatically generated to synchronize updates to translation files, verification metadata, and documentation. Below are the details of the changes made:
|
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**
|
#### **1. Synchronization of Translation Files**
|
||||||
- Updated translation files (`messages_*.properties`) to reflect changes in the reference file `messages_en_GB.properties`.
|
- Updated translation files (`messages_*.properties`) to reflect changes in the reference file `messages_en_GB.properties`.
|
||||||
@@ -135,14 +127,9 @@ jobs:
|
|||||||
- Added a summary of the current translation status for all supported languages.
|
- Added a summary of the current translation status for all supported languages.
|
||||||
- Included up-to-date statistics on translation coverage.
|
- Included up-to-date statistics on translation coverage.
|
||||||
|
|
||||||
#### **3. Verification Metadata Updates**
|
|
||||||
- Generated or refreshed the `verification-keyring.keys` and `verification-metadata.xml` files.
|
|
||||||
- Included the latest dependency signatures and checksums to enhance the build's integrity.
|
|
||||||
|
|
||||||
#### **Why these changes are necessary**
|
#### **Why these changes are necessary**
|
||||||
- Keeps translation files aligned with the latest reference updates.
|
- Keeps translation files aligned with the latest reference updates.
|
||||||
- Ensures the documentation reflects the current translation progress.
|
- Ensures the documentation reflects the current translation progress.
|
||||||
- Strengthens dependency verification for a more secure build process.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -156,5 +143,3 @@ jobs:
|
|||||||
add-paths: |
|
add-paths: |
|
||||||
README.md
|
README.md
|
||||||
src/main/resources/messages_*.properties
|
src/main/resources/messages_*.properties
|
||||||
gradle/verification-keyring.keys
|
|
||||||
gradle/verification-metadata.xml
|
|
||||||
|
|||||||
@@ -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 \
|
||||||
|
|||||||
@@ -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 \
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ Stirling-PDF currently supports 39 languages!
|
|||||||
| Catalan (Català) (ca_CA) |  |
|
| Catalan (Català) (ca_CA) |  |
|
||||||
| Croatian (Hrvatski) (hr_HR) |  |
|
| Croatian (Hrvatski) (hr_HR) |  |
|
||||||
| Czech (Česky) (cs_CZ) |  |
|
| Czech (Česky) (cs_CZ) |  |
|
||||||
| Danish (Dansk) (da_DK) |  |
|
| Danish (Dansk) (da_DK) |  |
|
||||||
| Dutch (Nederlands) (nl_NL) |  |
|
| Dutch (Nederlands) (nl_NL) |  |
|
||||||
| English (English) (en_GB) |  |
|
| English (English) (en_GB) |  |
|
||||||
| English (US) (en_US) |  |
|
| English (US) (en_US) |  |
|
||||||
@@ -142,7 +142,7 @@ Stirling-PDF currently supports 39 languages!
|
|||||||
| Persian (فارسی) (fa_IR) |  |
|
| Persian (فارسی) (fa_IR) |  |
|
||||||
| Polish (Polski) (pl_PL) |  |
|
| Polish (Polski) (pl_PL) |  |
|
||||||
| Portuguese (Português) (pt_PT) |  |
|
| Portuguese (Português) (pt_PT) |  |
|
||||||
| Portuguese Brazilian (Português) (pt_BR) |  |
|
| Portuguese Brazilian (Português) (pt_BR) |  |
|
||||||
| Romanian (Română) (ro_RO) |  |
|
| Romanian (Română) (ro_RO) |  |
|
||||||
| Russian (Русский) (ru_RU) |  |
|
| Russian (Русский) (ru_RU) |  |
|
||||||
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ plugins {
|
|||||||
id "com.diffplug.spotless" version "7.0.2"
|
id "com.diffplug.spotless" version "7.0.2"
|
||||||
id "com.github.jk1.dependency-license-report" version "2.9"
|
id "com.github.jk1.dependency-license-report" version "2.9"
|
||||||
//id "nebula.lint" version "19.0.3"
|
//id "nebula.lint" version "19.0.3"
|
||||||
id("org.panteleyev.jpackageplugin") version "1.6.0"
|
id("org.panteleyev.jpackageplugin") version "1.6.1"
|
||||||
id "org.sonarqube" version "6.0.1.5171"
|
id "org.sonarqube" version "6.0.1.5171"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ ext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group = "stirling.software"
|
group = "stirling.software"
|
||||||
version = "0.40.1"
|
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 |
Binary file not shown.
|
Before Width: | Height: | Size: 242 KiB After Width: | Height: | Size: 169 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 118 KiB |
@@ -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() {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public class ConvertHtmlToPDF {
|
|||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert an HTML or ZIP (containing HTML and CSS) to PDF",
|
summary = "Convert an HTML or ZIP (containing HTML and CSS) to PDF",
|
||||||
description =
|
description =
|
||||||
"This endpoint takes an HTML or ZIP file input and converts it to a PDF format.")
|
"This endpoint takes an HTML or ZIP file input and converts it to a PDF format. Input:HTML Output:PDF Type:SISO")
|
||||||
public ResponseEntity<byte[]> HtmlToPdf(@ModelAttribute HTMLToPdfRequest request)
|
public ResponseEntity<byte[]> HtmlToPdf(@ModelAttribute HTMLToPdfRequest request)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
MultipartFile fileInput = request.getFileInput();
|
MultipartFile fileInput = request.getFileInput();
|
||||||
|
|||||||
@@ -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()));
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -65,6 +66,10 @@ public class OCRController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf")
|
@PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf")
|
||||||
|
@Operation(
|
||||||
|
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")
|
||||||
public ResponseEntity<byte[]> processPdfWithOCR(
|
public ResponseEntity<byte[]> processPdfWithOCR(
|
||||||
@ModelAttribute ProcessPdfWithOcrRequest request)
|
@ModelAttribute ProcessPdfWithOcrRequest request)
|
||||||
throws IOException, InterruptedException {
|
throws IOException, InterruptedException {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -218,6 +218,9 @@ public class ProcessExecutor {
|
|||||||
errorReaderThread.join();
|
errorReaderThread.join();
|
||||||
outputReaderThread.join();
|
outputReaderThread.join();
|
||||||
|
|
||||||
|
boolean isQpdf =
|
||||||
|
command != null && !command.isEmpty() && command.get(0).contains("qpdf");
|
||||||
|
|
||||||
if (outputLines.size() > 0) {
|
if (outputLines.size() > 0) {
|
||||||
String outputMessage = String.join("\n", outputLines);
|
String outputMessage = String.join("\n", outputLines);
|
||||||
messages += outputMessage;
|
messages += outputMessage;
|
||||||
@@ -233,6 +236,9 @@ public class ProcessExecutor {
|
|||||||
log.warn("Command error output:\n" + errorMessage);
|
log.warn("Command error output:\n" + errorMessage);
|
||||||
}
|
}
|
||||||
if (exitCode != 0) {
|
if (exitCode != 0) {
|
||||||
|
if (isQpdf && exitCode == 3) {
|
||||||
|
log.warn("qpdf succeeded with warnings: {}", messages);
|
||||||
|
} else {
|
||||||
throw new IOException(
|
throw new IOException(
|
||||||
"Command process failed with exit code "
|
"Command process failed with exit code "
|
||||||
+ exitCode
|
+ exitCode
|
||||||
@@ -240,14 +246,19 @@ public class ProcessExecutor {
|
|||||||
+ errorMessage);
|
+ errorMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (exitCode != 0) {
|
if (exitCode != 0) {
|
||||||
|
if (isQpdf && exitCode == 3) {
|
||||||
|
log.warn("qpdf succeeded with warnings: {}", messages);
|
||||||
|
} else {
|
||||||
throw new IOException(
|
throw new IOException(
|
||||||
"Command process failed with exit code "
|
"Command process failed with exit code "
|
||||||
+ exitCode
|
+ exitCode
|
||||||
+ "\nLogs: "
|
+ "\nLogs: "
|
||||||
+ messages);
|
+ messages);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
semaphore.release();
|
semaphore.release();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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=إرسال
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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=Подайте
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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=Υποβολή
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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=ارسال
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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=जमा करें
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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=送信
|
||||||
|
|
||||||
|
|||||||
@@ -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=제출
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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=Отправить
|
||||||
|
|
||||||
|
|||||||
@@ -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ť
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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=ส่ง
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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=Надіслати
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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=ཕུལ་བ།
|
||||||
|
|
||||||
|
|||||||
@@ -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=提交
|
||||||
|
|
||||||
|
|||||||
@@ -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=送出
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<th:block th:fragment="navElements">
|
<th:block th:fragment="navElements">
|
||||||
<div id="groupOrganize" class="feature-group">
|
<div id="groupOrganize" class="feature-group">
|
||||||
<div
|
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.organize})}">
|
||||||
th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.organize})}">
|
|
||||||
</div>
|
</div>
|
||||||
<div class="nav-group-container">
|
<div class="nav-group-container">
|
||||||
<div
|
<div
|
||||||
@@ -12,7 +11,8 @@
|
|||||||
th:replace="~{fragments/navbarEntry :: navbarEntry ('merge-pdfs', 'add_to_photos', 'home.merge.title', 'home.merge.desc', 'merge.tags', 'organize')}">
|
th:replace="~{fragments/navbarEntry :: navbarEntry ('merge-pdfs', 'add_to_photos', 'home.merge.title', 'home.merge.desc', 'merge.tags', 'organize')}">
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
th:replace="~{fragments/navbarEntry :: navbarEntry ('split-pdfs', 'cut', 'home.split.title', 'home.split.desc', 'split.tags', 'organize')}"></div>
|
th:replace="~{fragments/navbarEntry :: navbarEntry ('split-pdfs', 'cut', 'home.split.title', 'home.split.desc', 'split.tags', 'organize')}">
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
th:replace="~{fragments/navbarEntry :: navbarEntry('rotate-pdf', 'rotate_right', 'home.rotate.title', 'home.rotate.desc', 'rotate.tags', 'organize')}">
|
th:replace="~{fragments/navbarEntry :: navbarEntry('rotate-pdf', 'rotate_right', 'home.rotate.title', 'home.rotate.desc', 'rotate.tags', 'organize')}">
|
||||||
</div>
|
</div>
|
||||||
@@ -41,8 +41,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="groupConvertTo" class="feature-group">
|
<div id="groupConvertTo" class="feature-group">
|
||||||
<div
|
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertTo})}">
|
||||||
th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertTo})}">
|
|
||||||
</div>
|
</div>
|
||||||
<div class="nav-group-container">
|
<div class="nav-group-container">
|
||||||
<div
|
<div
|
||||||
@@ -66,8 +65,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="groupConvertFrom" class="feature-group">
|
<div id="groupConvertFrom" class="feature-group">
|
||||||
<div
|
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertFrom})}">
|
||||||
th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertFrom})}">
|
|
||||||
</div>
|
</div>
|
||||||
<div class="nav-group-container">
|
<div class="nav-group-container">
|
||||||
<div
|
<div
|
||||||
@@ -104,8 +102,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="convertGroup" class="feature-group">
|
<div id="convertGroup" class="feature-group">
|
||||||
<div
|
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertTo})}">
|
||||||
th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertTo})}">
|
|
||||||
</div>
|
</div>
|
||||||
<div class="nav-group-container">
|
<div class="nav-group-container">
|
||||||
<div
|
<div
|
||||||
@@ -127,8 +124,7 @@
|
|||||||
th:replace="~{fragments/navbarEntry :: navbarEntry('book-to-pdf', 'book', 'home.BookToPDF.title', 'home.BookToPDF.desc', 'BookToPDF.tags', 'convertto')}">
|
th:replace="~{fragments/navbarEntry :: navbarEntry('book-to-pdf', 'book', 'home.BookToPDF.title', 'home.BookToPDF.desc', 'BookToPDF.tags', 'convertto')}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertFrom})}">
|
||||||
th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertFrom})}">
|
|
||||||
</div>
|
</div>
|
||||||
<div class="nav-group-container">
|
<div class="nav-group-container">
|
||||||
<div
|
<div
|
||||||
@@ -161,8 +157,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="groupSecurity" class="feature-group">
|
<div id="groupSecurity" class="feature-group">
|
||||||
<div
|
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.security})}">
|
||||||
th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.security})}">
|
|
||||||
</div>
|
</div>
|
||||||
<div class="nav-group-container">
|
<div class="nav-group-container">
|
||||||
<div
|
<div
|
||||||
@@ -186,22 +181,22 @@
|
|||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
th:replace="~{fragments/navbarEntry :: navbarEntry('remove-cert-sign', 'remove_moderator', 'home.removeCertSign.title', 'home.removeCertSign.desc', 'removeCertSign.tags', 'security')}">
|
th:replace="~{fragments/navbarEntry :: navbarEntry('remove-cert-sign', 'remove_moderator', 'home.removeCertSign.title', 'home.removeCertSign.desc', 'removeCertSign.tags', 'security')}">
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
th:replace="~{fragments/navbarEntry :: navbarEntry('sanitize-pdf', 'sanitizer', 'home.sanitizePdf.title', 'home.sanitizePdf.desc', 'sanitizePdf.tags', 'security')}">
|
th:replace="~{fragments/navbarEntry :: navbarEntry('sanitize-pdf', 'sanitizer', 'home.sanitizePdf.title', 'home.sanitizePdf.desc', 'sanitizePdf.tags', 'security')}">
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
th:replace="~{fragments/navbarEntryCustom :: navbarEntry('auto-redact', '/images/redact-auto.svg#icon-redact-auto', 'home.autoRedact.title', 'home.autoRedact.desc', 'autoRedact.tags', 'security')}">
|
th:replace="~{fragments/navbarEntryCustom :: navbarEntry('auto-redact', '/images/redact-auto.svg#icon-redact-auto', 'home.autoRedact.title', 'home.autoRedact.desc', 'autoRedact.tags', 'security')}">
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
th:replace="~{fragments/navbarEntryCustom :: navbarEntry('redact', '/images/redact-manual.svg#icon-redact-manual', 'home.redact.title', 'home.redact.desc', 'redact.tags', 'security')}">
|
th:replace="~{fragments/navbarEntryCustom :: navbarEntry('redact', '/images/redact-manual.svg#icon-redact-manual', 'home.redact.title', 'home.redact.desc', 'redact.tags', 'security')}">
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
th:replace="~{fragments/navbarEntry :: navbarEntry('stamp', 'approval', 'home.AddStampRequest.title', 'home.AddStampRequest.desc', 'AddStampRequest.tags', 'security')}">
|
th:replace="~{fragments/navbarEntry :: navbarEntry('stamp', 'approval', 'home.AddStampRequest.title', 'home.AddStampRequest.desc', 'AddStampRequest.tags', 'security')}">
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
th:replace="~{fragments/navbarEntry :: navbarEntry('add-watermark', 'water_drop', 'home.watermark.title', 'home.watermark.desc', 'watermark.tags', 'security')}">
|
th:replace="~{fragments/navbarEntry :: navbarEntry('add-watermark', 'water_drop', 'home.watermark.title', 'home.watermark.desc', 'watermark.tags', 'security')}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -246,13 +241,12 @@ th:replace="~{fragments/navbarEntryCustom :: navbarEntry('redact', '/images/reda
|
|||||||
th:replace="~{fragments/navbarEntry :: navbarEntry('remove-image-pdf', 'remove_selection', 'home.removeImagePdf.title', 'home.removeImagePdf.desc', 'removeImagePdf.tags', 'other')}">
|
th:replace="~{fragments/navbarEntry :: navbarEntry('remove-image-pdf', 'remove_selection', 'home.removeImagePdf.title', 'home.removeImagePdf.desc', 'removeImagePdf.tags', 'other')}">
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
th:replace="~{fragments/navbarEntry :: navbarEntry('replace-color-pdf', 'format_color_fill', 'home.replaceColorPdf.title', 'home.replaceColorPdf.desc', 'replaceColorPdf.tags', 'other')}">
|
th:replace="~{fragments/navbarEntry :: navbarEntry('replace-and-invert-color-pdf', 'format_color_fill', 'home.replaceColorPdf.title', 'home.replaceColorPdf.desc', 'replaceColorPdf.tags', 'other')}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="groupAdvanced" class="feature-group">
|
<div id="groupAdvanced" class="feature-group">
|
||||||
<div
|
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.advance})}">
|
||||||
th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.advance})}">
|
|
||||||
</div>
|
</div>
|
||||||
<div class="nav-group-container">
|
<div class="nav-group-container">
|
||||||
<div
|
<div
|
||||||
@@ -293,4 +287,4 @@ th:replace="~{fragments/navbarEntryCustom :: navbarEntry('redact', '/images/reda
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</th:block>
|
</th:block>
|
||||||
@@ -27,12 +27,13 @@
|
|||||||
<span class="material-symbols-rounded search-icon">
|
<span class="material-symbols-rounded search-icon">
|
||||||
search
|
search
|
||||||
</span>
|
</span>
|
||||||
<input type="text" id="searchBar" onkeyup="filterCards()" th:placeholder="#{home.searchBar}" autofocus>
|
<input type="text" id="searchBar" onkeyup="filterCardsLegacy()" th:placeholder="#{home.searchBar}" autofocus>
|
||||||
<div style="display: flex; align-items: center;">
|
<div style="display: flex; align-items: center;">
|
||||||
<a href="home" onclick="setAsDefault('home')" style="text-decoration: none; color: inherit; cursor: pointer; display: flex; align-items: center;">
|
<a href="home" onclick="setAsDefault('home')"
|
||||||
|
style="text-decoration: none; color: inherit; cursor: pointer; display: flex; align-items: center;">
|
||||||
<span th:text="#{home.newHomePage}">
|
<span th:text="#{home.newHomePage}">
|
||||||
</span>
|
</span>
|
||||||
<span class="material-symbols-rounded toggle-favourites" style="font-size: 2rem; margin-left: 0.2rem;" >
|
<span class="material-symbols-rounded toggle-favourites" style="font-size: 2rem; margin-left: 0.2rem;">
|
||||||
home
|
home
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
@@ -70,7 +71,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="groupFavorites" class="feature-group-legacy">
|
<div id="groupFavorites" class="feature-group-legacy">
|
||||||
<div th:replace="~{fragments/featureGroupHeaderLegacy :: featureGroupHeader(groupTitle=#{navbar.favorite})}">
|
<div
|
||||||
|
th:replace="~{fragments/featureGroupHeaderLegacy :: featureGroupHeader(groupTitle=#{navbar.favorite})}">
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-group-container">
|
<div class="feature-group-container">
|
||||||
</div>
|
</div>
|
||||||
@@ -248,7 +250,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="groupView" class="feature-group-legacy">
|
<div id="groupView" class="feature-group-legacy">
|
||||||
<div th:replace="~{fragments/featureGroupHeaderLegacy :: featureGroupHeader(groupTitle=#{navbar.sections.edit})}">
|
<div
|
||||||
|
th:replace="~{fragments/featureGroupHeaderLegacy :: featureGroupHeader(groupTitle=#{navbar.sections.edit})}">
|
||||||
</div>
|
</div>
|
||||||
<div class="feature-group-container">
|
<div class="feature-group-container">
|
||||||
<div
|
<div
|
||||||
@@ -289,7 +292,7 @@
|
|||||||
th:replace="~{fragments/card :: card(id='remove-image-pdf', cardTitle=#{home.removeImagePdf.title}, cardText=#{home.removeImagePdf.desc}, cardLink='remove-image-pdf', toolIcon='remove_selection', tags=#{removeImagePdf.tags}, toolGroup='other')}">
|
th:replace="~{fragments/card :: card(id='remove-image-pdf', cardTitle=#{home.removeImagePdf.title}, cardText=#{home.removeImagePdf.desc}, cardLink='remove-image-pdf', toolIcon='remove_selection', tags=#{removeImagePdf.tags}, toolGroup='other')}">
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
th:replace="~{fragments/card :: card(id='replace-color-pdf', cardTitle=#{home.replaceColorPdf.title}, cardText=#{home.replaceColorPdf.desc}, cardLink='replace-and-invert-color-pdf', toolIcon='format_color_fill', tags=#{replaceColorPdf.tags}, toolGroup='other')}">
|
th:replace="~{fragments/card :: card(id='replace-and-invert-color-pdf', cardTitle=#{home.replaceColorPdf.title}, cardText=#{home.replaceColorPdf.desc}, cardLink='replace-and-invert-color-pdf', toolIcon='format_color_fill', tags=#{replaceColorPdf.tags}, toolGroup='other')}">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Default value for the Boolean parameter
|
|
||||||
VERIFICATION=${1:-false} # Default is "false" if no parameter is passed
|
|
||||||
|
|
||||||
# Find project root by locating build.gradle
|
# Find project root by locating build.gradle
|
||||||
find_root() {
|
find_root() {
|
||||||
local dir="$PWD"
|
local dir="$PWD"
|
||||||
@@ -92,7 +89,6 @@ main() {
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Building Docker images
|
# Building Docker images
|
||||||
# docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t stirlingtools/stirling-pdf:latest -f ./Dockerfile .
|
# docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t stirlingtools/stirling-pdf:latest -f ./Dockerfile .
|
||||||
docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t stirlingtools/stirling-pdf:latest-ultra-lite -f ./Dockerfile.ultra-lite .
|
docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t stirlingtools/stirling-pdf:latest-ultra-lite -f ./Dockerfile.ultra-lite .
|
||||||
@@ -111,9 +107,8 @@ main() {
|
|||||||
cd "$PROJECT_ROOT"
|
cd "$PROJECT_ROOT"
|
||||||
docker-compose -f "./exampleYmlFiles/docker-compose-latest-ultra-lite.yml" down
|
docker-compose -f "./exampleYmlFiles/docker-compose-latest-ultra-lite.yml" down
|
||||||
|
|
||||||
|
# run_tests "Stirling-PDF" "./exampleYmlFiles/docker-compose-latest.yml"
|
||||||
#run_tests "Stirling-PDF" "./exampleYmlFiles/docker-compose-latest.yml"
|
# docker-compose -f "./exampleYmlFiles/docker-compose-latest.yml" down
|
||||||
#docker-compose -f "./exampleYmlFiles/docker-compose-latest.yml" down
|
|
||||||
|
|
||||||
export DOCKER_ENABLE_SECURITY=true
|
export DOCKER_ENABLE_SECURITY=true
|
||||||
# Run the gradlew build command and check if it fails
|
# Run the gradlew build command and check if it fails
|
||||||
@@ -122,7 +117,6 @@ main() {
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Building Docker images with security enabled
|
# Building Docker images with security enabled
|
||||||
# docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t stirlingtools/stirling-pdf:latest -f ./Dockerfile .
|
# docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t stirlingtools/stirling-pdf:latest -f ./Dockerfile .
|
||||||
# docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t stirlingtools/stirling-pdf:latest-ultra-lite -f ./Dockerfile.ultra-lite .
|
# docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t stirlingtools/stirling-pdf:latest-ultra-lite -f ./Dockerfile.ultra-lite .
|
||||||
@@ -131,9 +125,9 @@ main() {
|
|||||||
|
|
||||||
# Test each configuration with security
|
# Test each configuration with security
|
||||||
# run_tests "Stirling-PDF-Ultra-Lite-Security" "./exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml"
|
# run_tests "Stirling-PDF-Ultra-Lite-Security" "./exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml"
|
||||||
#docker-compose -f "./exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml" down
|
# docker-compose -f "./exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml" down
|
||||||
# run_tests "Stirling-PDF-Security" "./exampleYmlFiles/docker-compose-latest-security.yml"
|
# run_tests "Stirling-PDF-Security" "./exampleYmlFiles/docker-compose-latest-security.yml"
|
||||||
# docker-compose -f "./exampleYmlFiles/docker-compose-latest-security.yml" down
|
# docker-compose -f "./exampleYmlFiles/docker-compose-latest-security.yml" down
|
||||||
|
|
||||||
|
|
||||||
run_tests "Stirling-PDF-Security-Fat" "./exampleYmlFiles/docker-compose-latest-fat-security.yml"
|
run_tests "Stirling-PDF-Security-Fat" "./exampleYmlFiles/docker-compose-latest-fat-security.yml"
|
||||||
@@ -150,7 +144,6 @@ main() {
|
|||||||
|
|
||||||
docker-compose -f "./exampleYmlFiles/docker-compose-latest-fat-security.yml" down
|
docker-compose -f "./exampleYmlFiles/docker-compose-latest-fat-security.yml" down
|
||||||
|
|
||||||
|
|
||||||
run_tests "Stirling-PDF-Security-Fat-with-login" "./exampleYmlFiles/test_cicd.yml"
|
run_tests "Stirling-PDF-Security-Fat-with-login" "./exampleYmlFiles/test_cicd.yml"
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
@@ -186,8 +179,6 @@ main() {
|
|||||||
echo -e "\e[31m$test\e[0m" # Red color for failed tests
|
echo -e "\e[31m$test\e[0m" # Red color for failed tests
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Check if there are any failed tests and exit with an error code if so
|
# Check if there are any failed tests and exit with an error code if so
|
||||||
if [ ${#failed_tests[@]} -ne 0 ]; then
|
if [ ${#failed_tests[@]} -ne 0 ]; then
|
||||||
echo "Some tests failed."
|
echo "Some tests failed."
|
||||||
@@ -196,7 +187,6 @@ main() {
|
|||||||
echo "All tests passed successfully."
|
echo "All tests passed successfully."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
main
|
main
|
||||||
Reference in New Issue
Block a user