Compare commits

..

41 Commits

Author SHA1 Message Date
Anthony Stirling
48be772703 Update build.gradle 2024-02-03 22:54:33 +00:00
Anthony Stirling
a9edb49723 Merge pull request #772 from Stirling-Tools/pixeebot/drip-2024-02-02-pixee-java/switch-literal-first
Switch order of literals to prevent NullPointerException
2024-02-02 00:31:13 +00:00
pixeebot[bot]
95471a2fba Switch order of literals to prevent NullPointerException 2024-02-02 00:29:18 +00:00
Anthony Stirling
36c277961f Merge pull request #771 from Stirling-Tools/pixeebot/drip-2024-02-02-pixee-java/upgrade-tempfile-to-nio
Modernize and secure temp file creation
2024-02-02 00:20:39 +00:00
pixeebot[bot]
734fff5618 Modernize and secure temp file creation 2024-02-02 00:15:46 +00:00
Anthony Stirling
16136b2f6f Merge pull request #769 from Stirling-Tools/pixeebot/drip-2024-02-01-pixee-java/sanitize-spring-multipart-filename
Sanitized user-provided file names in HTTP multipart uploads
2024-02-01 23:51:48 +00:00
pixeebot[bot]
c8dfe10a7c Sanitized user-provided file names in HTTP multipart uploads 2024-02-01 23:48:27 +00:00
Anthony Stirling
c8481fdbef Merge pull request #768 from Stirling-Tools/pixeebot/drip-2024-02-01-pixee-java/sandbox-url-creation
Sandboxed URL creation to prevent SSRF attacks
2024-02-01 23:37:41 +00:00
pixeebot[bot]
8e0c02a151 Sandboxed URL creation to prevent SSRF attacks 2024-02-01 23:35:05 +00:00
Anthony Stirling
271906097d Merge pull request #767 from Stirling-Tools/pixeebot/drip-2024-02-01-pixee-java/harden-process-creation
Introduced protections against system command injection
2024-02-01 23:22:59 +00:00
pixeebot[bot]
91caa2a097 Introduced protections against system command injection 2024-02-01 23:18:24 +00:00
Anthony Stirling
6105451e08 Merge pull request #766 from Stirling-Tools/pixeebot/drip-2024-02-01-pixee-java/limit-readline
Protect `readLine()` against DoS
2024-02-01 23:05:22 +00:00
pixeebot[bot]
450e090252 Protect readLine() against DoS 2024-02-01 23:01:04 +00:00
Anthony Stirling
86635f85b4 Merge pull request #764 from Stirling-Tools/pixeebot/drip-2024-02-01-pixee-java/harden-zip-entry-paths
Introduced protections against "zip slip"  attacks
2024-02-01 22:50:55 +00:00
Anthony Stirling
a7214a2171 Merge branch 'main' into pixeebot/drip-2024-02-01-pixee-java/harden-zip-entry-paths 2024-02-01 22:46:16 +00:00
Anthony Stirling
61cd473e6c Merge pull request #763 from Stirling-Tools/Frooodle-patch-1
Frooodle patch 1
2024-02-01 22:45:59 +00:00
Anthony Stirling
d67690d995 Update build.gradle 2024-02-01 22:43:25 +00:00
pixeebot[bot]
e20f4fe31a Introduced protections against "zip slip" attacks 2024-02-01 22:41:49 +00:00
Anthony Stirling
2deb40bb6d Update build.gradle 2024-02-01 22:41:13 +00:00
Anthony Stirling
bfee745cca Update build.gradle 2024-02-01 22:40:36 +00:00
Anthony Stirling
68d390e633 Merge pull request #707 from tkymmm/main
Update messages_ja_JP.properties
2024-02-01 09:23:28 +00:00
Eric
a884f1b3d4 Merge branch 'main' into main 2024-02-01 00:13:14 -05:00
Eric
cda8f7b27d Merge pull request #758 from Stirling-Tools/watermark_newline
feat: support '\n' literal in add watermark
2024-01-31 12:56:16 -05:00
Eric
d524fcc157 Merge branch 'main' into watermark_newline 2024-01-31 12:55:29 -05:00
Eric
e05e34f217 Merge pull request #754 from Stirling-Tools/fix_extract_image
fix: infinite recursion in `ImageFinder`
2024-01-31 12:55:07 -05:00
Eric
73bbb516d2 Merge branch 'main' into fix_extract_image 2024-01-31 12:51:47 -05:00
Anthony Stirling
c2aaa65228 Merge pull request #755 from ProvaTeams/Add-required-attribute-to-input-file
Add required attribute to input file
2024-01-31 17:37:45 +00:00
Anthony Stirling
91722af8b0 Merge branch 'main' into Add-required-attribute-to-input-file 2024-01-31 17:20:35 +00:00
Eric
71d33f6047 Merge pull request #760 from Stirling-Tools/pr_template
misc: update pull request template
2024-01-31 11:39:03 -05:00
sbplat
903faadff3 misc: update pull request template 2024-01-31 11:04:40 -05:00
ProvaTeams
55020d45f8 Using the flag logic 2024-01-31 14:09:16 +00:00
sbplat
2d37c707e2 feat: support '\n' literal in add watermark 2024-01-31 00:54:51 -05:00
ProvaTeams
b00f8c80ec Add required attribute to input file 2024-01-29 19:13:57 +01:00
sbplat
53afb865c5 refactor: replace ImageFinder with getAllImages using strategy behind ExtractImagesController 2024-01-29 11:23:58 -05:00
Anthony Stirling
6f3e317484 Merge pull request #736 from michelheusschen/update-dutch-translation
Update dutch translation
2024-01-29 08:18:43 +00:00
Michel Heusschen
e77d2847ea add new translations 2024-01-29 07:49:02 +01:00
Michel Heusschen
46abae9acc Merge branch 'main' of https://github.com/michelheusschen/Stirling-PDF into update-dutch-translation 2024-01-29 07:27:28 +01:00
Michel Heusschen
9a06e7a3ca typo 2024-01-23 14:14:54 +01:00
Michel Heusschen
cb12af2d95 update Dutch (nl_NL) translation 2024-01-23 14:11:53 +01:00
tkymmm
ec5a3c5948 Update messages_ja_JP.properties
Updated Japanese translation.
2024-01-15 10:16:46 +09:00
Stirling-PDF-Bot
89c0e721b8 Update 3rd Party Licenses 2024-01-15 00:13:30 +00:00
55 changed files with 492 additions and 533 deletions

View File

@@ -1,4 +1,18 @@
# License Agreement for Contributions # Description
By submitting this pull request, I acknowledge and agree that my contributions will be included in Stirling-PDF and that they can be relicensed in the future under MPL 2.0 (Mozilla Public License Version 2.0) license.
Please provide a summary of the changes, including relevant motivation and context.
Closes #(issue_number)
## Checklist:
- [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] My changes generate no new warnings
## Contributor License Agreement
By submitting this pull request, I acknowledge and agree that my contributions will be included in Stirling-PDF and that they can be relicensed in the future under the MPL 2.0 (Mozilla Public License Version 2.0) license.
(This does not change the general open-source nature of Stirling-PDF, simply moving from one license to another license) (This does not change the general open-source nature of Stirling-PDF, simply moving from one license to another license)

View File

@@ -1,3 +0,0 @@
# License Agreement for Contributions
By submitting this pull request, I acknowledge and agree that my contributions will be included in Stirling-PDF and that they can be relicensed in the future under MPL 2.0 (Mozilla Public License Version 2.0) license.
(This does not change the open-source nature of Stirling-PDF, simply moving from one license to another license)

View File

@@ -1,18 +1,18 @@
plugins { plugins {
id 'java' id 'java'
id 'org.springframework.boot' version '3.2.1' id 'org.springframework.boot' version '3.2.2'
id 'io.spring.dependency-management' version '1.1.3' id 'io.spring.dependency-management' version '1.1.3'
id 'org.springdoc.openapi-gradle-plugin' version '1.8.0' id 'org.springdoc.openapi-gradle-plugin' version '1.8.0'
id "io.swagger.swaggerhub" version "1.3.2" id "io.swagger.swaggerhub" version "1.3.2"
id 'edu.sc.seis.launch4j' version '3.0.5' id 'edu.sc.seis.launch4j' version '3.0.5'
id 'com.diffplug.spotless' version '6.23.3' id 'com.diffplug.spotless' version '6.25.0'
id 'com.github.jk1.dependency-license-report' version '2.5' id 'com.github.jk1.dependency-license-report' version '2.5'
} }
import com.github.jk1.license.render.* import com.github.jk1.license.render.*
group = 'stirling.software' group = 'stirling.software'
version = '0.20.1' version = '0.20.2'
sourceCompatibility = '17' sourceCompatibility = '17'
repositories { repositories {
@@ -91,20 +91,22 @@ dependencies {
implementation 'ch.qos.logback:logback-core:1.4.14' implementation 'ch.qos.logback:logback-core:1.4.14'
implementation 'org.springframework:spring-webmvc:6.1.2' implementation 'org.springframework:spring-webmvc:6.1.2'
implementation("io.github.pixee:java-security-toolkit:1.1.2")
implementation 'org.yaml:snakeyaml:2.2' implementation 'org.yaml:snakeyaml:2.2'
implementation 'org.springframework.boot:spring-boot-starter-web:3.2.1' implementation 'org.springframework.boot:spring-boot-starter-web:3.2.2'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.2.1' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.2.2'
if (System.getenv('DOCKER_ENABLE_SECURITY') != 'false') { if (System.getenv('DOCKER_ENABLE_SECURITY') != 'false') {
implementation 'org.springframework.boot:spring-boot-starter-security:3.2.1' implementation 'org.springframework.boot:spring-boot-starter-security:3.2.2'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.2.RELEASE' implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.2.RELEASE'
implementation "org.springframework.boot:spring-boot-starter-data-jpa:3.2.1" implementation "org.springframework.boot:spring-boot-starter-data-jpa:3.2.2"
//2.2.x requires rebuild of DB file.. need migration path //2.2.x requires rebuild of DB file.. need migration path
implementation "com.h2database:h2:2.1.214" implementation "com.h2database:h2:2.1.214"
} }
testImplementation 'org.springframework.boot:spring-boot-starter-test:3.2.1' testImplementation 'org.springframework.boot:spring-boot-starter-test:3.2.2'
// Batik // Batik
implementation 'org.apache.xmlgraphics:batik-all:1.17' implementation 'org.apache.xmlgraphics:batik-all:1.17'
@@ -147,8 +149,8 @@ dependencies {
implementation 'org.bouncycastle:bcprov-jdk18on:1.77' implementation 'org.bouncycastle:bcprov-jdk18on:1.77'
implementation 'org.bouncycastle:bcpkix-jdk18on:1.77' implementation 'org.bouncycastle:bcpkix-jdk18on:1.77'
implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-actuator:3.2.2'
implementation 'io.micrometer:micrometer-core' implementation 'io.micrometer:micrometer-core:1.12.2'
implementation group: 'com.google.zxing', name: 'core', version: '3.5.2' implementation group: 'com.google.zxing', name: 'core', version: '3.5.2'
// https://mvnrepository.com/artifact/org.commonmark/commonmark // https://mvnrepository.com/artifact/org.commonmark/commonmark
implementation 'org.commonmark:commonmark:0.21.0' implementation 'org.commonmark:commonmark:0.21.0'
@@ -156,7 +158,7 @@ dependencies {
// https://mvnrepository.com/artifact/com.github.vladimir-bukhtoyarov/bucket4j-core // https://mvnrepository.com/artifact/com.github.vladimir-bukhtoyarov/bucket4j-core
implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:7.6.0' implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:7.6.0'
developmentOnly("org.springframework.boot:spring-boot-devtools") developmentOnly("org.springframework.boot:spring-boot-devtools:3.2.2")
compileOnly 'org.projectlombok:lombok:1.18.30' compileOnly 'org.projectlombok:lombok:1.18.30'
annotationProcessor 'org.projectlombok:lombok:1.18.28' annotationProcessor 'org.projectlombok:lombok:1.18.28'
} }

View File

@@ -16,7 +16,7 @@ public class PropSync {
Map<String, String> enProps = linesToProps(enLines); Map<String, String> enProps = linesToProps(enLines);
for (File file : files) { for (File file : files) {
if (!file.getName().equals("messages_en_GB.properties")) { if (!"messages_en_GB.properties".equals(file.getName())) {
System.out.println("Processing file: " + file.getName()); System.out.println("Processing file: " + file.getName());
List<String> lines; List<String> lines;
try { try {

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF; package stirling.software.SPDF;
import io.github.pixee.security.SystemCommand;
import java.io.IOException; import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.Socket; import java.net.Socket;
@@ -44,7 +45,7 @@ public class LibreOfficeListener {
} }
// Start the listener process // Start the listener process
process = Runtime.getRuntime().exec("unoconv --listener"); process = SystemCommand.runCommand(Runtime.getRuntime(), "unoconv --listener");
lastActivityTime = System.currentTimeMillis(); lastActivityTime = System.currentTimeMillis();
// Start a background thread to monitor the activity timeout // Start a background thread to monitor the activity timeout

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF; package stirling.software.SPDF;
import io.github.pixee.security.SystemCommand;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Collections; import java.util.Collections;
@@ -24,7 +25,7 @@ public class SPdfApplication {
public void init() { public void init() {
// Check if the BROWSER_OPEN environment variable is set to true // Check if the BROWSER_OPEN environment variable is set to true
String browserOpenEnv = env.getProperty("BROWSER_OPEN"); String browserOpenEnv = env.getProperty("BROWSER_OPEN");
boolean browserOpen = browserOpenEnv != null && browserOpenEnv.equalsIgnoreCase("true"); boolean browserOpen = browserOpenEnv != null && "true".equalsIgnoreCase(browserOpenEnv);
if (browserOpen) { if (browserOpen) {
try { try {
@@ -34,7 +35,7 @@ public class SPdfApplication {
Runtime rt = Runtime.getRuntime(); Runtime rt = Runtime.getRuntime();
if (os.contains("win")) { if (os.contains("win")) {
// For Windows // For Windows
rt.exec("rundll32 url.dll,FileProtocolHandler " + url); SystemCommand.runCommand(rt, "rundll32 url.dll,FileProtocolHandler " + url);
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();

View File

@@ -84,7 +84,7 @@ public class ConfigInitializer
for (String line : templateLines) { for (String line : templateLines) {
String key = extractKey.apply(line); String key = extractKey.apply(line);
if (line.trim().equalsIgnoreCase("AutomaticallyGenerated:")) { if ("AutomaticallyGenerated:".equalsIgnoreCase(line.trim())) {
insideAutoGenerated = true; insideAutoGenerated = true;
mergedLines.add(line); mergedLines.add(line);
continue; continue;

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api; package stirling.software.SPDF.controller.api;
import io.github.pixee.security.Filenames;
import java.awt.Color; import java.awt.Color;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
@@ -136,6 +137,6 @@ public class MultiPageLayoutController {
byte[] result = baos.toByteArray(); byte[] result = baos.toByteArray();
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
result, result,
file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_layoutChanged.pdf"); Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_layoutChanged.pdf");
} }
} }

View File

@@ -1,8 +1,10 @@
package stirling.software.SPDF.controller.api; package stirling.software.SPDF.controller.api;
import io.github.pixee.security.Filenames;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -75,7 +77,7 @@ public class PdfOverlayController {
overlay.overlay(overlayGuide).save(outputStream); overlay.overlay(overlayGuide).save(outputStream);
byte[] data = outputStream.toByteArray(); byte[] data = outputStream.toByteArray();
String outputFilename = String outputFilename =
baseFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") Filenames.toSimpleFileName(baseFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "")
+ "_overlayed.pdf"; // Remove file extension and append .pdf + "_overlayed.pdf"; // Remove file extension and append .pdf
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
@@ -135,7 +137,7 @@ public class PdfOverlayController {
try (PDDocument overlayPdf = Loader.loadPDF(overlayFiles[overlayFileIndex])) { try (PDDocument overlayPdf = Loader.loadPDF(overlayFiles[overlayFileIndex])) {
PDDocument singlePageDocument = new PDDocument(); PDDocument singlePageDocument = new PDDocument();
singlePageDocument.addPage(overlayPdf.getPage(pageCountInCurrentOverlay)); singlePageDocument.addPage(overlayPdf.getPage(pageCountInCurrentOverlay));
File tempFile = File.createTempFile("overlay-page-", ".pdf"); File tempFile = Files.createTempFile("overlay-page-", ".pdf").toFile();
singlePageDocument.save(tempFile); singlePageDocument.save(tempFile);
singlePageDocument.close(); singlePageDocument.close();

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api; package stirling.software.SPDF.controller.api;
import io.github.pixee.security.Filenames;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -57,7 +58,7 @@ public class RearrangePagesPDFController {
} }
return WebResponseUtils.pdfDocToWebResponse( return WebResponseUtils.pdfDocToWebResponse(
document, document,
pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_removed_pages.pdf"); Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_removed_pages.pdf");
} }
private List<Integer> removeFirst(int totalPages) { private List<Integer> removeFirst(int totalPages) {
@@ -211,7 +212,7 @@ public class RearrangePagesPDFController {
return WebResponseUtils.pdfDocToWebResponse( return WebResponseUtils.pdfDocToWebResponse(
document, document,
pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "")
+ "_rearranged.pdf"); + "_rearranged.pdf");
} catch (IOException e) { } catch (IOException e) {
logger.error("Failed rearranging documents", e); logger.error("Failed rearranging documents", e);

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api; package stirling.software.SPDF.controller.api;
import io.github.pixee.security.Filenames;
import java.io.IOException; import java.io.IOException;
import org.apache.pdfbox.Loader; import org.apache.pdfbox.Loader;
@@ -49,6 +50,6 @@ public class RotationController {
return WebResponseUtils.pdfDocToWebResponse( return WebResponseUtils.pdfDocToWebResponse(
document, document,
pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_rotated.pdf"); Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_rotated.pdf");
} }
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api; package stirling.software.SPDF.controller.api;
import io.github.pixee.security.Filenames;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
@@ -112,6 +113,6 @@ public class ScalePagesController {
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
baos.toByteArray(), baos.toByteArray(),
file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_scaled.pdf"); Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_scaled.pdf");
} }
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api; package stirling.software.SPDF.controller.api;
import io.github.pixee.security.Filenames;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
@@ -83,7 +84,7 @@ public class SplitPDFController {
Path zipFile = Files.createTempFile("split_documents", ".zip"); Path zipFile = Files.createTempFile("split_documents", ".zip");
String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "");
try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) {
// loop through the split documents and write them to the zip file // loop through the split documents and write them to the zip file
for (int i = 0; i < splitDocumentsBoas.size(); i++) { for (int i = 0; i < splitDocumentsBoas.size(); i++) {

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api; package stirling.software.SPDF.controller.api;
import io.github.pixee.security.Filenames;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
@@ -64,7 +65,7 @@ public class SplitPdfBySectionsController {
sourceDocument.close(); sourceDocument.close();
Path zipFile = Files.createTempFile("split_documents", ".zip"); Path zipFile = Files.createTempFile("split_documents", ".zip");
String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "");
byte[] data; byte[] data;
try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) {

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api; package stirling.software.SPDF.controller.api;
import io.github.pixee.security.Filenames;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
@@ -120,7 +121,7 @@ public class SplitPdfBySizeController {
sourceDocument.close(); sourceDocument.close();
Path zipFile = Files.createTempFile("split_documents", ".zip"); Path zipFile = Files.createTempFile("split_documents", ".zip");
String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "");
byte[] data; byte[] data;
try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) {

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.converters; package stirling.software.SPDF.controller.api.converters;
import io.github.pixee.security.Filenames;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -43,7 +44,7 @@ public class ConvertBookToPDFController {
throw new IllegalArgumentException("Please provide a file for conversion."); throw new IllegalArgumentException("Please provide a file for conversion.");
} }
String originalFilename = fileInput.getOriginalFilename(); String originalFilename = Filenames.toSimpleFileName(fileInput.getOriginalFilename());
if (originalFilename != null) { if (originalFilename != null) {
String originalFilenameLower = originalFilename.toLowerCase(); String originalFilenameLower = originalFilename.toLowerCase();

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.converters; package stirling.software.SPDF.controller.api.converters;
import io.github.pixee.security.Filenames;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -39,7 +40,7 @@ public class ConvertHtmlToPDF {
"Please provide an HTML or ZIP file for conversion."); "Please provide an HTML or ZIP file for conversion.");
} }
String originalFilename = fileInput.getOriginalFilename(); String originalFilename = Filenames.toSimpleFileName(fileInput.getOriginalFilename());
if (originalFilename == null if (originalFilename == null
|| (!originalFilename.endsWith(".html") && !originalFilename.endsWith(".zip"))) { || (!originalFilename.endsWith(".html") && !originalFilename.endsWith(".zip"))) {
throw new IllegalArgumentException("File must be either .html or .zip format."); throw new IllegalArgumentException("File must be either .html or .zip format.");

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.converters; package stirling.software.SPDF.controller.api.converters;
import io.github.pixee.security.Filenames;
import java.io.IOException; import java.io.IOException;
import java.net.URLConnection; import java.net.URLConnection;
@@ -54,9 +55,9 @@ public class ConvertImgPDFController {
colorTypeResult = ImageType.BINARY; colorTypeResult = ImageType.BINARY;
} }
// returns bytes for image // returns bytes for image
boolean singleImage = singleOrMultiple.equals("single"); boolean singleImage = "single".equals(singleOrMultiple);
byte[] result = null; byte[] result = null;
String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "");
try { try {
result = result =
PdfUtils.convertFromPdf( PdfUtils.convertFromPdf(
@@ -113,6 +114,6 @@ public class ConvertImgPDFController {
private String getMediaType(String imageFormat) { private String getMediaType(String imageFormat) {
String mimeType = URLConnection.guessContentTypeFromName("." + imageFormat); String mimeType = URLConnection.guessContentTypeFromName("." + imageFormat);
return mimeType.equals("null") ? "application/octet-stream" : mimeType; return "null".equals(mimeType) ? "application/octet-stream" : mimeType;
} }
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.converters; package stirling.software.SPDF.controller.api.converters;
import io.github.pixee.security.Filenames;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -48,7 +49,7 @@ public class ConvertMarkdownToPdf {
throw new IllegalArgumentException("Please provide a Markdown file for conversion."); throw new IllegalArgumentException("Please provide a Markdown file for conversion.");
} }
String originalFilename = fileInput.getOriginalFilename(); String originalFilename = Filenames.toSimpleFileName(fileInput.getOriginalFilename());
if (originalFilename == null || !originalFilename.endsWith(".md")) { if (originalFilename == null || !originalFilename.endsWith(".md")) {
throw new IllegalArgumentException("File must be in .md format."); throw new IllegalArgumentException("File must be in .md format.");
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.converters; package stirling.software.SPDF.controller.api.converters;
import io.github.pixee.security.Filenames;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
@@ -31,7 +32,7 @@ public class ConvertOfficeController {
public byte[] convertToPdf(MultipartFile inputFile) throws IOException, InterruptedException { public byte[] convertToPdf(MultipartFile inputFile) throws IOException, InterruptedException {
// Check for valid file extension // Check for valid file extension
String originalFilename = inputFile.getOriginalFilename(); String originalFilename = Filenames.toSimpleFileName(inputFile.getOriginalFilename());
if (originalFilename == null if (originalFilename == null
|| !isValidFileExtension(FilenameUtils.getExtension(originalFilename))) { || !isValidFileExtension(FilenameUtils.getExtension(originalFilename))) {
throw new IllegalArgumentException("Invalid file extension"); throw new IllegalArgumentException("Invalid file extension");
@@ -89,7 +90,7 @@ public class ConvertOfficeController {
byte[] pdfByteArray = convertToPdf(inputFile); byte[] pdfByteArray = convertToPdf(inputFile);
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
pdfByteArray, pdfByteArray,
inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "")
+ "_convertedToPDF.pdf"); + "_convertedToPDF.pdf");
} }
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.converters; package stirling.software.SPDF.controller.api.converters;
import io.github.pixee.security.Filenames;
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;
@@ -92,7 +93,7 @@ public class ConvertPDFToBookController {
} }
String outputFilename = String outputFilename =
fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") Filenames.toSimpleFileName(fileInput.getOriginalFilename()).replaceFirst("[.][^.]+$", "")
+ "." + "."
+ outputFormat; // Remove file extension and append .pdf + outputFormat; // Remove file extension and append .pdf

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.converters; package stirling.software.SPDF.controller.api.converters;
import io.github.pixee.security.Filenames;
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;
@@ -63,7 +64,7 @@ public class ConvertPDFToPDFA {
// Return the optimized PDF as a response // Return the optimized PDF as a response
String outputFilename = String outputFilename =
inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_PDFA.pdf"; Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_PDFA.pdf";
return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename);
} }
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.filters; package stirling.software.SPDF.controller.api.filters;
import io.github.pixee.security.Filenames;
import java.io.IOException; import java.io.IOException;
import org.apache.pdfbox.Loader; import org.apache.pdfbox.Loader;
@@ -43,7 +44,7 @@ public class FilterController {
PDDocument pdfDocument = Loader.loadPDF(inputFile.getBytes()); PDDocument pdfDocument = Loader.loadPDF(inputFile.getBytes());
if (PdfUtils.hasText(pdfDocument, pageNumber, text)) if (PdfUtils.hasText(pdfDocument, pageNumber, text))
return WebResponseUtils.pdfDocToWebResponse( return WebResponseUtils.pdfDocToWebResponse(
pdfDocument, inputFile.getOriginalFilename()); pdfDocument, Filenames.toSimpleFileName(inputFile.getOriginalFilename()));
return null; return null;
} }
@@ -60,7 +61,7 @@ public class FilterController {
PDDocument pdfDocument = Loader.loadPDF(inputFile.getBytes()); PDDocument pdfDocument = Loader.loadPDF(inputFile.getBytes());
if (PdfUtils.hasImages(pdfDocument, pageNumber)) if (PdfUtils.hasImages(pdfDocument, pageNumber))
return WebResponseUtils.pdfDocToWebResponse( return WebResponseUtils.pdfDocToWebResponse(
pdfDocument, inputFile.getOriginalFilename()); pdfDocument, Filenames.toSimpleFileName(inputFile.getOriginalFilename()));
return null; return null;
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import io.github.pixee.security.Filenames;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
@@ -133,7 +134,7 @@ public class AutoRenameController {
return WebResponseUtils.pdfDocToWebResponse(document, header + ".pdf"); return WebResponseUtils.pdfDocToWebResponse(document, header + ".pdf");
} else { } else {
logger.info("File has no good title to be found"); logger.info("File has no good title to be found");
return WebResponseUtils.pdfDocToWebResponse(document, file.getOriginalFilename()); return WebResponseUtils.pdfDocToWebResponse(document, Filenames.toSimpleFileName(file.getOriginalFilename()));
} }
} }
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import io.github.pixee.security.Filenames;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte; import java.awt.image.DataBufferByte;
import java.awt.image.DataBufferInt; import java.awt.image.DataBufferInt;
@@ -68,7 +69,9 @@ public class AutoSplitPdfController {
splitDocuments.add(new PDDocument()); splitDocuments.add(new PDDocument());
} }
if (!splitDocuments.isEmpty() && !QR_CONTENT.equals(result) && !QR_CONTENT_OLD.equals(result)) { if (!splitDocuments.isEmpty()
&& !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();
@@ -95,7 +98,7 @@ public class AutoSplitPdfController {
document.close(); document.close();
Path zipFile = Files.createTempFile("split_documents", ".zip"); Path zipFile = Files.createTempFile("split_documents", ".zip");
String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "");
byte[] data; byte[] data;
try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) {

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import io.github.pixee.security.Filenames;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
@@ -131,7 +132,7 @@ public class BlankPageController {
return WebResponseUtils.pdfDocToWebResponse( return WebResponseUtils.pdfDocToWebResponse(
document, document,
inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "")
+ "_blanksRemoved.pdf"); + "_blanksRemoved.pdf");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import io.github.pixee.security.Filenames;
import java.awt.Image; import java.awt.Image;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@@ -264,7 +265,7 @@ public class CompressController {
// Return the optimized PDF as a response // Return the optimized PDF as a response
String outputFilename = String outputFilename =
inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_Optimized.pdf"; Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_Optimized.pdf";
return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename);
} }
} }

View File

@@ -74,7 +74,7 @@ public class ExtractImageScansController {
List<String> images = new ArrayList<>(); List<String> images = new ArrayList<>();
// Check if input file is a PDF // Check if input file is a PDF
if (extension.equalsIgnoreCase("pdf")) { if ("pdf".equalsIgnoreCase(extension)) {
// Load PDF document // Load PDF document
try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) { try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) {
PDFRenderer pdfRenderer = new PDFRenderer(document); PDFRenderer pdfRenderer = new PDFRenderer(document);

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import io.github.pixee.security.Filenames;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Image; import java.awt.Image;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
@@ -66,7 +67,7 @@ public class ExtractImagesController {
zos.setLevel(Deflater.BEST_COMPRESSION); zos.setLevel(Deflater.BEST_COMPRESSION);
int imageIndex = 1; int imageIndex = 1;
String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "");
int pageNum = 0; int pageNum = 0;
Set<Integer> processedImages = new HashSet<>(); Set<Integer> processedImages = new HashSet<>();
// Iterate over each page // Iterate over each page
@@ -85,19 +86,19 @@ public class ExtractImagesController {
// Convert image to desired format // Convert image to desired format
RenderedImage renderedImage = image.getImage(); RenderedImage renderedImage = image.getImage();
BufferedImage bufferedImage = null; BufferedImage bufferedImage = null;
if (format.equalsIgnoreCase("png")) { if ("png".equalsIgnoreCase(format)) {
bufferedImage = bufferedImage =
new BufferedImage( new BufferedImage(
renderedImage.getWidth(), renderedImage.getWidth(),
renderedImage.getHeight(), renderedImage.getHeight(),
BufferedImage.TYPE_INT_ARGB); BufferedImage.TYPE_INT_ARGB);
} else if (format.equalsIgnoreCase("jpeg") || format.equalsIgnoreCase("jpg")) { } else if ("jpeg".equalsIgnoreCase(format) || "jpg".equalsIgnoreCase(format)) {
bufferedImage = bufferedImage =
new BufferedImage( new BufferedImage(
renderedImage.getWidth(), renderedImage.getWidth(),
renderedImage.getHeight(), renderedImage.getHeight(),
BufferedImage.TYPE_INT_RGB); BufferedImage.TYPE_INT_RGB);
} else if (format.equalsIgnoreCase("gif")) { } else if ("gif".equalsIgnoreCase(format)) {
bufferedImage = bufferedImage =
new BufferedImage( new BufferedImage(
renderedImage.getWidth(), renderedImage.getWidth(),

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import io.github.pixee.security.Filenames;
import java.awt.Color; import java.awt.Color;
import java.awt.geom.AffineTransform; import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp; import java.awt.image.AffineTransformOp;
@@ -141,7 +142,7 @@ public class FakeScanControllerWIP {
// Return the optimized PDF as a response // Return the optimized PDF as a response
String outputFilename = String outputFilename =
inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_scanned.pdf"; Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_scanned.pdf";
return WebResponseUtils.boasToWebResponse(baos, outputFilename); return WebResponseUtils.boasToWebResponse(baos, outputFilename);
} }
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import io.github.pixee.security.Filenames;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@@ -109,15 +110,15 @@ public class MetadataController {
for (Entry<String, String> entry : allRequestParams.entrySet()) { for (Entry<String, String> entry : allRequestParams.entrySet()) {
String key = entry.getKey(); String key = entry.getKey();
// Check if the key is a standard metadata key // Check if the key is a standard metadata key
if (!key.equalsIgnoreCase("Author") if (!"Author".equalsIgnoreCase(key)
&& !key.equalsIgnoreCase("CreationDate") && !"CreationDate".equalsIgnoreCase(key)
&& !key.equalsIgnoreCase("Creator") && !"Creator".equalsIgnoreCase(key)
&& !key.equalsIgnoreCase("Keywords") && !"Keywords".equalsIgnoreCase(key)
&& !key.equalsIgnoreCase("modificationDate") && !"modificationDate".equalsIgnoreCase(key)
&& !key.equalsIgnoreCase("Producer") && !"Producer".equalsIgnoreCase(key)
&& !key.equalsIgnoreCase("Subject") && !"Subject".equalsIgnoreCase(key)
&& !key.equalsIgnoreCase("Title") && !"Title".equalsIgnoreCase(key)
&& !key.equalsIgnoreCase("Trapped") && !"Trapped".equalsIgnoreCase(key)
&& !key.contains("customKey") && !key.contains("customKey")
&& !key.contains("customValue")) { && !key.contains("customValue")) {
info.setCustomMetadataValue(key, entry.getValue()); info.setCustomMetadataValue(key, entry.getValue());
@@ -164,6 +165,6 @@ public class MetadataController {
document.setDocumentInformation(info); document.setDocumentInformation(info);
return WebResponseUtils.pdfDocToWebResponse( return WebResponseUtils.pdfDocToWebResponse(
document, document,
pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_metadata.pdf"); Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_metadata.pdf");
} }
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import io.github.pixee.security.Filenames;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
@@ -74,7 +75,7 @@ public class OCRController {
throw new IOException("Please select at least one language."); throw new IOException("Please select at least one language.");
} }
if (!ocrRenderType.equals("hocr") && !ocrRenderType.equals("sandwich")) { if (!"hocr".equals(ocrRenderType) && !"sandwich".equals(ocrRenderType)) {
throw new IOException("ocrRenderType wrong"); throw new IOException("ocrRenderType wrong");
} }
@@ -127,7 +128,7 @@ public class OCRController {
if (cleanFinal != null && cleanFinal) { if (cleanFinal != null && cleanFinal) {
command.add("--clean-final"); command.add("--clean-final");
} }
if (ocrType != null && !ocrType.equals("")) { if (ocrType != null && !"".equals(ocrType)) {
if ("skip-text".equals(ocrType)) { if ("skip-text".equals(ocrType)) {
command.add("--skip-text"); command.add("--skip-text");
} else if ("force-ocr".equals(ocrType)) { } else if ("force-ocr".equals(ocrType)) {
@@ -182,12 +183,12 @@ public class OCRController {
// Return the OCR processed PDF as a response // Return the OCR processed PDF as a response
String outputFilename = String outputFilename =
inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_OCR.pdf"; Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_OCR.pdf";
if (sidecar != null && sidecar) { if (sidecar != null && sidecar) {
// Create a zip file containing both the PDF and the text file // Create a zip file containing both the PDF and the text file
String outputZipFilename = String outputZipFilename =
inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_OCR.zip"; Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_OCR.zip";
Path tempZipFile = Files.createTempFile("output_", ".zip"); Path tempZipFile = Files.createTempFile("output_", ".zip");
try (ZipOutputStream zipOut = try (ZipOutputStream zipOut =

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import io.github.pixee.security.Filenames;
import java.io.IOException; import java.io.IOException;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -44,7 +45,7 @@ public class OverlayImageController {
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
result, result,
pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_overlayed.pdf"); Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_overlayed.pdf");
} catch (IOException e) { } catch (IOException e) {
logger.error("Failed to add image to PDF", e); logger.error("Failed to add image to PDF", e);
return new ResponseEntity<>(HttpStatus.BAD_REQUEST); return new ResponseEntity<>(HttpStatus.BAD_REQUEST);

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import io.github.pixee.security.Filenames;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
@@ -93,7 +94,7 @@ public class PageNumbersController {
.replace("{total}", String.valueOf(document.getNumberOfPages())) .replace("{total}", String.valueOf(document.getNumberOfPages()))
.replace( .replace(
"{filename}", "{filename}",
file.getOriginalFilename() Filenames.toSimpleFileName(file.getOriginalFilename())
.replaceFirst("[.][^.]+$", "")) .replaceFirst("[.][^.]+$", ""))
: String.valueOf(pageNumber); : String.valueOf(pageNumber);
@@ -145,7 +146,7 @@ public class PageNumbersController {
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
baos.toByteArray(), baos.toByteArray(),
file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_numbersAdded.pdf", Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_numbersAdded.pdf",
MediaType.APPLICATION_PDF); MediaType.APPLICATION_PDF);
} }
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import io.github.pixee.security.Filenames;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
@@ -65,7 +66,7 @@ public class RepairController {
// Return the optimized PDF as a response // Return the optimized PDF as a response
String outputFilename = String outputFilename =
inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_repaired.pdf"; Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_repaired.pdf";
return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename);
} }
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import io.github.pixee.security.Filenames;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Map; import java.util.Map;
@@ -54,7 +55,7 @@ public class ShowJavascript {
script += script +=
"// File: " "// File: "
+ inputFile.getOriginalFilename() + Filenames.toSimpleFileName(inputFile.getOriginalFilename())
+ ", Script: " + ", Script: "
+ name + name
+ "\n" + "\n"

View File

@@ -1,11 +1,13 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import io.github.pixee.security.Filenames;
import java.awt.Color; import java.awt.Color;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.file.Files;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
@@ -94,7 +96,7 @@ public class StampController {
graphicsState.setNonStrokingAlphaConstant(opacity); graphicsState.setNonStrokingAlphaConstant(opacity);
contentStream.setGraphicsStateParameters(graphicsState); contentStream.setGraphicsStateParameters(graphicsState);
if (watermarkType.equalsIgnoreCase("text")) { if ("text".equalsIgnoreCase(watermarkType)) {
addTextStamp( addTextStamp(
contentStream, contentStream,
watermarkText, watermarkText,
@@ -108,7 +110,7 @@ public class StampController {
overrideY, overrideY,
marginFactor, marginFactor,
customColor); customColor);
} else if (watermarkType.equalsIgnoreCase("image")) { } else if ("image".equalsIgnoreCase(watermarkType)) {
addImageStamp( addImageStamp(
contentStream, contentStream,
watermarkImage, watermarkImage,
@@ -127,7 +129,7 @@ public class StampController {
return WebResponseUtils.pdfDocToWebResponse( return WebResponseUtils.pdfDocToWebResponse(
document, document,
pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_watermarked.pdf"); Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_watermarked.pdf");
} }
private void addTextStamp( private void addTextStamp(
@@ -165,10 +167,10 @@ public class StampController {
break; break;
} }
if (!resourceDir.equals("")) { if (!"".equals(resourceDir)) {
ClassPathResource classPathResource = new ClassPathResource(resourceDir); ClassPathResource classPathResource = new ClassPathResource(resourceDir);
String fileExtension = resourceDir.substring(resourceDir.lastIndexOf(".")); String fileExtension = resourceDir.substring(resourceDir.lastIndexOf("."));
File tempFile = File.createTempFile("NotoSansFont", fileExtension); File tempFile = Files.createTempFile("NotoSansFont", fileExtension).toFile();
try (InputStream is = classPathResource.getInputStream(); try (InputStream is = classPathResource.getInputStream();
FileOutputStream os = new FileOutputStream(tempFile)) { FileOutputStream os = new FileOutputStream(tempFile)) {
IOUtils.copy(is, os); IOUtils.copy(is, os);

View File

@@ -63,10 +63,7 @@ public class ApiDocService {
outputToFileTypes.put("PPT", Arrays.asList("ppt", "pptx", "odp")); outputToFileTypes.put("PPT", Arrays.asList("ppt", "pptx", "odp"));
outputToFileTypes.put("XML", Arrays.asList("xml", "xsd", "xsl")); outputToFileTypes.put("XML", Arrays.asList("xml", "xsd", "xsl"));
outputToFileTypes.put( outputToFileTypes.put(
"BOOK", "BOOK", Arrays.asList("epub", "mobi", "azw3", "fb2", "txt", "docx"));
Arrays.asList(
"epub", "mobi", "azw3", "fb2", "txt",
"docx"));
// type. // type.
} }

View File

@@ -1,5 +1,7 @@
package stirling.software.SPDF.controller.api.pipeline; package stirling.software.SPDF.controller.api.pipeline;
import io.github.pixee.security.Filenames;
import io.github.pixee.security.ZipSecurity;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
@@ -96,7 +98,7 @@ public class PipelineProcessor {
for (Resource file : outputFiles) { for (Resource file : outputFiles) {
boolean hasInputFileType = false; boolean hasInputFileType = false;
for (String extension : inputFileTypes) { for (String extension : inputFileTypes) {
if (extension.equals("ALL") || file.getFilename().endsWith(extension)) { if ("ALL".equals(extension) || file.getFilename().endsWith(extension)) {
hasInputFileType = true; hasInputFileType = true;
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>(); MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("fileInput", file); body.add("fileInput", file);
@@ -333,7 +335,7 @@ public class PipelineProcessor {
new ByteArrayResource(file.getBytes()) { new ByteArrayResource(file.getBytes()) {
@Override @Override
public String getFilename() { public String getFilename() {
return file.getOriginalFilename(); return Filenames.toSimpleFileName(file.getOriginalFilename());
} }
}; };
outputFiles.add(fileResource); outputFiles.add(fileResource);
@@ -356,7 +358,7 @@ public class PipelineProcessor {
List<Resource> unzippedFiles = new ArrayList<>(); List<Resource> unzippedFiles = new ArrayList<>();
try (ByteArrayInputStream bais = new ByteArrayInputStream(data); try (ByteArrayInputStream bais = new ByteArrayInputStream(data);
ZipInputStream zis = new ZipInputStream(bais)) { ZipInputStream zis = ZipSecurity.createHardenedInputStream(bais)) {
ZipEntry entry; ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) { while ((entry = zis.getNextEntry()) != null) {

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.security; package stirling.software.SPDF.controller.api.security;
import io.github.pixee.security.Filenames;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
@@ -123,7 +124,7 @@ public class CertSignController {
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
sign(pdf.getBytes(), baos, createSignature, name, location, reason); sign(pdf.getBytes(), baos, createSignature, name, location, reason);
return WebResponseUtils.boasToWebResponse( return WebResponseUtils.boasToWebResponse(
baos, pdf.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_signed.pdf"); baos, Filenames.toSimpleFileName(pdf.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_signed.pdf");
} }
private static void sign( private static void sign(

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.security; package stirling.software.SPDF.controller.api.security;
import io.github.pixee.security.Filenames;
import java.io.IOException; import java.io.IOException;
import org.apache.pdfbox.Loader; import org.apache.pdfbox.Loader;
@@ -43,7 +44,7 @@ public class PasswordController {
document.setAllSecurityToBeRemoved(true); document.setAllSecurityToBeRemoved(true);
return WebResponseUtils.pdfDocToWebResponse( return WebResponseUtils.pdfDocToWebResponse(
document, document,
fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") Filenames.toSimpleFileName(fileInput.getOriginalFilename()).replaceFirst("[.][^.]+$", "")
+ "_password_removed.pdf"); + "_password_removed.pdf");
} }
@@ -88,10 +89,10 @@ public class PasswordController {
if ("".equals(ownerPassword) && "".equals(password)) if ("".equals(ownerPassword) && "".equals(password))
return WebResponseUtils.pdfDocToWebResponse( return WebResponseUtils.pdfDocToWebResponse(
document, document,
fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") Filenames.toSimpleFileName(fileInput.getOriginalFilename()).replaceFirst("[.][^.]+$", "")
+ "_permissions.pdf"); + "_permissions.pdf");
return WebResponseUtils.pdfDocToWebResponse( return WebResponseUtils.pdfDocToWebResponse(
document, document,
fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_passworded.pdf"); Filenames.toSimpleFileName(fileInput.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_passworded.pdf");
} }
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.security; package stirling.software.SPDF.controller.api.security;
import io.github.pixee.security.Filenames;
import java.awt.Color; import java.awt.Color;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
@@ -104,7 +105,7 @@ public class RedactController {
byte[] pdfContent = baos.toByteArray(); byte[] pdfContent = baos.toByteArray();
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
pdfContent, pdfContent,
file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_redacted.pdf"); Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_redacted.pdf");
} }
private void redactFoundText( private void redactFoundText(

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.controller.api.security; package stirling.software.SPDF.controller.api.security;
import io.github.pixee.security.Filenames;
import java.io.IOException; import java.io.IOException;
import org.apache.pdfbox.Loader; import org.apache.pdfbox.Loader;
@@ -76,7 +77,7 @@ public class SanitizeController {
return WebResponseUtils.pdfDocToWebResponse( return WebResponseUtils.pdfDocToWebResponse(
document, document,
inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "")
+ "_sanitized.pdf"); + "_sanitized.pdf");
} }
} }

View File

@@ -1,11 +1,13 @@
package stirling.software.SPDF.controller.api.security; package stirling.software.SPDF.controller.api.security;
import io.github.pixee.security.Filenames;
import java.awt.Color; import java.awt.Color;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.file.Files;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
@@ -75,7 +77,7 @@ public class WatermarkController {
graphicsState.setNonStrokingAlphaConstant(opacity); graphicsState.setNonStrokingAlphaConstant(opacity);
contentStream.setGraphicsStateParameters(graphicsState); contentStream.setGraphicsStateParameters(graphicsState);
if (watermarkType.equalsIgnoreCase("text")) { if ("text".equalsIgnoreCase(watermarkType)) {
addTextWatermark( addTextWatermark(
contentStream, contentStream,
watermarkText, watermarkText,
@@ -86,7 +88,7 @@ public class WatermarkController {
heightSpacer, heightSpacer,
fontSize, fontSize,
alphabet); alphabet);
} else if (watermarkType.equalsIgnoreCase("image")) { } else if ("image".equalsIgnoreCase(watermarkType)) {
addImageWatermark( addImageWatermark(
contentStream, contentStream,
watermarkImage, watermarkImage,
@@ -104,7 +106,7 @@ public class WatermarkController {
return WebResponseUtils.pdfDocToWebResponse( return WebResponseUtils.pdfDocToWebResponse(
document, document,
pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_watermarked.pdf"); Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_watermarked.pdf");
} }
private void addTextWatermark( private void addTextWatermark(
@@ -139,10 +141,10 @@ public class WatermarkController {
break; break;
} }
if (!resourceDir.equals("")) { if (!"".equals(resourceDir)) {
ClassPathResource classPathResource = new ClassPathResource(resourceDir); ClassPathResource classPathResource = new ClassPathResource(resourceDir);
String fileExtension = resourceDir.substring(resourceDir.lastIndexOf(".")); String fileExtension = resourceDir.substring(resourceDir.lastIndexOf("."));
File tempFile = File.createTempFile("NotoSansFont", fileExtension); File tempFile = Files.createTempFile("NotoSansFont", fileExtension).toFile();
try (InputStream is = classPathResource.getInputStream(); try (InputStream is = classPathResource.getInputStream();
FileOutputStream os = new FileOutputStream(tempFile)) { FileOutputStream os = new FileOutputStream(tempFile)) {
IOUtils.copy(is, os); IOUtils.copy(is, os);
@@ -155,9 +157,16 @@ public class WatermarkController {
contentStream.setFont(font, fontSize); contentStream.setFont(font, fontSize);
contentStream.setNonStrokingColor(Color.LIGHT_GRAY); contentStream.setNonStrokingColor(Color.LIGHT_GRAY);
String[] textLines = watermarkText.split("\\\\n");
float maxLineWidth = 0;
for (int i = 0; i < textLines.length; ++i) {
maxLineWidth = Math.max(maxLineWidth, font.getStringWidth(textLines[i]));
}
// Set size and location of text watermark // Set size and location of text watermark
float watermarkWidth = widthSpacer + font.getStringWidth(watermarkText) * fontSize / 1000; float watermarkWidth = widthSpacer + maxLineWidth * fontSize / 1000;
float watermarkHeight = heightSpacer + fontSize; float watermarkHeight = heightSpacer + fontSize * textLines.length;
float pageWidth = page.getMediaBox().getWidth(); float pageWidth = page.getMediaBox().getWidth();
float pageHeight = page.getMediaBox().getHeight(); float pageHeight = page.getMediaBox().getHeight();
int watermarkRows = (int) (pageHeight / watermarkHeight + 1); int watermarkRows = (int) (pageHeight / watermarkHeight + 1);
@@ -172,7 +181,12 @@ public class WatermarkController {
(float) Math.toRadians(rotation), (float) Math.toRadians(rotation),
j * watermarkWidth, j * watermarkWidth,
i * watermarkHeight)); i * watermarkHeight));
contentStream.showText(watermarkText);
for (int k = 0; k < textLines.length; ++k) {
contentStream.showText(textLines[k]);
contentStream.newLineAtOffset(0, -fontSize);
}
contentStream.endText(); contentStream.endText();
} }
} }

View File

@@ -84,7 +84,7 @@ public class MetricsController {
for (Meter meter : meterRegistry.getMeters()) { for (Meter meter : meterRegistry.getMeters()) {
if (meter.getId().getName().equals("http.requests")) { if (meter.getId().getName().equals("http.requests")) {
String method = meter.getId().getTag("method"); String method = meter.getId().getTag("method");
if (method != null && method.equals("GET")) { if (method != null && "GET".equals(method)) {
if (endpoint.isPresent() && !endpoint.get().isBlank()) { if (endpoint.isPresent() && !endpoint.get().isBlank()) {
if (!endpoint.get().startsWith("/")) { if (!endpoint.get().startsWith("/")) {
@@ -129,7 +129,7 @@ public class MetricsController {
for (Meter meter : meterRegistry.getMeters()) { for (Meter meter : meterRegistry.getMeters()) {
if (meter.getId().getName().equals("http.requests")) { if (meter.getId().getName().equals("http.requests")) {
String method = meter.getId().getTag("method"); String method = meter.getId().getTag("method");
if (method != null && method.equals("GET")) { if (method != null && "GET".equals(method)) {
String uri = meter.getId().getTag("uri"); String uri = meter.getId().getTag("uri");
if (uri != null) { if (uri != null) {
double currentCount = counts.getOrDefault(uri, 0.0); double currentCount = counts.getOrDefault(uri, 0.0);
@@ -197,7 +197,7 @@ public class MetricsController {
for (Meter meter : meterRegistry.getMeters()) { for (Meter meter : meterRegistry.getMeters()) {
if (meter.getId().getName().equals("http.requests")) { if (meter.getId().getName().equals("http.requests")) {
String method = meter.getId().getTag("method"); String method = meter.getId().getTag("method");
if (method != null && method.equals("POST")) { if (method != null && "POST".equals(method)) {
if (endpoint.isPresent() && !endpoint.get().isBlank()) { if (endpoint.isPresent() && !endpoint.get().isBlank()) {
if (!endpoint.get().startsWith("/")) { if (!endpoint.get().startsWith("/")) {
endpoint = Optional.of("/" + endpoint.get()); endpoint = Optional.of("/" + endpoint.get());
@@ -235,7 +235,7 @@ public class MetricsController {
for (Meter meter : meterRegistry.getMeters()) { for (Meter meter : meterRegistry.getMeters()) {
if (meter.getId().getName().equals("http.requests")) { if (meter.getId().getName().equals("http.requests")) {
String method = meter.getId().getTag("method"); String method = meter.getId().getTag("method");
if (method != null && method.equals("POST")) { if (method != null && "POST".equals(method)) {
String uri = meter.getId().getTag("uri"); String uri = meter.getId().getTag("uri");
if (uri != null) { if (uri != null) {
double currentCount = counts.getOrDefault(uri, 0.0); double currentCount = counts.getOrDefault(uri, 0.0);

View File

@@ -1,131 +0,0 @@
package stirling.software.SPDF.pdf;
import java.awt.geom.Point2D;
import java.io.IOException;
import java.util.List;
import org.apache.pdfbox.contentstream.operator.Operator;
import org.apache.pdfbox.contentstream.operator.OperatorName;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
import org.apache.pdfbox.pdmodel.graphics.image.PDImage;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
public class ImageFinder extends org.apache.pdfbox.contentstream.PDFGraphicsStreamEngine {
private boolean hasImages = false;
public ImageFinder(PDPage page) {
super(page);
}
public boolean hasImages() {
return hasImages;
}
@Override
protected void processOperator(Operator operator, List<COSBase> operands) throws IOException {
String operation = operator.getName();
if (operation.equals(OperatorName.DRAW_OBJECT)) {
COSBase base = operands.get(0);
if (base instanceof COSName) {
COSName objectName = (COSName) base;
PDXObject xobject = getResources().getXObject(objectName);
if (xobject instanceof PDImageXObject) {
hasImages = true;
} else if (xobject instanceof PDFormXObject) {
PDFormXObject form = (PDFormXObject) xobject;
ImageFinder innerFinder = new ImageFinder(getPage());
innerFinder.processPage(getPage());
if (innerFinder.hasImages()) {
hasImages = true;
}
}
}
}
super.processOperator(operator, operands);
}
@Override
public void appendRectangle(Point2D p0, Point2D p1, Point2D p2, Point2D p3) throws IOException {
// TODO Auto-generated method stub
}
@Override
public void drawImage(PDImage pdImage) throws IOException {
// TODO Auto-generated method stub
}
@Override
public void clip(int windingRule) throws IOException {
// TODO Auto-generated method stub
}
@Override
public void moveTo(float x, float y) throws IOException {
// TODO Auto-generated method stub
}
@Override
public void lineTo(float x, float y) throws IOException {
// TODO Auto-generated method stub
}
@Override
public void curveTo(float x1, float y1, float x2, float y2, float x3, float y3)
throws IOException {
// TODO Auto-generated method stub
}
@Override
public Point2D getCurrentPoint() throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public void closePath() throws IOException {
// TODO Auto-generated method stub
}
@Override
public void endPath() throws IOException {
// TODO Auto-generated method stub
}
@Override
public void strokePath() throws IOException {
// TODO Auto-generated method stub
}
@Override
public void fillPath(int windingRule) throws IOException {
// TODO Auto-generated method stub
}
@Override
public void fillAndStrokePath(int windingRule) throws IOException {
// TODO Auto-generated method stub
}
@Override
public void shadingFill(COSName shadingName) throws IOException {
// TODO Auto-generated method stub
}
// ... rest of the overridden methods
}

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.utils; package stirling.software.SPDF.utils;
import io.github.pixee.security.ZipSecurity;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@@ -144,7 +145,7 @@ public class FileToPdf {
private static Path unzipAndGetMainHtml(byte[] fileBytes) throws IOException { private static Path unzipAndGetMainHtml(byte[] fileBytes) throws IOException {
Path tempDirectory = Files.createTempDirectory("unzipped_"); Path tempDirectory = Files.createTempDirectory("unzipped_");
try (ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(fileBytes))) { try (ZipInputStream zipIn = ZipSecurity.createHardenedInputStream(new ByteArrayInputStream(fileBytes))) {
ZipEntry entry = zipIn.getNextEntry(); ZipEntry entry = zipIn.getNextEntry();
while (entry != null) { while (entry != null) {
Path filePath = tempDirectory.resolve(entry.getName()); Path filePath = tempDirectory.resolve(entry.getName());
@@ -172,7 +173,7 @@ public class FileToPdf {
// Prioritize 'index.html' if it exists, otherwise use the first .html file // Prioritize 'index.html' if it exists, otherwise use the first .html file
for (Path htmlFile : htmlFiles) { for (Path htmlFile : htmlFiles) {
if (htmlFile.getFileName().toString().equals("index.html")) { if ("index.html".equals(htmlFile.getFileName().toString())) {
return htmlFile; return htmlFile;
} }
} }

View File

@@ -1,5 +1,7 @@
package stirling.software.SPDF.utils; package stirling.software.SPDF.utils;
import io.github.pixee.security.HostValidator;
import io.github.pixee.security.Urls;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
@@ -20,7 +22,7 @@ import org.springframework.web.multipart.MultipartFile;
public class GeneralUtils { public class GeneralUtils {
public static File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException { public static File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException {
File tempFile = File.createTempFile("temp", null); File tempFile = Files.createTempFile("temp", null).toFile();
try (FileOutputStream os = new FileOutputStream(tempFile)) { try (FileOutputStream os = new FileOutputStream(tempFile)) {
os.write(multipartFile.getBytes()); os.write(multipartFile.getBytes());
} }
@@ -57,7 +59,7 @@ public class GeneralUtils {
public static boolean isValidURL(String urlStr) { public static boolean isValidURL(String urlStr) {
try { try {
new URL(urlStr); Urls.create(urlStr, Urls.HTTP_PROTOCOLS, HostValidator.DENY_COMMON_INFRASTRUCTURE_TARGETS);
return true; return true;
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
return false; return false;
@@ -120,7 +122,7 @@ public class GeneralUtils {
// loop through the page order array // loop through the page order array
for (String element : pageOrderArr) { for (String element : pageOrderArr) {
if (element.equalsIgnoreCase("all")) { if ("all".equalsIgnoreCase(element)) {
for (int i = 0; i < totalPages; i++) { for (int i = 0; i < totalPages; i++) {
newPageOrder.add(i); newPageOrder.add(i);
} }
@@ -135,11 +137,11 @@ public class GeneralUtils {
if (element.contains("n")) { if (element.contains("n")) {
String[] parts = element.split("n"); String[] parts = element.split("n");
if (!parts[0].equals("") && parts[0] != null) { if (!"".equals(parts[0]) && parts[0] != null) {
coefficient = Integer.parseInt(parts[0]); coefficient = Integer.parseInt(parts[0]);
coefficientExists = true; coefficientExists = true;
} }
if (parts.length > 1 && !parts[1].equals("") && parts[1] != null) { if (parts.length > 1 && !"".equals(parts[1]) && parts[1] != null) {
constant = Integer.parseInt(parts[1]); constant = Integer.parseInt(parts[1]);
constantExists = true; constantExists = true;
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.utils; package stirling.software.SPDF.utils;
import io.github.pixee.security.Filenames;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@@ -32,7 +33,7 @@ public class PDFToFile {
} }
// Get the original PDF file name without the extension // Get the original PDF file name without the extension
String originalPdfFileName = inputFile.getOriginalFilename(); String originalPdfFileName = Filenames.toSimpleFileName(inputFile.getOriginalFilename());
String pdfBaseName = originalPdfFileName.substring(0, originalPdfFileName.lastIndexOf('.')); String pdfBaseName = originalPdfFileName.substring(0, originalPdfFileName.lastIndexOf('.'));
// Validate output format // Validate output format
@@ -87,7 +88,7 @@ public class PDFToFile {
if (outputFiles.size() == 1) { if (outputFiles.size() == 1) {
// Return single output file // Return single output file
File outputFile = outputFiles.get(0); File outputFile = outputFiles.get(0);
if (outputFormat.equals("txt:Text")) { if ("txt:Text".equals(outputFormat)) {
outputFormat = "txt"; outputFormat = "txt";
} }
fileName = pdfBaseName + "." + outputFormat; fileName = pdfBaseName + "." + outputFormat;

View File

@@ -1,9 +1,12 @@
package stirling.software.SPDF.utils; package stirling.software.SPDF.utils;
import io.github.pixee.security.Filenames;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@@ -16,11 +19,15 @@ import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream; import javax.imageio.stream.ImageOutputStream;
import org.apache.pdfbox.Loader; import org.apache.pdfbox.Loader;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode; import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory; import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
@@ -31,8 +38,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import stirling.software.SPDF.pdf.ImageFinder;
public class PdfUtils { public class PdfUtils {
private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class); private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class);
@@ -62,6 +67,23 @@ public class PdfUtils {
} }
} }
public static List<RenderedImage> getAllImages(PDResources resources) throws IOException {
List<RenderedImage> images = new ArrayList<>();
for (COSName name : resources.getXObjectNames()) {
PDXObject object = resources.getXObject(name);
if (object instanceof PDImageXObject) {
images.add(((PDImageXObject) object).getImage());
} else if (object instanceof PDFormXObject) {
images.addAll(getAllImages(((PDFormXObject) object).getResources()));
}
}
return images;
}
public static boolean hasImages(PDDocument document, String pagesToCheck) throws IOException { public static boolean hasImages(PDDocument document, String pagesToCheck) throws IOException {
String[] pageOrderArr = pagesToCheck.split(","); String[] pageOrderArr = pagesToCheck.split(",");
List<Integer> pageList = List<Integer> pageList =
@@ -94,9 +116,7 @@ public class PdfUtils {
} }
public static boolean hasImagesOnPage(PDPage page) throws IOException { public static boolean hasImagesOnPage(PDPage page) throws IOException {
ImageFinder imageFinder = new ImageFinder(page); return getAllImages(page.getResources()).size() > 0;
imageFinder.processPage(page);
return imageFinder.hasImages();
} }
public static boolean hasTextOnPage(PDPage page, String phrase) throws IOException { public static boolean hasTextOnPage(PDPage page, String phrase) throws IOException {
@@ -113,7 +133,7 @@ public class PdfUtils {
PDFTextStripper textStripper = new PDFTextStripper(); PDFTextStripper textStripper = new PDFTextStripper();
String pdfText = ""; String pdfText = "";
if (pagesToCheck == null || pagesToCheck.equals("all")) { if (pagesToCheck == null || "all".equals(pagesToCheck)) {
pdfText = textStripper.getText(pdfDocument); pdfText = textStripper.getText(pdfDocument);
} else { } else {
// remove whitespaces // remove whitespaces
@@ -199,8 +219,8 @@ public class PdfUtils {
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (singleImage) { if (singleImage) {
if (imageType.toLowerCase().equals("tiff") if ("tiff".equals(imageType.toLowerCase())
|| imageType.toLowerCase().equals("tif")) { || "tif".equals(imageType.toLowerCase())) {
// Write the images to the output stream as a TIFF with multiple frames // Write the images to the output stream as a TIFF with multiple frames
ImageWriter writer = ImageIO.getImageWritersByFormatName("tiff").next(); ImageWriter writer = ImageIO.getImageWritersByFormatName("tiff").next();
ImageWriteParam param = writer.getDefaultWriteParam(); ImageWriteParam param = writer.getDefaultWriteParam();
@@ -280,7 +300,7 @@ public class PdfUtils {
try (PDDocument doc = new PDDocument()) { try (PDDocument doc = new PDDocument()) {
for (MultipartFile file : files) { for (MultipartFile file : files) {
String contentType = file.getContentType(); String contentType = file.getContentType();
String originalFilename = file.getOriginalFilename(); String originalFilename = Filenames.toSimpleFileName(file.getOriginalFilename());
if (originalFilename != null if (originalFilename != null
&& (originalFilename.toLowerCase().endsWith(".tiff") && (originalFilename.toLowerCase().endsWith(".tiff")
|| originalFilename.toLowerCase().endsWith(".tif"))) { || originalFilename.toLowerCase().endsWith(".tif"))) {
@@ -301,7 +321,7 @@ public class PdfUtils {
ImageProcessingUtils.convertColorType(image, colorType); ImageProcessingUtils.convertColorType(image, colorType);
// Use JPEGFactory if it's JPEG since JPEG is lossy // Use JPEGFactory if it's JPEG since JPEG is lossy
PDImageXObject pdImage = PDImageXObject pdImage =
(contentType != null && contentType.equals("image/jpeg")) (contentType != null && "image/jpeg".equals(contentType))
? JPEGFactory.createFromImage(doc, convertedImage) ? JPEGFactory.createFromImage(doc, convertedImage)
: LosslessFactory.createFromImage(doc, convertedImage); : LosslessFactory.createFromImage(doc, convertedImage);
addImageToDocument(doc, pdImage, fitOption, autoRotate); addImageToDocument(doc, pdImage, fitOption, autoRotate);

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.utils; package stirling.software.SPDF.utils;
import io.github.pixee.security.BoundedLineReader;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@@ -109,7 +110,7 @@ public class ProcessExecutor {
process.getErrorStream(), process.getErrorStream(),
StandardCharsets.UTF_8))) { StandardCharsets.UTF_8))) {
String line; String line;
while ((line = errorReader.readLine()) != null) { while ((line = BoundedLineReader.readLine(errorReader, 5_000_000)) != null) {
errorLines.add(line); errorLines.add(line);
if (liveUpdates) logger.info(line); if (liveUpdates) logger.info(line);
} }
@@ -130,7 +131,7 @@ public class ProcessExecutor {
process.getInputStream(), process.getInputStream(),
StandardCharsets.UTF_8))) { StandardCharsets.UTF_8))) {
String line; String line;
while ((line = outputReader.readLine()) != null) { while ((line = BoundedLineReader.readLine(outputReader, 5_000_000)) != null) {
outputLines.add(line); outputLines.add(line);
if (liveUpdates) logger.info(line); if (liveUpdates) logger.info(line);
} }

View File

@@ -1,5 +1,6 @@
package stirling.software.SPDF.utils; package stirling.software.SPDF.utils;
import io.github.pixee.security.Filenames;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
@@ -26,7 +27,7 @@ public class WebResponseUtils {
public static ResponseEntity<byte[]> multiPartFileToWebResponse(MultipartFile file) public static ResponseEntity<byte[]> multiPartFileToWebResponse(MultipartFile file)
throws IOException { throws IOException {
String fileName = file.getOriginalFilename(); String fileName = Filenames.toSimpleFileName(file.getOriginalFilename());
MediaType mediaType = MediaType.parseMediaType(file.getContentType()); MediaType mediaType = MediaType.parseMediaType(file.getContentType());
byte[] bytes = file.getBytes(); byte[] bytes = file.getBytes();

View File

@@ -56,24 +56,24 @@ usernameExistsMessage=新しいユーザー名はすでに存在します。
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=パイプラインメニュー (Alpha)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Upload Custom
pipeline.configureButton=Configure pipeline.configureButton=設定
pipeline.defaultOption=Custom pipeline.defaultOption=カスタム
pipeline.submitButton=Submit pipeline.submitButton=送信
###################### ######################
# Pipeline Options # # Pipeline Options #
###################### ######################
pipelineOptions.header=Pipeline Configuration pipelineOptions.header=パイプライン設定
pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.pipelineNameLabel=パイプライン名
pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.saveSettings=動作設定の保存
pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.pipelineNamePrompt=ここにパイプライン名を入力
pipelineOptions.selectOperation=Select Operation pipelineOptions.selectOperation=Select Operation
pipelineOptions.addOperationButton=Add operation pipelineOptions.addOperationButton=動作の追加
pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.pipelineHeader=パイプライン:
pipelineOptions.saveButton=Download pipelineOptions.saveButton=ダウンロード
pipelineOptions.validateButton=Validate pipelineOptions.validateButton=検証
@@ -283,8 +283,8 @@ home.removeBlanks.title=空白ページの削除
home.removeBlanks.desc=ドキュメントから空白ページを検出して削除します。 home.removeBlanks.desc=ドキュメントから空白ページを検出して削除します。
removeBlanks.tags=cleanup,streamline,non-content,organize removeBlanks.tags=cleanup,streamline,non-content,organize
home.removeAnnotations.title=Remove Annotations home.removeAnnotations.title=注釈の削除
home.removeAnnotations.desc=Removes all comments/annotations from a PDF home.removeAnnotations.desc=PDFからすべてのコメント・注釈を削除します。
removeAnnotations.tags=comments,highlight,notes,markup,remove removeAnnotations.tags=comments,highlight,notes,markup,remove
home.compare.title=比較 home.compare.title=比較
@@ -368,22 +368,22 @@ home.autoRedact.title=自動塗りつぶし
home.autoRedact.desc=入力したテキストに基づいてPDF内のテキストを自動で塗りつぶし(黒塗り)します。 home.autoRedact.desc=入力したテキストに基づいてPDF内のテキストを自動で塗りつぶし(黒塗り)します。
showJS.tags=JS showJS.tags=JS
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDFをCSVに変換
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=PDFから表を抽出しCSVに変換します。
tableExtraxt.tags=CSV,Table Extraction,extract,convert tableExtraxt.tags=CSV,Table Extraction,extract,convert
home.autoSizeSplitPDF.title=Auto Split by Size/Count home.autoSizeSplitPDF.title=サイズ・数による自動分割
home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count home.autoSizeSplitPDF.desc=サイズ・ページ数またはドキュメント数に基づいて、1つのPDFを複数のドキュメントに分割します。
autoSizeSplitPDF.tags=pdf,split,document,organization autoSizeSplitPDF.tags=pdf,split,document,organization
home.overlay-pdfs.title=Overlay PDFs home.overlay-pdfs.title=PDFのオーバーレイ
home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF home.overlay-pdfs.desc=PDFの上に別のPDFを重ねます。
overlay-pdfs.tags=Overlay overlay-pdfs.tags=Overlay
home.split-by-sections.title=Split PDF by Sections home.split-by-sections.title=PDFをセクションで分割
home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections home.split-by-sections.desc=PDFの各ページを縦横に分割します。
split-by-sections.tags=Section Split, Divide, Customize split-by-sections.tags=Section Split, Divide, Customize
home.AddStampRequest.title=Add Stamp to PDF home.AddStampRequest.title=Add Stamp to PDF
@@ -609,8 +609,8 @@ removeBlanks.submit=空白ページの削除
#removeAnnotations #removeAnnotations
removeAnnotations.title=Remove Annotations removeAnnotations.title=注釈の削除
removeAnnotations.header=Remove Annotations removeAnnotations.header=注釈の削除
removeAnnotations.submit=Remove removeAnnotations.submit=Remove
@@ -918,54 +918,53 @@ PDFToXML.credit=本サービスはファイル変換にLibreOfficeを使用し
PDFToXML.submit=変換 PDFToXML.submit=変換
#PDFToCSV #PDFToCSV
PDFToCSV.title=PDF??CSV? PDFToCSV.title=PDFCSVに変換
PDFToCSV.header=PDF??CSV? PDFToCSV.header=PDFCSVに変換
PDFToCSV.prompt=Choose page to extract table PDFToCSV.prompt=表を抽出するページを選択
PDFToCSV.submit=???? PDFToCSV.submit=変換
#split-by-size-or-count #split-by-size-or-count
split-by-size-or-count.header=Split PDF by Size or Count split-by-size-or-count.header=サイズまたは数で分割
split-by-size-or-count.type.label=Select Split Type split-by-size-or-count.type.label=分割タイプの選択
split-by-size-or-count.type.size=By Size split-by-size-or-count.type.size=サイズ
split-by-size-or-count.type.pageCount=By Page Count split-by-size-or-count.type.pageCount=ページ数
split-by-size-or-count.type.docCount=By Document Count split-by-size-or-count.type.docCount=ドキュメント数
split-by-size-or-count.value.label=Enter Value split-by-size-or-count.value.label=値の入力
split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5) split-by-size-or-count.value.placeholder=サイズ (例、2MB または 3KB) または数値 (例、5) を入力
split-by-size-or-count.submit=Submit split-by-size-or-count.submit=分割
#overlay-pdfs #overlay-pdfs
overlay-pdfs.header=Overlay PDF Files overlay-pdfs.header=PDFのオーバーレイ
overlay-pdfs.baseFile.label=Select Base PDF File overlay-pdfs.baseFile.label=ベースのPDFを選択
overlay-pdfs.overlayFiles.label=Select Overlay PDF Files overlay-pdfs.overlayFiles.label=重ねるPDFを選択
overlay-pdfs.mode.label=Select Overlay Mode overlay-pdfs.mode.label=オーバーレイモードの選択
overlay-pdfs.mode.sequential=Sequential Overlay overlay-pdfs.mode.sequential=シーケンシャル・オーバーレイ
overlay-pdfs.mode.interleaved=Interleaved Overlay overlay-pdfs.mode.interleaved=インターリーブ・オーバーレイ
overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay overlay-pdfs.mode.fixedRepeat=固定リピート・オーバーレイ
overlay-pdfs.counts.label=Overlay Counts (for Fixed Repeat Mode) overlay-pdfs.counts.label=オーバーレイ回数 (固定リピートモード用)
overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1) overlay-pdfs.counts.placeholder=カンマ区切りでカウントを入力 (例、2,3,1)
overlay-pdfs.position.label=Select Overlay Position overlay-pdfs.position.label=重ね位置の選択
overlay-pdfs.position.foreground=Foreground overlay-pdfs.position.foreground=前面
overlay-pdfs.position.background=Background overlay-pdfs.position.background=背面
overlay-pdfs.submit=Submit overlay-pdfs.submit=重ねる
#split-by-sections #split-by-sections
split-by-sections.title=Split PDF by Sections split-by-sections.title=セクションごとにPDFを分割する
split-by-sections.header=Split PDF into Sections split-by-sections.header=PDFをセクションに分割
split-by-sections.horizontal.label=Horizontal Divisions split-by-sections.horizontal.label=水平方向
split-by-sections.vertical.label=Vertical Divisions split-by-sections.vertical.label=垂直方向
split-by-sections.horizontal.placeholder=Enter number of horizontal divisions split-by-sections.horizontal.placeholder=水平方向の分割数を選択
split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.vertical.placeholder=垂直方向の分割数を選択
split-by-sections.submit=Split PDF split-by-sections.submit=分割
#licenses #licenses
licenses.nav=Licenses licenses.nav=ライセンス
licenses.title=3rd Party Licenses licenses.title=サードパーティライセンス
licenses.header=3rd Party Licenses licenses.header=サードパーティライセンス
licenses.module=Module licenses.module=モジュール
licenses.version=Version licenses.version=バージョン
licenses.license=License licenses.license=ライセンス

View File

@@ -4,7 +4,7 @@
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
language.direction=ltr language.direction=ltr
pdfPrompt=Selecteer PDF(s) pdfPrompt=Selecteer PDF('s)
multiPdfPrompt=Selecteer PDFs (2+) multiPdfPrompt=Selecteer PDFs (2+)
multiPdfDropPrompt=Selecteer (of sleep & zet neer) alle PDFs die je nodig hebt multiPdfDropPrompt=Selecteer (of sleep & zet neer) alle PDFs die je nodig hebt
imgPrompt=Selecteer afbeelding(en) imgPrompt=Selecteer afbeelding(en)
@@ -29,51 +29,51 @@ pageNum=Paginanummer
sizes.small=Klein sizes.small=Klein
sizes.medium=Medium sizes.medium=Medium
sizes.large=Groot sizes.large=Groot
sizes.x-large=Extra Groot sizes.x-large=Extra groot
error.pdfPassword=Het PDF document is beveiligd met een wachtwoord en het wachtwoord is niet ingevoerd of was onjuist error.pdfPassword=Het PDF document is beveiligd met een wachtwoord en het wachtwoord is niet ingevoerd of is onjuist
delete=Verwijderen delete=Verwijderen
username=Gebruikersnaam username=Gebruikersnaam
password=Wachtwoord password=Wachtwoord
welcome=Welkom welcome=Welkom
property=Property property=Eigenschap
black=Black black=Zwart
white=White white=Wit
red=Red red=Rood
green=Green green=Groen
blue=Blue blue=Blauw
custom=Custom... custom=Aangepast...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Werk in uitvoering. Werkt mogelijk niet of bevat fouten. Meld eventuele problemen!
poweredBy=Powered by poweredBy=Mogelijk gemaakt door
yes=Yes yes=Ja
no=No no=Nee
changedCredsMessage=Credentials changed! changedCredsMessage=Inloggegevens gewijzigd!
notAuthenticatedMessage=User not authenticated. notAuthenticatedMessage=Gebruiker niet ingelogd.
userNotFoundMessage=User not found. userNotFoundMessage=Gebruiker niet gevonden.
incorrectPasswordMessage=Current password is incorrect. incorrectPasswordMessage=Huidige wachtwoord is onjuist.
usernameExistsMessage=New Username already exists. usernameExistsMessage=Nieuwe gebruikersnaam bestaat al.
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Pijplijn menu (Alpha)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Aangepast uploaden
pipeline.configureButton=Configure pipeline.configureButton=Configureren
pipeline.defaultOption=Custom pipeline.defaultOption=Aangepast
pipeline.submitButton=Submit pipeline.submitButton=Opslaan
###################### ######################
# Pipeline Options # # Pipeline Options #
###################### ######################
pipelineOptions.header=Pipeline Configuration pipelineOptions.header=Pijplijn onfiguratie
pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.pipelineNameLabel=Pijplijn naam
pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.saveSettings=Instellingen voor bewerking opslaan
pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.pipelineNamePrompt=Voer hier de naam van de pijplijn in
pipelineOptions.selectOperation=Select Operation pipelineOptions.selectOperation=Selecteer bewerking
pipelineOptions.addOperationButton=Add operation pipelineOptions.addOperationButton=Bewerking toevoegen
pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.pipelineHeader=Pijplijn:
pipelineOptions.saveButton=Download pipelineOptions.saveButton=Downloaden
pipelineOptions.validateButton=Validate pipelineOptions.validateButton=Valideren
@@ -85,7 +85,7 @@ navbar.convert=Converteren
navbar.security=Beveiliging navbar.security=Beveiliging
navbar.other=Overige navbar.other=Overige
navbar.darkmode=Donkere modus navbar.darkmode=Donkere modus
navbar.pageOps=Pagina operaties navbar.pageOps=Pagina bewerkingen
navbar.settings=Instellingen navbar.settings=Instellingen
############# #############
@@ -98,20 +98,20 @@ settings.downloadOption.title=Kies download optie (Voor enkelvoudige bestanddown
settings.downloadOption.1=Open in hetzelfde venster settings.downloadOption.1=Open in hetzelfde venster
settings.downloadOption.2=Open in nieuw venster settings.downloadOption.2=Open in nieuw venster
settings.downloadOption.3=Download bestand settings.downloadOption.3=Download bestand
settings.zipThreshold=Zip bestanden wanneer het aantal gedownloade bestanden overschrijdt settings.zipThreshold=Bestanden zippen wanneer het aantal gedownloade bestanden meer is dan
settings.signOut=Uitloggen settings.signOut=Uitloggen
settings.accountSettings=Account instellingen settings.accountSettings=Account instellingen
changeCreds.title=Change Credentials changeCreds.title=Inloggegevens wijzigen
changeCreds.header=Update Your Account Details changeCreds.header=Werk je accountgegevens bij
changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) changeCreds.changeUserAndPassword=Je gebruikt de standaard inloggegevens. Voer een nieuw wachtwoord in (en eventueel een gebruikersnaam)
changeCreds.newUsername=New Username changeCreds.newUsername=Nieuwe gebruikersnaam
changeCreds.oldPassword=Current Password changeCreds.oldPassword=Huidige wachtwoord
changeCreds.newPassword=New Password changeCreds.newPassword=Nieuw wachtwoord
changeCreds.confirmNewPassword=Confirm New Password changeCreds.confirmNewPassword=Bevestig nieuw wachtwoord
changeCreds.submit=Submit Changes changeCreds.submit=Wijzigingen opslaan
@@ -131,13 +131,13 @@ account.yourApiKey=Jouw API sleutel
account.syncTitle=Synchroniseer browserinstellingen met account account.syncTitle=Synchroniseer browserinstellingen met account
account.settingsCompare=Instellingen vergelijking: account.settingsCompare=Instellingen vergelijking:
account.property=Eigenschap account.property=Eigenschap
account.webBrowserSettings=Web Browser instelling account.webBrowserSettings=Webbrowser instelling
account.syncToBrowser=Synchroniseer account -> browser account.syncToBrowser=Synchroniseer account -> browser
account.syncToAccount=Synchroniseer account <- browser account.syncToAccount=Synchroniseer account <- browser
adminUserSettings.title=Gebruikerscontrole instellingen adminUserSettings.title=Gebruikersbeheer
adminUserSettings.header=Beheer Gebruikerscontrole instellingen adminUserSettings.header=Beheer gebruikers
adminUserSettings.admin=Beheerder adminUserSettings.admin=Beheerder
adminUserSettings.user=Gebruiker adminUserSettings.user=Gebruiker
adminUserSettings.addUser=Voeg nieuwe gebruiker toe adminUserSettings.addUser=Voeg nieuwe gebruiker toe
@@ -146,35 +146,35 @@ adminUserSettings.role=Rol
adminUserSettings.actions=Acties adminUserSettings.actions=Acties
adminUserSettings.apiUser=Beperkte API gebruiker adminUserSettings.apiUser=Beperkte API gebruiker
adminUserSettings.webOnlyUser=Alleen web gebruiker adminUserSettings.webOnlyUser=Alleen web gebruiker
adminUserSettings.demoUser=Demo User (No custom settings) adminUserSettings.demoUser=Demogebruiker (geen aangepaste instellingen)
adminUserSettings.forceChange=Force user to change username/password on login adminUserSettings.forceChange=Forceer gebruiker om gebruikersnaam/wachtwoord te wijzigen bij inloggen
adminUserSettings.submit=Sla gebruiker op adminUserSettings.submit=Gebruiker opslaan
############# #############
# HOME-PAGE # # HOME-PAGE #
############# #############
home.desc=Jouw lokaal gehoste one-stop-shop voor al je PDF-behoeften. home.desc=Jouw lokaal gehoste one-stop-shop voor al je PDF-behoeften.
home.searchBar=Search for features... home.searchBar=Zoeken naar functies...
home.viewPdf.title=View PDF home.viewPdf.title=PDF bekijken
home.viewPdf.desc=View, annotate, add text or images home.viewPdf.desc=Bekijk, annoteer, voeg tekst of afbeeldingen toe
viewPdf.tags=view,read,annotate,text,image viewPdf.tags=bekijken,lezen,annoteren,tekst,afbeelding
home.multiTool.title=PDF Multitool home.multiTool.title=PDF multitool
home.multiTool.desc=Samenvoegen, draaien, herschikken en pagina''s verwijderen home.multiTool.desc=Pagina's samenvoegen, draaien, herschikken en verwijderen
multiTool.tags=Multitool,Multi bewerking,UI,klik sleep,voorkant,clientzijde,interactief,beweegbaar,verplaats multiTool.tags=Multitool,Multi bewerking,UI,klik sleep,voorkant,clientzijde,interactief,beweegbaar,verplaats
home.merge.title=Samenvoegen home.merge.title=Samenvoegen
home.merge.desc=Voeg eenvoudig meerdere PDF''s samen tot één. home.merge.desc=Voeg eenvoudig meerdere PDF's samen tot één.
merge.tags=samenvoegen,Pagina operaties,Serverkant merge.tags=samenvoegen,Pagina bewerkingen,Serverkant
home.split.title=Splitsen home.split.title=Splitsen
home.split.desc=Splits PDF''s in meerdere documenten home.split.desc=Splits PDF's in meerdere documenten
split.tags=Pagina operaties,verdelen,meerdere pagina''s,knippen,serverzijde split.tags=Pagina bewerkingen,verdelen,meerdere pagina's,knippen,serverzijde
home.rotate.title=Roteren home.rotate.title=Roteren
home.rotate.desc=Roteer eenvoudig je PDF''s. home.rotate.desc=Roteer eenvoudig je PDF's.
rotate.tags=serverzijde rotate.tags=serverzijde
@@ -187,7 +187,7 @@ home.pdfToImage.desc=Converteer een PDF naar een afbeelding. (PNG, JPEG, GIF)
pdfToImage.tags=conversie,img,jpg,foto pdfToImage.tags=conversie,img,jpg,foto
home.pdfOrganiser.title=Organiseren home.pdfOrganiser.title=Organiseren
home.pdfOrganiser.desc=Verwijder/Herschik pagina''s in een volgorde naar keus home.pdfOrganiser.desc=Verwijder/herschik pagina's in een volgorde naar keus
pdfOrganiser.tags=duplex,even oneven,sorteren,verplaatsen pdfOrganiser.tags=duplex,even oneven,sorteren,verplaatsen
@@ -205,8 +205,8 @@ permissions.tags=lezen,schrijven,bewerken,printen
home.removePages.title=Verwijderen home.removePages.title=Verwijderen
home.removePages.desc=Verwijder ongewenste pagina''s uit je PDF-document. home.removePages.desc=Verwijder ongewenste pagina's uit je PDF-document.
removePages.tags=Pagina''s verwijderen removePages.tags=Pagina's verwijderen
home.addPassword.title=Wachtwoord toevoegen home.addPassword.title=Wachtwoord toevoegen
home.addPassword.desc=Versleutel je PDF-document met een wachtwoord. home.addPassword.desc=Versleutel je PDF-document met een wachtwoord.
@@ -222,7 +222,7 @@ compressPdfs.tags=comprimeren,klein
home.changeMetadata.title=Metadata wijzigen home.changeMetadata.title=Metadata wijzigen
home.changeMetadata.desc=Wijzig/Verwijder/Voeg metadata toe van een PDF-document home.changeMetadata.desc=Wijzig/verwijder/voeg metadata toe van een PDF-document
changeMetadata.tags=Titel,auteur,datum,creatie,tijd,uitgever,producent,statistieken changeMetadata.tags=Titel,auteur,datum,creatie,tijd,uitgever,producent,statistieken
home.fileToPDF.title=Bestand naar PDF converteren home.fileToPDF.title=Bestand naar PDF converteren
@@ -263,8 +263,8 @@ home.PDFToXML.title=PDF naar XML
home.PDFToXML.desc=Converteer PDF naar XML formaat home.PDFToXML.desc=Converteer PDF naar XML formaat
PDFToXML.tags=data-extractie,gestructureerd,code PDFToXML.tags=data-extractie,gestructureerd,code
home.ScannerImageSplit.title=Detecteer/Split gescande foto''s home.ScannerImageSplit.title=Detecteer/Split gescande foto's
home.ScannerImageSplit.desc=Splits meerdere foto''s van binnen een foto/PDF home.ScannerImageSplit.desc=Splits meerdere foto's van binnen een foto/PDF
ScannerImageSplit.tags=scheiden,auto-detecteren,scans,meer-foto,organiseren ScannerImageSplit.tags=scheiden,auto-detecteren,scans,meer-foto,organiseren
home.sign.title=Ondertekenen home.sign.title=Ondertekenen
@@ -279,16 +279,16 @@ home.repair.title=Repareren
home.repair.desc=Probeert een corrupt/beschadigd PDF te herstellen home.repair.desc=Probeert een corrupt/beschadigd PDF te herstellen
repair.tags=repareren,herstellen,correctie,terughalen repair.tags=repareren,herstellen,correctie,terughalen
home.removeBlanks.title=Verwijder lege pagina''s home.removeBlanks.title=Verwijder lege pagina's
home.removeBlanks.desc=Detecteert en verwijdert lege pagina''s uit een document home.removeBlanks.desc=Detecteert en verwijdert lege pagina's uit een document
removeBlanks.tags=opruimen,stroomlijnen,geen-inhoud,organiseren removeBlanks.tags=opruimen,stroomlijnen,geen-inhoud,organiseren
home.removeAnnotations.title=Remove Annotations home.removeAnnotations.title=Annotaties verwijderen
home.removeAnnotations.desc=Removes all comments/annotations from a PDF home.removeAnnotations.desc=Verwijdert alle opmerkingen/annotaties uit een PDF
removeAnnotations.tags=comments,highlight,notes,markup,remove removeAnnotations.tags=opmerkingen,highlight,notities,opmaak,verwijderen
home.compare.title=Vergelijken home.compare.title=Vergelijken
home.compare.desc=Vergelijkt en toont de verschillen tussen 2 PDF-documenten home.compare.desc=Vergelijkt en toont de verschillen tussen twee PDF-documenten
compare.tags=onderscheiden,contrasteren,veranderingen,analyse compare.tags=onderscheiden,contrasteren,veranderingen,analyse
home.certSign.title=Ondertekenen met certificaat home.certSign.title=Ondertekenen met certificaat
@@ -296,7 +296,7 @@ home.certSign.desc=Ondertekent een PDF met een certificaat/sleutel (PEM/P12)
certSign.tags=authenticeren,PEM,P12,officieel,versleutelen certSign.tags=authenticeren,PEM,P12,officieel,versleutelen
home.pageLayout.title=Multi-pagina indeling home.pageLayout.title=Multi-pagina indeling
home.pageLayout.desc=Voeg meerdere pagina''s van een PDF-document samen op één pagina home.pageLayout.desc=Voeg meerdere pagina's van een PDF-document samen op één pagina
pageLayout.tags=samenvoegen,composiet,enkel-zicht,organiseren pageLayout.tags=samenvoegen,composiet,enkel-zicht,organiseren
home.scalePages.title=Aanpassen paginaformaat/schaal home.scalePages.title=Aanpassen paginaformaat/schaal
@@ -304,7 +304,7 @@ home.scalePages.desc=Wijzig de grootte/schaal van een pagina en/of de inhoud erv
scalePages.tags=resize,aanpassen,dimensie,aanpassen scalePages.tags=resize,aanpassen,dimensie,aanpassen
home.pipeline.title=Pijplijn (Geavanceerd) home.pipeline.title=Pijplijn (Geavanceerd)
home.pipeline.desc=Voer meerdere acties uit op PDF''s door pipelinescripts te definiëren home.pipeline.desc=Voer meerdere acties uit op PDF's door pipelinescripts te definiëren
pipeline.tags=automatiseren,volgorde,gescrript,batch-verwerking pipeline.tags=automatiseren,volgorde,gescrript,batch-verwerking
home.add-page-numbers.title=Paginanummers toevoegen home.add-page-numbers.title=Paginanummers toevoegen
@@ -315,15 +315,15 @@ home.auto-rename.title=Automatisch hernoemen PDF-bestand
home.auto-rename.desc=Hernoemt automatisch een PDF-bestand op basis van de gedetecteerde header home.auto-rename.desc=Hernoemt automatisch een PDF-bestand op basis van de gedetecteerde header
auto-rename.tags=auto-detecteren,op-header-gebaseerd,organiseren,herlabelen auto-rename.tags=auto-detecteren,op-header-gebaseerd,organiseren,herlabelen
home.adjust-contrast.title=Kleuren/Contrast aanpassen home.adjust-contrast.title=Kleuren/contrast aanpassen
home.adjust-contrast.desc=Pas Contrast, Verzadiging en Helderheid van een PDF aan home.adjust-contrast.desc=Pas contrast, verzadiging en helderheid van een PDF aan
adjust-contrast.tags=kleur-correctie,afstemmen,aanpassen,verbeteren adjust-contrast.tags=kleur-correctie,afstemmen,aanpassen,verbeteren
home.crop.title=PDF bijsnijden home.crop.title=PDF bijsnijden
home.crop.desc=Snijd een PDF bij om de grootte te verkleinen (behoudt tekst!) home.crop.desc=Snijd een PDF bij om de grootte te verkleinen (behoudt tekst!)
crop.tags=trimmen,verkleinen,bewerken,vorm crop.tags=trimmen,verkleinen,bewerken,vorm
home.autoSplitPDF.title=Automatisch splitsen pagina''s home.autoSplitPDF.title=Automatisch splitsen pagina's
home.autoSplitPDF.desc=Automatisch splitsen van gescande PDF met fysieke gescande paginasplitter QR-code home.autoSplitPDF.desc=Automatisch splitsen van gescande PDF met fysieke gescande paginasplitter QR-code
autoSplitPDF.tags=QR-gebaseerd,scheiden,scan-segment,organiseren autoSplitPDF.tags=QR-gebaseerd,scheiden,scan-segment,organiseren
@@ -331,7 +331,7 @@ home.sanitizePdf.title=Opschonen
home.sanitizePdf.desc=Verwijder scripts en andere elementen uit PDF-bestanden home.sanitizePdf.desc=Verwijder scripts en andere elementen uit PDF-bestanden
sanitizePdf.tags=schoonmaken,veilig,veilig,bedreigingen verwijderen sanitizePdf.tags=schoonmaken,veilig,veilig,bedreigingen verwijderen
home.URLToPDF.title=URL/Website naar PDF home.URLToPDF.title=URL/website naar PDF
home.URLToPDF.desc=Zet http(s)URL om naar PDF home.URLToPDF.desc=Zet http(s)URL om naar PDF
URLToPDF.tags=web-capture,pagina opslaan,web-naar-doc,archief URLToPDF.tags=web-capture,pagina opslaan,web-naar-doc,archief
@@ -346,17 +346,17 @@ MarkdownToPDF.tags=markup,web-inhoud,transformatie,omzetten
home.getPdfInfo.title=Haal ALLE informatie op over PDF home.getPdfInfo.title=Haal ALLE informatie op over PDF
home.getPdfInfo.desc=Haalt alle mogelijke informatie op van PDF''s home.getPdfInfo.desc=Haalt alle mogelijke informatie op van PDF's
getPdfInfo.tags=informatie,data,statistieken getPdfInfo.tags=informatie,data,statistieken
home.extractPage.title=Pagina(''s) extraheren home.extractPage.title=Pagina('s) extraheren
home.extractPage.desc=Extraheert geselecteerde pagina''s uit PDF home.extractPage.desc=Extraheert geselecteerde pagina's uit PDF
extractPage.tags=extraheren extractPage.tags=extraheren
home.PdfToSinglePage.title=PDF naar één grote pagina home.PdfToSinglePage.title=PDF naar één grote pagina
home.PdfToSinglePage.desc=Voegt alle PDF-pagina''s samen tot één grote pagina home.PdfToSinglePage.desc=Voegt alle PDF-pagina's samen tot één grote pagina
PdfToSinglePage.tags=één pagina PdfToSinglePage.tags=één pagina
@@ -364,31 +364,31 @@ home.showJS.title=Toon Javascript
home.showJS.desc=Zoekt en toont ieder script dat in een PDF is geïnjecteerd home.showJS.desc=Zoekt en toont ieder script dat in een PDF is geïnjecteerd
showJS.tags=JS showJS.tags=JS
home.autoRedact.title=Auto Redact home.autoRedact.title=Automatisch censureren
home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text home.autoRedact.desc=Automatisch censureren (onherkenbaar maken) van tekst in een PDF op basis van ingevoerde tekst
showJS.tags=JS showJS.tags=JS
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF naar CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Haalt tabellen uit een PDF en converteert ze naar CSV
tableExtraxt.tags=CSV,Table Extraction,extract,convert tableExtraxt.tags=CSV,tabel extractie,extractie,converteren
home.autoSizeSplitPDF.title=Auto Split by Size/Count home.autoSizeSplitPDF.title=Automatisch splitsen op grootte/aantal
home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count home.autoSizeSplitPDF.desc=Splits een enkele PDF in meerdere documenten op basis van grootte, aantal pagina's of aantal documenten
autoSizeSplitPDF.tags=pdf,split,document,organization autoSizeSplitPDF.tags=pdf,splitsen,document,organiseren
home.overlay-pdfs.title=Overlay PDFs home.overlay-pdfs.title=PDF's overlappen
home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF home.overlay-pdfs.desc=Plaatst PDF's over een andere PDF heen
overlay-pdfs.tags=Overlay overlay-pdfs.tags=Overlappen
home.split-by-sections.title=Split PDF by Sections home.split-by-sections.title=PDF in secties splitsen
home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections home.split-by-sections.desc=Verdeel elke pagina van een PDF in kleinere horizontale en verticale secties
split-by-sections.tags=Section Split, Divide, Customize split-by-sections.tags=Sectie splitsen, Verdelen, Aanpassen
home.AddStampRequest.title=Add Stamp to PDF home.AddStampRequest.title=Stempel toevoegen aan PDF
home.AddStampRequest.desc=Add text or add image stamps at set locations home.AddStampRequest.desc=Voeg tekst of afbeeldingsstempels toe op vaste locaties
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize AddStampRequest.tags=Stempel, Afbeelding toevoegen, afbeelding centreren, watermerk, PDF, Insluiten, Aanpassen
########################### ###########################
@@ -397,25 +397,25 @@ AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Cust
# # # #
########################### ###########################
#login #login
login.title=Sign in login.title=Inloggen
login.signin=Sign in login.signin=Inloggen
login.rememberme=Remember me login.rememberme=Onthoud mij
login.invalid=Invalid username or password. login.invalid=Ongeldige gebruikersnaam of wachtwoord.
login.locked=Your account has been locked. login.locked=Je account is geblokkeerd.
login.signinTitle=Please sign in login.signinTitle=Gelieve in te loggen
#auto-redact #auto-redact
autoRedact.title=Auto Redact autoRedact.title=Automatisch censureren
autoRedact.header=Auto Redact autoRedact.header=Automatisch censureren
autoRedact.colorLabel=Colour autoRedact.colorLabel=Kleur
autoRedact.textsToRedactLabel=Text to Redact (line-separated) autoRedact.textsToRedactLabel=Tekst om te censureren (gescheiden door regels)
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret autoRedact.textsToRedactPlaceholder=bijv.\Vertrouwelijk \nTopgeheim
autoRedact.useRegexLabel=Use Regex autoRedact.useRegexLabel=Gebruik regex
autoRedact.wholeWordSearchLabel=Whole Word Search autoRedact.wholeWordSearchLabel=Zoeken op hele woorden
autoRedact.customPaddingLabel=Custom Extra Padding autoRedact.customPaddingLabel=Aangepaste extra ruimtevulling
autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) autoRedact.convertPDFToImageLabel=Converteer PDF naar PDF-afbeelding (wordt gebruikt om tekst achter het vak te verwijderen)
autoRedact.submitButton=Submit autoRedact.submitButton=Indienen
#showJS #showJS
@@ -432,8 +432,8 @@ pdfToSinglePage.submit=Converteren naar enkele pagina
#pageExtracter #pageExtracter
pageExtracter.title=Pagina''s extraheren pageExtracter.title=Pagina's extraheren
pageExtracter.header=Pagina''s extraheren pageExtracter.header=Pagina's extraheren
pageExtracter.submit=Extraheren pageExtracter.submit=Extraheren
@@ -463,40 +463,40 @@ URLToPDF.credit=Gebruikt WeasyPrint
#html-to-pdf #html-to-pdf
HTMLToPDF.title=HTML naar PDF HTMLToPDF.title=HTML naar PDF
HTMLToPDF.header=HTML naar PDF HTMLToPDF.header=HTML naar PDF
HTMLToPDF.help=Accepteert HTML-bestanden en ZIP''s die html/css/afbeeldingen etc. bevatten HTMLToPDF.help=Accepteert HTML-bestanden en ZIP's die html/css/afbeeldingen etc. bevatten
HTMLToPDF.submit=Converteren HTMLToPDF.submit=Converteren
HTMLToPDF.credit=Gebruikt WeasyPrint HTMLToPDF.credit=Gebruikt WeasyPrint
HTMLToPDF.zoom=Zoom level for displaying the website. HTMLToPDF.zoom=Zoom level for displaying the website.
HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) HTMLToPDF.pageWidth=Breedte van de pagina in centimeters. (leeg voor standaard)
HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) HTMLToPDF.pageHeight=Hoogte van de pagina in centimeters. (leeg voor standaard)
HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) HTMLToPDF.marginTop=Marge bovenaan de pagina in millimeters. (leeg voor standaard)
HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) HTMLToPDF.marginBottom=Marge onderaan de pagina in millimeters. (leeg voor standaard)
HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) HTMLToPDF.marginLeft=Marge links van de pagina in millimeters. (leeg voor standaard)
HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) HTMLToPDF.marginRight=Marge rechts van de pagina in millimeters. (leeg voor standaard)
HTMLToPDF.printBackground=Render the background of websites. HTMLToPDF.printBackground=De achtergrond van websites weergeven.
HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) HTMLToPDF.defaultHeader=Standaard koptekst weergeven (naam en paginanummer)
HTMLToPDF.cssMediaType=Change the CSS media type of the page. HTMLToPDF.cssMediaType=Wijzig het CSS-mediatype van de pagina.
HTMLToPDF.none=None HTMLToPDF.none=Geen
HTMLToPDF.print=Print HTMLToPDF.print=Print
HTMLToPDF.screen=Screen HTMLToPDF.screen=Screen
#AddStampRequest #AddStampRequest
AddStampRequest.header=Stamp PDF AddStampRequest.header=Stempel PDF
AddStampRequest.title=Stamp PDF AddStampRequest.title=Stempel PDF
AddStampRequest.stampType=Stamp Type AddStampRequest.stampType=Soort stempel
AddStampRequest.stampText=Stamp Text AddStampRequest.stampText=Stempel tekst
AddStampRequest.stampImage=Stamp Image AddStampRequest.stampImage=Stempel afbeelding
AddStampRequest.alphabet=Alphabet AddStampRequest.alphabet=Alfabet
AddStampRequest.fontSize=Font/Image Size AddStampRequest.fontSize=Tekst/afbeelding grootte
AddStampRequest.rotation=Rotation AddStampRequest.rotation=Rotatie
AddStampRequest.opacity=Opacity AddStampRequest.opacity=Transparantie
AddStampRequest.position=Position AddStampRequest.position=Positie
AddStampRequest.overrideX=Override X Coordinate AddStampRequest.overrideX=X coördinaat overschrijven
AddStampRequest.overrideY=Override Y Coordinate AddStampRequest.overrideY=Y coördinaat overschrijven
AddStampRequest.customMargin=Custom Margin AddStampRequest.customMargin=Aangepate marge
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Aangepaste tekstkleur
AddStampRequest.submit=Submit AddStampRequest.submit=Indienen
#sanitizePDF #sanitizePDF
sanitizePDF.title=PDF opschonen sanitizePDF.title=PDF opschonen
@@ -516,11 +516,11 @@ addPageNumbers.selectText.1=Selecteer PDF-bestand:
addPageNumbers.selectText.2=Margegrootte addPageNumbers.selectText.2=Margegrootte
addPageNumbers.selectText.3=Positie addPageNumbers.selectText.3=Positie
addPageNumbers.selectText.4=Startnummer addPageNumbers.selectText.4=Startnummer
addPageNumbers.selectText.5=Pagina''s om te nummeren addPageNumbers.selectText.5=Pagina's om te nummeren
addPageNumbers.selectText.6=Aangepaste tekst addPageNumbers.selectText.6=Aangepaste tekst
addPageNumbers.customTextDesc=Custom Text addPageNumbers.customTextDesc=Aangepaste tekst
addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc addPageNumbers.numberPagesDesc=Welke pagina's genummerd moeten worden, standaard 'all', accepteert ook 1-5 of 2,5,9 etc
addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} addPageNumbers.customNumberDesc=Standaard {n}, accepteert ook 'Pagina {n} van {total}', 'Tekst-{n}', '{filename}-{n}
addPageNumbers.submit=Paginanummers toevoegen addPageNumbers.submit=Paginanummers toevoegen
@@ -552,7 +552,7 @@ autoSplitPDF.description=Print, Voeg in, Scan, upload, en laat ons je documenten
autoSplitPDF.selectText.1=Print enkele scheidingsbladen van hieronder (Zwart-wit is prima). autoSplitPDF.selectText.1=Print enkele scheidingsbladen van hieronder (Zwart-wit is prima).
autoSplitPDF.selectText.2=Scan al je documenten tegelijk door het scheidingsblad ertussen te plaatsen. autoSplitPDF.selectText.2=Scan al je documenten tegelijk door het scheidingsblad ertussen te plaatsen.
autoSplitPDF.selectText.3=Upload het enkele grote gescande PDF-bestand en laat Stirling PDF de rest afhandelen. autoSplitPDF.selectText.3=Upload het enkele grote gescande PDF-bestand en laat Stirling PDF de rest afhandelen.
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.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
@@ -567,8 +567,8 @@ pipeline.title=Pijplijn
#pageLayout #pageLayout
pageLayout.title=Meerdere pagina indeling pageLayout.title=Meerdere pagina indeling
pageLayout.header=Meerdere pagina indeling pageLayout.header=Meerdere pagina indeling
pageLayout.pagesPerSheet=Pagina''s per vel: pageLayout.pagesPerSheet=Pagina's per vel:
pageLayout.addBorder=Add Borders pageLayout.addBorder=Randen toevoegen
pageLayout.submit=Indienen pageLayout.submit=Indienen
@@ -599,24 +599,24 @@ certSign.submit=PDF ondertekenen
#removeBlanks #removeBlanks
removeBlanks.title=Verwijder blanco''s removeBlanks.title=Verwijder blanco's
removeBlanks.header=Verwijder lege pagina''s removeBlanks.header=Verwijder lege pagina's
removeBlanks.threshold=Pixel witheid drempel: removeBlanks.threshold=Pixel witheid drempel:
removeBlanks.thresholdDesc=Drempel voor het bepalen hoe wit een witte pixel moet zijn om als ''Wit'' te worden geclassificeerd. 0 = Zwart, 255 zuiver wit. removeBlanks.thresholdDesc=Drempel voor het bepalen hoe wit een witte pixel moet zijn om als 'Wit' te worden geclassificeerd. 0 = Zwart, 255 zuiver wit.
removeBlanks.whitePercent=Wit percentage (%): removeBlanks.whitePercent=Wit percentage (%):
removeBlanks.whitePercentDesc=Percentage van de pagina dat ''witte'' pixels moet zijn om verwijderd te worden removeBlanks.whitePercentDesc=Percentage van de pagina dat 'witte' pixels moet zijn om verwijderd te worden
removeBlanks.submit=Blanco''s verwijderen removeBlanks.submit=Blanco's verwijderen
#removeAnnotations #removeAnnotations
removeAnnotations.title=Remove Annotations removeAnnotations.title=Verwijder annotaties
removeAnnotations.header=Remove Annotations removeAnnotations.header=Verwijder annotaties
removeAnnotations.submit=Remove removeAnnotations.submit=Verwijderen
#compare #compare
compare.title=Vergelijken compare.title=Vergelijken
compare.header=PDF''s vergelijken compare.header=PDF's vergelijken
compare.document.1=Document 1 compare.document.1=Document 1
compare.document.2=Document 2 compare.document.2=Document 2
compare.submit=Vergelijken compare.submit=Vergelijken
@@ -624,7 +624,7 @@ compare.submit=Vergelijken
#sign #sign
sign.title=Ondertekenen sign.title=Ondertekenen
sign.header=PDF''s ondertekenen sign.header=PDF's ondertekenen
sign.upload=Upload afbeelding sign.upload=Upload afbeelding
sign.draw=Handtekening tekenen sign.draw=Handtekening tekenen
sign.text=Tekstinvoer sign.text=Tekstinvoer
@@ -634,13 +634,13 @@ sign.add=Toevoegen
#repair #repair
repair.title=Repareren repair.title=Repareren
repair.header=PDF''s repareren repair.header=PDF's repareren
repair.submit=Repareren repair.submit=Repareren
#flatten #flatten
flatten.title=Afvlakken flatten.title=Afvlakken
flatten.header=PDF''s afvlakken flatten.header=PDF's afvlakken
flatten.submit=Afvlakken flatten.submit=Afvlakken
@@ -661,12 +661,12 @@ ScannerImageSplit.selectText.10=Stelt de grootte van de toegevoegde en verwijder
ocr.title=OCR / Scan opruimen ocr.title=OCR / Scan opruimen
ocr.header=Scans opruimen / OCR (Optical Character Recognition) ocr.header=Scans opruimen / OCR (Optical Character Recognition)
ocr.selectText.1=Selecteer talen die binnen de PDF gedetecteerd moeten worden (De vermelde zijn de momenteel gedetecteerde): ocr.selectText.1=Selecteer talen die binnen de PDF gedetecteerd moeten worden (De vermelde zijn de momenteel gedetecteerde):
ocr.selectText.2=Produceer tekstbestand met OCR-tekst naast de OCR''d PDF ocr.selectText.2=Produceer tekstbestand met OCR-tekst naast de OCR'd PDF
ocr.selectText.3=Corrigeer pagina''s die onder een scheve hoek zijn gescand door ze terug te draaien ocr.selectText.3=Corrigeer pagina's die onder een scheve hoek zijn gescand door ze terug te draaien
ocr.selectText.4=Maak de pagina schoon, zodat het minder waarschijnlijk is dat OCR tekst in achtergrondruis vindt. (Geen uitvoerverandering) ocr.selectText.4=Maak de pagina schoon, zodat het minder waarschijnlijk is dat OCR tekst in achtergrondruis vindt. (Geen uitvoerverandering)
ocr.selectText.5=Maak de pagina schoon zodat OCR waarschijnlijk geen tekst in achtergrondruis vindt, behoudt opruiming in uitvoer. ocr.selectText.5=Maak de pagina schoon zodat OCR waarschijnlijk geen tekst in achtergrondruis vindt, behoudt opruiming in uitvoer.
ocr.selectText.6=Negeert pagina''s met interactieve tekst, OCR''s alleen pagina''s die afbeeldingen zijn ocr.selectText.6=Negeert pagina's met interactieve tekst, OCR's alleen pagina's die afbeeldingen zijn
ocr.selectText.7=Forceer OCR, zal elke pagina OCR''en en alle originele tekstelementen verwijderen ocr.selectText.7=Forceer OCR, zal elke pagina OCR'en en alle originele tekstelementen verwijderen
ocr.selectText.8=Normaal (Zal een fout geven als de PDF tekst bevat) ocr.selectText.8=Normaal (Zal een fout geven als de PDF tekst bevat)
ocr.selectText.9=Aanvullende instellingen ocr.selectText.9=Aanvullende instellingen
ocr.selectText.10=OCR-modus ocr.selectText.10=OCR-modus
@@ -714,7 +714,7 @@ addImage.submit=Afbeelding toevoegen
#merge #merge
merge.title=Samenvoegen merge.title=Samenvoegen
merge.header=Meerdere PDF''s samenvoegen (2+) merge.header=Meerdere PDF's samenvoegen (2+)
merge.sortByName=Sorteer op naam merge.sortByName=Sorteer op naam
merge.sortByDate=Sorteer op datum merge.sortByDate=Sorteer op datum
merge.submit=Samenvoegen merge.submit=Samenvoegen
@@ -723,7 +723,7 @@ merge.submit=Samenvoegen
#pdfOrganiser #pdfOrganiser
pdfOrganiser.title=Pagina organisator pdfOrganiser.title=Pagina organisator
pdfOrganiser.header=PDF pagina organisator pdfOrganiser.header=PDF pagina organisator
pdfOrganiser.submit=Pagina''s herschikken pdfOrganiser.submit=Pagina's herschikken
#multiTool #multiTool
@@ -731,14 +731,14 @@ multiTool.title=PDF Multitool
multiTool.header=PDF Multitool multiTool.header=PDF Multitool
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=PDF bekijken
viewPdf.header=View PDF viewPdf.header=PDF bekijken
#pageRemover #pageRemover
pageRemover.title=Pagina verwijderaar pageRemover.title=Pagina verwijderaar
pageRemover.header=PDF pagina verwijderaar pageRemover.header=PDF pagina verwijderaar
pageRemover.pagesToDelete=Te verwijderen pagina''s (Voer een door komma''s gescheiden lijst met paginanummers in): pageRemover.pagesToDelete=Te verwijderen pagina's (Voer een door komma's gescheiden lijst met paginanummers in):
pageRemover.submit=Pagina''s verwijderen pageRemover.submit=Pagina's verwijderen
#rotate #rotate
@@ -752,14 +752,14 @@ rotate.submit=Roteren
split.title=PDF splitsen split.title=PDF splitsen
split.header=PDF splitsen split.header=PDF splitsen
split.desc.1=De nummers die je kiest zijn de paginanummers waarop je een splitsing wilt uitvoeren split.desc.1=De nummers die je kiest zijn de paginanummers waarop je een splitsing wilt uitvoeren
split.desc.2=Als zodanig selecteren van 1,3,7-8 zou een 10 pagina''s tellend document splitsen in 6 aparte PDF''s met: split.desc.2=Als zodanig selecteren van 1,3,7-8 zou een 10 pagina's tellend document splitsen in 6 aparte PDF's met:
split.desc.3=Document #1: Pagina 1 split.desc.3=Document #1: Pagina 1
split.desc.4=Document #2: Pagina 2 en 3 split.desc.4=Document #2: Pagina 2 en 3
split.desc.5=Document #3: Pagina 4, 5 en 6 split.desc.5=Document #3: Pagina 4, 5 en 6
split.desc.6=Document #4: Pagina 7 split.desc.6=Document #4: Pagina 7
split.desc.7=Document #5: Pagina 8 split.desc.7=Document #5: Pagina 8
split.desc.8=Document #6: Pagina 9 en 10 split.desc.8=Document #6: Pagina 9 en 10
split.splitPages=Voer pagina''s in om op te splitsen: split.splitPages=Voer pagina's in om op te splitsen:
split.submit=Splitsen split.submit=Splitsen
@@ -767,14 +767,14 @@ split.submit=Splitsen
imageToPDF.title=Afbeelding naar PDF imageToPDF.title=Afbeelding naar PDF
imageToPDF.header=Afbeelding naar PDF imageToPDF.header=Afbeelding naar PDF
imageToPDF.submit=Omzetten imageToPDF.submit=Omzetten
imageToPDF.selectLabel=Image Fit Options imageToPDF.selectLabel=Opties voor afbeelding passend maken
imageToPDF.fillPage=Fill Page imageToPDF.fillPage=Pagina vullen
imageToPDF.fitDocumentToImage=Fit Page to Image imageToPDF.fitDocumentToImage=Pagina passend maken voor afbeelding
imageToPDF.maintainAspectRatio=Maintain Aspect Ratios imageToPDF.maintainAspectRatio=Beeldverhoudingen behouden
imageToPDF.selectText.2=PDF automatisch draaien imageToPDF.selectText.2=PDF automatisch draaien
imageToPDF.selectText.3=Meervoudige bestandslogica (Alleen ingeschakeld bij werken met meerdere afbeeldingen) imageToPDF.selectText.3=Meervoudige bestandslogica (Alleen ingeschakeld bij werken met meerdere afbeeldingen)
imageToPDF.selectText.4=Voeg samen in één PDF imageToPDF.selectText.4=Voeg samen in één PDF
imageToPDF.selectText.5=Zet om naar afzonderlijke PDF''s imageToPDF.selectText.5=Zet om naar afzonderlijke PDF's
#pdfToImage #pdfToImage
@@ -782,7 +782,7 @@ pdfToImage.title=PDF naar afbeelding
pdfToImage.header=PDF naar afbeelding pdfToImage.header=PDF naar afbeelding
pdfToImage.selectText=Afbeeldingsformaat pdfToImage.selectText=Afbeeldingsformaat
pdfToImage.singleOrMultiple=Resultaattype van pagina naar afbeelding pdfToImage.singleOrMultiple=Resultaattype van pagina naar afbeelding
pdfToImage.single=Eén grote afbeelding die alle pagina''s combineert pdfToImage.single=Eén grote afbeelding die alle pagina's combineert
pdfToImage.multi=Meerdere afbeeldingen, één afbeelding per pagina pdfToImage.multi=Meerdere afbeeldingen, één afbeelding per pagina
pdfToImage.colorType=Kleurtype pdfToImage.colorType=Kleurtype
pdfToImage.color=Kleur pdfToImage.color=Kleur
@@ -924,48 +924,48 @@ PDFToCSV.prompt=Choose page to extract table
PDFToCSV.submit=Extract PDFToCSV.submit=Extract
#split-by-size-or-count #split-by-size-or-count
split-by-size-or-count.header=Split PDF by Size or Count split-by-size-or-count.header=PDF splitsen op grootte of aantal
split-by-size-or-count.type.label=Select Split Type split-by-size-or-count.type.label=Selecteer splits type
split-by-size-or-count.type.size=By Size split-by-size-or-count.type.size=Op grootte
split-by-size-or-count.type.pageCount=By Page Count split-by-size-or-count.type.pageCount=Op pagina aantal
split-by-size-or-count.type.docCount=By Document Count split-by-size-or-count.type.docCount=Op document aantal
split-by-size-or-count.value.label=Enter Value split-by-size-or-count.value.label=Voer waarde in
split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5) split-by-size-or-count.value.placeholder=Voer grootte (bijv., 2MB of 3KB) of aantal (bijv., 5)
split-by-size-or-count.submit=Submit split-by-size-or-count.submit=Indienen
#overlay-pdfs #overlay-pdfs
overlay-pdfs.header=Overlay PDF Files overlay-pdfs.header=PDF bestanden overlappen
overlay-pdfs.baseFile.label=Select Base PDF File overlay-pdfs.baseFile.label=Selecteer basis PDF-bestand
overlay-pdfs.overlayFiles.label=Select Overlay PDF Files overlay-pdfs.overlayFiles.label=Selecteer overlappende PDF-bestanden
overlay-pdfs.mode.label=Select Overlay Mode overlay-pdfs.mode.label=Selecteer overlappingsmodus
overlay-pdfs.mode.sequential=Sequential Overlay overlay-pdfs.mode.sequential=Sequentieel overlappen
overlay-pdfs.mode.interleaved=Interleaved Overlay overlay-pdfs.mode.interleaved=Geïnterlinieerd overlappen
overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay overlay-pdfs.mode.fixedRepeat=Overlappen met vaste herhaling
overlay-pdfs.counts.label=Overlay Counts (for Fixed Repeat Mode) overlay-pdfs.counts.label=Aantal keren overlappen (voor vaste herhalings modus)
overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1) overlay-pdfs.counts.placeholder=Voer door komma's gescheiden aantallen in (bijv., 2,3,1)
overlay-pdfs.position.label=Select Overlay Position overlay-pdfs.position.label=Selecteer overlappingspositie
overlay-pdfs.position.foreground=Foreground overlay-pdfs.position.foreground=Voorgrond
overlay-pdfs.position.background=Background overlay-pdfs.position.background=Achtergrond
overlay-pdfs.submit=Submit overlay-pdfs.submit=Indienen
#split-by-sections #split-by-sections
split-by-sections.title=Split PDF by Sections split-by-sections.title=PDF in secties splitsen
split-by-sections.header=Split PDF into Sections split-by-sections.header=PDF in secties splitsen
split-by-sections.horizontal.label=Horizontal Divisions split-by-sections.horizontal.label=Horizontale secties
split-by-sections.vertical.label=Vertical Divisions split-by-sections.vertical.label=Verticale secties
split-by-sections.horizontal.placeholder=Enter number of horizontal divisions split-by-sections.horizontal.placeholder=Voer het aantal horizontale secties in
split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.vertical.placeholder=Voer het aantal verticale secties in
split-by-sections.submit=Split PDF split-by-sections.submit=PDF splitsen
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licensies
licenses.title=3rd Party Licenses licenses.title=Licensies van derden
licenses.header=3rd Party Licenses licenses.header=Licensies van derden
licenses.module=Module licenses.module=Module
licenses.version=Version licenses.version=Versie
licenses.license=License licenses.license=Licensie

View File

@@ -120,7 +120,7 @@
data-bs-files-selected=#{filesSelected}, data-bs-files-selected=#{filesSelected},
data-bs-pdf-prompt=#{pdfPrompt}"> data-bs-pdf-prompt=#{pdfPrompt}">
<div class="mb-3"> <div class="mb-3">
<input type="file" class="form-control" th:name="${name}" th:id="${name}+'-input'" th:accept="${accept}" multiple th:classappend="${notRequired ? '' : 'required'}"> <input type="file" class="form-control" th:name="${name}" th:id="${name}+'-input'" th:accept="${accept}" multiple th:required="${notRequired} ? null : 'required'">
</div> </div>
<div class="selected-files"></div> <div class="selected-files"></div>
</div> </div>