Compare commits

..

No commits in common. "main" and "v1.3.0" have entirely different histories.
main ... v1.3.0

51 changed files with 72 additions and 165 deletions

View File

@ -122,13 +122,13 @@ Stirling-PDF currently supports 40 languages!
| Bulgarian (Български) (bg_BG) | ![68%](https://geps.dev/progress/68) | | Bulgarian (Български) (bg_BG) | ![68%](https://geps.dev/progress/68) |
| Catalan (Català) (ca_CA) | ![67%](https://geps.dev/progress/67) | | Catalan (Català) (ca_CA) | ![67%](https://geps.dev/progress/67) |
| Croatian (Hrvatski) (hr_HR) | ![60%](https://geps.dev/progress/60) | | Croatian (Hrvatski) (hr_HR) | ![60%](https://geps.dev/progress/60) |
| Czech (Česky) (cs_CZ) | ![69%](https://geps.dev/progress/69) | | Czech (Česky) (cs_CZ) | ![70%](https://geps.dev/progress/70) |
| Danish (Dansk) (da_DK) | ![61%](https://geps.dev/progress/61) | | Danish (Dansk) (da_DK) | ![61%](https://geps.dev/progress/61) |
| Dutch (Nederlands) (nl_NL) | ![60%](https://geps.dev/progress/60) | | Dutch (Nederlands) (nl_NL) | ![60%](https://geps.dev/progress/60) |
| English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) |
| English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) |
| French (Français) (fr_FR) | ![88%](https://geps.dev/progress/88) | | French (Français) (fr_FR) | ![88%](https://geps.dev/progress/88) |
| German (Deutsch) (de_DE) | ![97%](https://geps.dev/progress/97) | | German (Deutsch) (de_DE) | ![98%](https://geps.dev/progress/98) |
| Greek (Ελληνικά) (el_GR) | ![67%](https://geps.dev/progress/67) | | Greek (Ελληνικά) (el_GR) | ![67%](https://geps.dev/progress/67) |
| Hindi (हिंदी) (hi_IN) | ![67%](https://geps.dev/progress/67) | | Hindi (हिंदी) (hi_IN) | ![67%](https://geps.dev/progress/67) |
| Hungarian (Magyar) (hu_HU) | ![99%](https://geps.dev/progress/99) | | Hungarian (Magyar) (hu_HU) | ![99%](https://geps.dev/progress/99) |
@ -144,7 +144,7 @@ Stirling-PDF currently supports 40 languages!
| Portuguese Brazilian (Português) (pt_BR) | ![76%](https://geps.dev/progress/76) | | Portuguese Brazilian (Português) (pt_BR) | ![76%](https://geps.dev/progress/76) |
| Romanian (Română) (ro_RO) | ![57%](https://geps.dev/progress/57) | | Romanian (Română) (ro_RO) | ![57%](https://geps.dev/progress/57) |
| Russian (Русский) (ru_RU) | ![88%](https://geps.dev/progress/88) | | Russian (Русский) (ru_RU) | ![88%](https://geps.dev/progress/88) |
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![94%](https://geps.dev/progress/94) | | Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![95%](https://geps.dev/progress/95) |
| Simplified Chinese (简体中文) (zh_CN) | ![93%](https://geps.dev/progress/93) | | Simplified Chinese (简体中文) (zh_CN) | ![93%](https://geps.dev/progress/93) |
| Slovakian (Slovensky) (sk_SK) | ![51%](https://geps.dev/progress/51) | | Slovakian (Slovensky) (sk_SK) | ![51%](https://geps.dev/progress/51) |
| Slovenian (Slovenščina) (sl_SI) | ![71%](https://geps.dev/progress/71) | | Slovenian (Slovenščina) (sl_SI) | ![71%](https://geps.dev/progress/71) |

View File

@ -124,21 +124,20 @@ public class FileToPdf {
private static void zipDirectory(Path sourceDir, Path zipFilePath) throws IOException { private static void zipDirectory(Path sourceDir, Path zipFilePath) throws IOException {
try (ZipOutputStream zos = try (ZipOutputStream zos =
new ZipOutputStream(new FileOutputStream(zipFilePath.toFile()))) { new ZipOutputStream(new FileOutputStream(zipFilePath.toFile()))) {
try (Stream<Path> walk = Files.walk(sourceDir)) { Files.walk(sourceDir)
walk.filter(path -> !Files.isDirectory(path)) .filter(path -> !Files.isDirectory(path))
.forEach( .forEach(
path -> { path -> {
ZipEntry zipEntry = ZipEntry zipEntry =
new ZipEntry(sourceDir.relativize(path).toString()); new ZipEntry(sourceDir.relativize(path).toString());
try { try {
zos.putNextEntry(zipEntry); zos.putNextEntry(zipEntry);
Files.copy(path, zos); Files.copy(path, zos);
zos.closeEntry(); zos.closeEntry();
} catch (IOException e) { } catch (IOException e) {
throw new UncheckedIOException(e); throw new UncheckedIOException(e);
} }
}); });
}
} }
} }

View File

@ -552,10 +552,10 @@ public class PdfUtils {
public boolean containsTextInFile(PDDocument pdfDocument, String text, String pagesToCheck) public boolean containsTextInFile(PDDocument pdfDocument, String text, String pagesToCheck)
throws IOException { throws IOException {
PDFTextStripper textStripper = new PDFTextStripper(); PDFTextStripper textStripper = new PDFTextStripper();
StringBuilder pdfText = new StringBuilder(); String pdfText = "";
if (pagesToCheck == null || "all".equals(pagesToCheck)) { if (pagesToCheck == null || "all".equals(pagesToCheck)) {
pdfText = new StringBuilder(textStripper.getText(pdfDocument)); pdfText = textStripper.getText(pdfDocument);
} else { } else {
// remove whitespaces // remove whitespaces
pagesToCheck = pagesToCheck.replaceAll("\\s+", ""); pagesToCheck = pagesToCheck.replaceAll("\\s+", "");
@ -571,21 +571,21 @@ public class PdfUtils {
for (int i = startPage; i <= endPage; i++) { for (int i = startPage; i <= endPage; i++) {
textStripper.setStartPage(i); textStripper.setStartPage(i);
textStripper.setEndPage(i); textStripper.setEndPage(i);
pdfText.append(textStripper.getText(pdfDocument)); pdfText += textStripper.getText(pdfDocument);
} }
} else { } else {
// Handle individual page // Handle individual page
int page = Integer.parseInt(splitPoint); int page = Integer.parseInt(splitPoint);
textStripper.setStartPage(page); textStripper.setStartPage(page);
textStripper.setEndPage(page); textStripper.setEndPage(page);
pdfText.append(textStripper.getText(pdfDocument)); pdfText += textStripper.getText(pdfDocument);
} }
} }
} }
pdfDocument.close(); pdfDocument.close();
return pdfText.toString().contains(text); return pdfText.contains(text);
} }
public boolean pageCount(PDDocument pdfDocument, int pageCount, String comparator) public boolean pageCount(PDDocument pdfDocument, int pageCount, String comparator)

View File

@ -17,7 +17,6 @@ import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
import org.apache.pdfbox.util.Matrix; import org.apache.pdfbox.util.Matrix;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;

View File

@ -9,7 +9,6 @@ import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Stream;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@ -151,11 +150,10 @@ public class ConvertImgPDFController {
.runCommandWithOutputHandling(command); .runCommandWithOutputHandling(command);
// Find all WebP files in the output directory // Find all WebP files in the output directory
List<Path> webpFiles; List<Path> webpFiles =
try (Stream<Path> walkStream = Files.walk(tempOutputDir)) { Files.walk(tempOutputDir)
webpFiles = .filter(path -> path.toString().endsWith(".webp"))
walkStream.filter(path -> path.toString().endsWith(".webp")).toList(); .toList();
}
if (webpFiles.isEmpty()) { if (webpFiles.isEmpty()) {
log.error("No WebP files were created in: {}", tempOutputDir.toString()); log.error("No WebP files were created in: {}", tempOutputDir.toString());

View File

@ -48,12 +48,10 @@ public class FilterController {
String text = request.getText(); String text = request.getText();
String pageNumber = request.getPageNumbers(); String pageNumber = request.getPageNumbers();
try (PDDocument pdfDocument = pdfDocumentFactory.load(inputFile)) { PDDocument pdfDocument = pdfDocumentFactory.load(inputFile);
if (PdfUtils.hasText(pdfDocument, pageNumber, text)) { if (PdfUtils.hasText(pdfDocument, pageNumber, text))
return WebResponseUtils.pdfDocToWebResponse( return WebResponseUtils.pdfDocToWebResponse(
pdfDocument, Filenames.toSimpleFileName(inputFile.getOriginalFilename())); pdfDocument, Filenames.toSimpleFileName(inputFile.getOriginalFilename()));
}
}
return null; return null;
} }

View File

@ -94,14 +94,14 @@ public class AutoRenameController {
// Merge lines with same font size // Merge lines with same font size
List<LineInfo> mergedLineInfos = new ArrayList<>(); List<LineInfo> mergedLineInfos = new ArrayList<>();
for (int i = 0; i < lineInfos.size(); i++) { for (int i = 0; i < lineInfos.size(); i++) {
StringBuilder mergedText = new StringBuilder(lineInfos.get(i).text); String mergedText = lineInfos.get(i).text;
float fontSize = lineInfos.get(i).fontSize; float fontSize = lineInfos.get(i).fontSize;
while (i + 1 < lineInfos.size() while (i + 1 < lineInfos.size()
&& lineInfos.get(i + 1).fontSize == fontSize) { && lineInfos.get(i + 1).fontSize == fontSize) {
mergedText.append(" ").append(lineInfos.get(i + 1).text); mergedText += " " + lineInfos.get(i + 1).text;
i++; i++;
} }
mergedLineInfos.add(new LineInfo(mergedText.toString(), fontSize)); mergedLineInfos.add(new LineInfo(mergedText, fontSize));
} }
// Sort lines by font size in descending order and get the first one // Sort lines by font size in descending order and get the first one

View File

@ -8,7 +8,6 @@ import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Stream;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@ -143,10 +142,7 @@ public class ExtractImageScansController {
.runCommandWithOutputHandling(command); .runCommandWithOutputHandling(command);
// Read the output photos in temp directory // Read the output photos in temp directory
List<Path> tempOutputFiles; List<Path> tempOutputFiles = Files.list(tempDir).sorted().toList();
try (Stream<Path> listStream = Files.list(tempDir)) {
tempOutputFiles = listStream.sorted().toList();
}
for (Path tempOutputFile : tempOutputFiles) { for (Path tempOutputFile : tempOutputFiles) {
byte[] imageBytes = Files.readAllBytes(tempOutputFile); byte[] imageBytes = Files.readAllBytes(tempOutputFile);
processedImageBytes.add(imageBytes); processedImageBytes.add(imageBytes);

View File

@ -1,9 +1,8 @@
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 io.swagger.v3.oas.annotations.Operation; import java.util.Map;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.common.PDNameTreeNode; import org.apache.pdfbox.pdmodel.common.PDNameTreeNode;
import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript; import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript;
@ -14,13 +13,17 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import io.github.pixee.security.Filenames;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import stirling.software.common.model.api.PDFFile; import stirling.software.common.model.api.PDFFile;
import stirling.software.common.service.CustomPDFDocumentFactory; import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.WebResponseUtils; import stirling.software.common.util.WebResponseUtils;
import java.nio.charset.StandardCharsets;
import java.util.Map;
@RestController @RestController
@RequestMapping("/api/v1/misc") @RequestMapping("/api/v1/misc")
@Tag(name = "Misc", description = "Miscellaneous APIs") @Tag(name = "Misc", description = "Miscellaneous APIs")
@ -35,8 +38,7 @@ public class ShowJavascript {
description = "desc. Input:PDF Output:JS Type:SISO") description = "desc. Input:PDF Output:JS Type:SISO")
public ResponseEntity<byte[]> extractHeader(@ModelAttribute PDFFile file) throws Exception { public ResponseEntity<byte[]> extractHeader(@ModelAttribute PDFFile file) throws Exception {
MultipartFile inputFile = file.getFileInput(); MultipartFile inputFile = file.getFileInput();
StringBuilder script = new StringBuilder(); String script = "";
boolean foundScript = false;
try (PDDocument document = pdfDocumentFactory.load(inputFile)) { try (PDDocument document = pdfDocumentFactory.load(inputFile)) {
@ -53,28 +55,28 @@ public class ShowJavascript {
PDActionJavaScript jsAction = entry.getValue(); PDActionJavaScript jsAction = entry.getValue();
String jsCodeStr = jsAction.getAction(); String jsCodeStr = jsAction.getAction();
if (jsCodeStr != null && !jsCodeStr.trim().isEmpty()) { script +=
script.append("// File: ") "// File: "
.append(Filenames.toSimpleFileName(inputFile.getOriginalFilename())) + Filenames.toSimpleFileName(
.append(", Script: ") inputFile.getOriginalFilename())
.append(name) + ", Script: "
.append("\n") + name
.append(jsCodeStr) + "\n"
.append("\n"); + jsCodeStr
foundScript = true; + "\n";
}
} }
} }
} }
if (!foundScript) { if (script.isEmpty()) {
script = new StringBuilder("PDF '") script =
.append(Filenames.toSimpleFileName(inputFile.getOriginalFilename())) "PDF '"
.append("' does not contain Javascript"); + Filenames.toSimpleFileName(inputFile.getOriginalFilename())
+ "' does not contain Javascript";
} }
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
script.toString().getBytes(StandardCharsets.UTF_8), script.getBytes(StandardCharsets.UTF_8),
Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + ".js", Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + ".js",
MediaType.TEXT_PLAIN); MediaType.TEXT_PLAIN);
} }

View File

@ -7,7 +7,6 @@ import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Stream;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.thymeleaf.util.StringUtils; import org.thymeleaf.util.StringUtils;
@ -67,11 +66,10 @@ public class SignatureService {
private List<SignatureFile> getSignaturesFromFolder(Path folder, String category) private List<SignatureFile> getSignaturesFromFolder(Path folder, String category)
throws IOException { throws IOException {
try (Stream<Path> stream = Files.list(folder)) { return Files.list(folder)
return stream.filter(this::isImageFile) .filter(path -> isImageFile(path))
.map(path -> new SignatureFile(path.getFileName().toString(), category)) .map(path -> new SignatureFile(path.getFileName().toString(), category))
.toList(); .toList();
}
} }
public byte[] getSignatureBytes(String username, String fileName) throws IOException { public byte[] getSignatureBytes(String username, String fileName) throws IOException {

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=حجم الخط addPageNumbers.fontSize=حجم الخط
addPageNumbers.fontName=اسم الخط addPageNumbers.fontName=اسم الخط
addPageNumbers.fontColor=Font Colour
pdfPrompt=اختر PDF pdfPrompt=اختر PDF
multiPdfPrompt=اختر ملفات PDF (2+) multiPdfPrompt=اختر ملفات PDF (2+)
multiPdfDropPrompt=حدد (أو اسحب وأفلت) جميع ملفات PDF التي تحتاجها multiPdfDropPrompt=حدد (أو اسحب وأفلت) جميع ملفات PDF التي تحتاجها

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Şrift Ölçüsü addPageNumbers.fontSize=Şrift Ölçüsü
addPageNumbers.fontName=Şrift Adı addPageNumbers.fontName=Şrift Adı
addPageNumbers.fontColor=Font Colour
pdfPrompt=PDF(lər)i Seç pdfPrompt=PDF(lər)i Seç
multiPdfPrompt=PDFləri Seç (2+) multiPdfPrompt=PDFləri Seç (2+)
multiPdfDropPrompt=Ehtiyacınız olan bütün PDFləri seçin (və ya sürükləyib buraxın) multiPdfDropPrompt=Ehtiyacınız olan bütün PDFləri seçin (və ya sürükləyib buraxın)

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Размер на шрифт addPageNumbers.fontSize=Размер на шрифт
addPageNumbers.fontName=Име на шрифт addPageNumbers.fontName=Име на шрифт
addPageNumbers.fontColor=Font Colour
pdfPrompt=Изберете PDF(и) pdfPrompt=Изберете PDF(и)
multiPdfPrompt=Изберете PDF (2+) multiPdfPrompt=Изберете PDF (2+)
multiPdfDropPrompt=Изберете (или плъзнете и пуснете) всички PDF файлове, от които се нуждаете multiPdfDropPrompt=Изберете (или плъзнете и пуснете) всички PDF файлове, от които се нуждаете

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=ཡིག་གཟུགས་ཆེ་ཆུང་ addPageNumbers.fontSize=ཡིག་གཟུགས་ཆེ་ཆུང་
addPageNumbers.fontName=ཡིག་གཟུགས་མིང་ addPageNumbers.fontName=ཡིག་གཟུགས་མིང་
addPageNumbers.fontColor=Font Colour
pdfPrompt=PDF འདེམས་རོགས། pdfPrompt=PDF འདེམས་རོགས།
multiPdfPrompt=PDF གཉིས་ཡན་འདེམས་རོགས། multiPdfPrompt=PDF གཉིས་ཡན་འདེམས་རོགས།
multiPdfDropPrompt=དགོས་མཁོ་འདི་ PDF ཡིག་ཆ་ཚང་མ་འདེམས་པའམ་འཐེན་རོགས། multiPdfDropPrompt=དགོས་མཁོ་འདི་ PDF ཡིག་ཆ་ཚང་མ་འདེམས་པའམ་འཐེན་རོགས།

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Mida del tipus de lletra addPageNumbers.fontSize=Mida del tipus de lletra
addPageNumbers.fontName=Nom del tipus de lletra addPageNumbers.fontName=Nom del tipus de lletra
addPageNumbers.fontColor=Font Colour
pdfPrompt=Selecciona PDF(s) pdfPrompt=Selecciona PDF(s)
multiPdfPrompt=Selecciona PDFs (2+) multiPdfPrompt=Selecciona PDFs (2+)
multiPdfDropPrompt=Selecciona (o arrossega) els documents PDF multiPdfDropPrompt=Selecciona (o arrossega) els documents PDF

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Velikost písma addPageNumbers.fontSize=Velikost písma
addPageNumbers.fontName=Název písma addPageNumbers.fontName=Název písma
addPageNumbers.fontColor=Font Colour
pdfPrompt=Vyberte PDF soubor(y) pdfPrompt=Vyberte PDF soubor(y)
multiPdfPrompt=Vyberte PDF soubory (2+) multiPdfPrompt=Vyberte PDF soubory (2+)
multiPdfDropPrompt=Vyberte (nebo přetáhněte) všechny požadované PDF soubory multiPdfDropPrompt=Vyberte (nebo přetáhněte) všechny požadované PDF soubory

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Skriftstørrelse addPageNumbers.fontSize=Skriftstørrelse
addPageNumbers.fontName=Skriftnavn addPageNumbers.fontName=Skriftnavn
addPageNumbers.fontColor=Font Colour
pdfPrompt=Vælg PDF-fil(er) pdfPrompt=Vælg PDF-fil(er)
multiPdfPrompt=Vælg PDF-filerne (2+) multiPdfPrompt=Vælg PDF-filerne (2+)
multiPdfDropPrompt=Vælg (eller drag & drop) alle PDF-filerne du skal bruge multiPdfDropPrompt=Vælg (eller drag & drop) alle PDF-filerne du skal bruge

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Schriftgröße addPageNumbers.fontSize=Schriftgröße
addPageNumbers.fontName=Schriftart addPageNumbers.fontName=Schriftart
addPageNumbers.fontColor=Font Colour
pdfPrompt=PDF(s) auswählen pdfPrompt=PDF(s) auswählen
multiPdfPrompt=PDFs auswählen (2+) multiPdfPrompt=PDFs auswählen (2+)
multiPdfDropPrompt=Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin) multiPdfDropPrompt=Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin)

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Μέγεθος γραμματοσειράς addPageNumbers.fontSize=Μέγεθος γραμματοσειράς
addPageNumbers.fontName=Όνομα γραμματοσειράς addPageNumbers.fontName=Όνομα γραμματοσειράς
addPageNumbers.fontColor=Font Colour
pdfPrompt=Επιλέξτε PDF(s) pdfPrompt=Επιλέξτε PDF(s)
multiPdfPrompt=Επιλέξτε PDFs (2+) multiPdfPrompt=Επιλέξτε PDFs (2+)
multiPdfDropPrompt=Επιλέξτε (ή σύρετε & αφήστε) όλα τα PDF που χρειάζεστε multiPdfDropPrompt=Επιλέξτε (ή σύρετε & αφήστε) όλα τα PDF που χρειάζεστε

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Font Size addPageNumbers.fontSize=Font Size
addPageNumbers.fontName=Font Name addPageNumbers.fontName=Font Name
addPageNumbers.fontColor=Font Colour
pdfPrompt=Select PDF(s) pdfPrompt=Select PDF(s)
multiPdfPrompt=Select PDFs (2+) multiPdfPrompt=Select PDFs (2+)
multiPdfDropPrompt=Select (or drag & drop) all PDFs you require multiPdfDropPrompt=Select (or drag & drop) all PDFs you require

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Tamaño de Letra addPageNumbers.fontSize=Tamaño de Letra
addPageNumbers.fontName=Nombre de Letra addPageNumbers.fontName=Nombre de Letra
addPageNumbers.fontColor=Font Colour
pdfPrompt=Seleccionar PDF(s) pdfPrompt=Seleccionar PDF(s)
multiPdfPrompt=Seleccionar PDFs (2+) multiPdfPrompt=Seleccionar PDFs (2+)
multiPdfDropPrompt=Seleccione (o arrastre y suelte) todos los PDFs que quiera multiPdfDropPrompt=Seleccione (o arrastre y suelte) todos los PDFs que quiera

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Font Size addPageNumbers.fontSize=Font Size
addPageNumbers.fontName=Font Name addPageNumbers.fontName=Font Name
addPageNumbers.fontColor=Font Colour
pdfPrompt=Hautatu PDFa(k) pdfPrompt=Hautatu PDFa(k)
multiPdfPrompt=Hautatu PDFak (2+) multiPdfPrompt=Hautatu PDFak (2+)
multiPdfDropPrompt=Hautatu (edo arrastatu eta jaregin) nahi dituzun PDFak multiPdfDropPrompt=Hautatu (edo arrastatu eta jaregin) nahi dituzun PDFak

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=اندازه فونت addPageNumbers.fontSize=اندازه فونت
addPageNumbers.fontName=نام فونت addPageNumbers.fontName=نام فونت
addPageNumbers.fontColor=Font Colour
pdfPrompt=انتخاب فایل(های) PDF pdfPrompt=انتخاب فایل(های) PDF
multiPdfPrompt=انتخاب فایل‌های PDF (دو یا بیشتر) multiPdfPrompt=انتخاب فایل‌های PDF (دو یا بیشتر)
multiPdfDropPrompt=انتخاب (یا کشیدن و رها کردن) تمام فایل‌های PDF مورد نیاز multiPdfDropPrompt=انتخاب (یا کشیدن و رها کردن) تمام فایل‌های PDF مورد نیاز

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Taille de Police addPageNumbers.fontSize=Taille de Police
addPageNumbers.fontName=Nom de la Police addPageNumbers.fontName=Nom de la Police
addPageNumbers.fontColor=Font Colour
pdfPrompt=Sélectionnez le(s) PDF pdfPrompt=Sélectionnez le(s) PDF
multiPdfPrompt=Sélectionnez les PDF multiPdfPrompt=Sélectionnez les PDF
multiPdfDropPrompt=Sélectionnez (ou glissez-déposez) tous les PDF dont vous avez besoin multiPdfDropPrompt=Sélectionnez (ou glissez-déposez) tous les PDF dont vous avez besoin

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Méid an Chló addPageNumbers.fontSize=Méid an Chló
addPageNumbers.fontName=Ainm Cló addPageNumbers.fontName=Ainm Cló
addPageNumbers.fontColor=Font Colour
pdfPrompt=Roghnaigh PDF(anna) pdfPrompt=Roghnaigh PDF(anna)
multiPdfPrompt=Roghnaigh PDFs (2+) multiPdfPrompt=Roghnaigh PDFs (2+)
multiPdfDropPrompt=Roghnaigh (nó tarraing & scaoil) gach PDF atá uait multiPdfDropPrompt=Roghnaigh (nó tarraing & scaoil) gach PDF atá uait

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=फ़ॉन्ट आकार addPageNumbers.fontSize=फ़ॉन्ट आकार
addPageNumbers.fontName=फ़ॉन्ट नाम addPageNumbers.fontName=फ़ॉन्ट नाम
addPageNumbers.fontColor=Font Colour
pdfPrompt=पीडीएफ फ़ाइल(ें) चुनें pdfPrompt=पीडीएफ फ़ाइल(ें) चुनें
multiPdfPrompt=पीडीएफ फ़ाइलें चुनें (2+) multiPdfPrompt=पीडीएफ फ़ाइलें चुनें (2+)
multiPdfDropPrompt=आवश्यक सभी पीडीएफ फ़ाइलों को चुनें (या खींच कर छोड़ें) multiPdfDropPrompt=आवश्यक सभी पीडीएफ फ़ाइलों को चुनें (या खींच कर छोड़ें)

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Veličina pisma addPageNumbers.fontSize=Veličina pisma
addPageNumbers.fontName=Ime pisma addPageNumbers.fontName=Ime pisma
addPageNumbers.fontColor=Font Colour
pdfPrompt=Odaberi PDF(ove) pdfPrompt=Odaberi PDF(ove)
multiPdfPrompt=Odaberi PDF-ove (2+) multiPdfPrompt=Odaberi PDF-ove (2+)
multiPdfDropPrompt=Odaberi (ili povuci i ispusti) sve potrebne PDF-ove multiPdfDropPrompt=Odaberi (ili povuci i ispusti) sve potrebne PDF-ove

View File

@ -137,7 +137,6 @@ lang.yor=joruba
addPageNumbers.fontSize=Betűméret addPageNumbers.fontSize=Betűméret
addPageNumbers.fontName=Betűtípus addPageNumbers.fontName=Betűtípus
addPageNumbers.fontColor=Font Colour
pdfPrompt=PDF-fájl kiválasztása pdfPrompt=PDF-fájl kiválasztása
multiPdfPrompt=PDF-fájlok kiválasztása (2+) multiPdfPrompt=PDF-fájlok kiválasztása (2+)
multiPdfDropPrompt=Válassza ki (vagy húzza ide) az összes szükséges PDF-fájlt multiPdfDropPrompt=Válassza ki (vagy húzza ide) az összes szükséges PDF-fájlt
@ -1896,12 +1895,12 @@ editTableOfContents.replaceExisting=Meglévő könyvjelzők cseréje (törölje
editTableOfContents.editorTitle=Könyvjelző szerkesztő editTableOfContents.editorTitle=Könyvjelző szerkesztő
editTableOfContents.editorDesc=Könyvjelzők hozzáadása és rendezése lent. Kattintson a + gombra gyermek könyvjelzők hozzáadásához. editTableOfContents.editorDesc=Könyvjelzők hozzáadása és rendezése lent. Kattintson a + gombra gyermek könyvjelzők hozzáadásához.
editTableOfContents.addBookmark=Új könyvjelző hozzáadása editTableOfContents.addBookmark=Új könyvjelző hozzáadása
editTableOfContents.importBookmarksDefault=Importálás editTableOfContents.importBookmarksDefault=Import
editTableOfContents.importBookmarksFromJsonFile=JSON fájl feltöltése editTableOfContents.importBookmarksFromJsonFile=Upload JSON file
editTableOfContents.importBookmarksFromClipboard=Beillesztés vágólapról editTableOfContents.importBookmarksFromClipboard=Paste from clipboard
editTableOfContents.exportBookmarksDefault=Exportálás editTableOfContents.exportBookmarksDefault=Export
editTableOfContents.exportBookmarksAsJson=Letöltés JSON formátumban editTableOfContents.exportBookmarksAsJson=Download as JSON
editTableOfContents.exportBookmarksAsText=Másolás szövegként editTableOfContents.exportBookmarksAsText=Copy as text
editTableOfContents.desc.1=Ez az eszköz lehetővé teszi a tartalomjegyzék (könyvjelzők) hozzáadását vagy szerkesztését egy PDF dokumentumban. editTableOfContents.desc.1=Ez az eszköz lehetővé teszi a tartalomjegyzék (könyvjelzők) hozzáadását vagy szerkesztését egy PDF dokumentumban.
editTableOfContents.desc.2=Hierarchikus struktúrákat hozhat létre, ha gyermek könyvjelzőket ad a szülő könyvjelzőkhöz. editTableOfContents.desc.2=Hierarchikus struktúrákat hozhat létre, ha gyermek könyvjelzőket ad a szülő könyvjelzőkhöz.
editTableOfContents.desc.3=Minden könyvjelzőhöz szükséges egy cím és egy céloldalszám. editTableOfContents.desc.3=Minden könyvjelzőhöz szükséges egy cím és egy céloldalszám.

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Ukuran Fonta addPageNumbers.fontSize=Ukuran Fonta
addPageNumbers.fontName=Nama Fonta addPageNumbers.fontName=Nama Fonta
addPageNumbers.fontColor=Font Colour
pdfPrompt=Pilih PDF pdfPrompt=Pilih PDF
multiPdfPrompt=Pilih PDF (2+) multiPdfPrompt=Pilih PDF (2+)
multiPdfDropPrompt=Pilih (atau seret & letakkan)) semua PDF yang Anda butuhkan multiPdfDropPrompt=Pilih (atau seret & letakkan)) semua PDF yang Anda butuhkan

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Dimensione del font addPageNumbers.fontSize=Dimensione del font
addPageNumbers.fontName=Nome del font addPageNumbers.fontName=Nome del font
addPageNumbers.fontColor=Font Colour
pdfPrompt=Scegli PDF pdfPrompt=Scegli PDF
multiPdfPrompt=Scegli 2 o più PDF multiPdfPrompt=Scegli 2 o più PDF
multiPdfDropPrompt=Scegli (o trascina e rilascia) uno o più PDF multiPdfDropPrompt=Scegli (o trascina e rilascia) uno o più PDF

View File

@ -137,7 +137,6 @@ lang.yor=ヨルバ語
addPageNumbers.fontSize=フォントサイズ addPageNumbers.fontSize=フォントサイズ
addPageNumbers.fontName=フォント名 addPageNumbers.fontName=フォント名
addPageNumbers.fontColor=Font Colour
pdfPrompt=PDFを選択 pdfPrompt=PDFを選択
multiPdfPrompt=PDFを選択2つ以上 multiPdfPrompt=PDFを選択2つ以上
multiPdfDropPrompt=PDFを選択又はドラッグ&ドロップ) multiPdfDropPrompt=PDFを選択又はドラッグ&ドロップ)

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=글꼴 크기 addPageNumbers.fontSize=글꼴 크기
addPageNumbers.fontName=글꼴 이름 addPageNumbers.fontName=글꼴 이름
addPageNumbers.fontColor=Font Colour
pdfPrompt=PDF 선택 pdfPrompt=PDF 선택
multiPdfPrompt=PDF 선택 (2개 이상) multiPdfPrompt=PDF 선택 (2개 이상)
multiPdfDropPrompt=필요한 모든 PDF를 선택(또는 끌어다 놓기)하세요 multiPdfDropPrompt=필요한 모든 PDF를 선택(또는 끌어다 놓기)하세요

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=അക്ഷര വലുപ്പം addPageNumbers.fontSize=അക്ഷര വലുപ്പം
addPageNumbers.fontName=അക്ഷരത്തിന്റെ പേര് addPageNumbers.fontName=അക്ഷരത്തിന്റെ പേര്
addPageNumbers.fontColor=Font Colour
pdfPrompt=PDF(കൾ) തിരഞ്ഞെടുക്കുക pdfPrompt=PDF(കൾ) തിരഞ്ഞെടുക്കുക
multiPdfPrompt=PDF-കൾ തിരഞ്ഞെടുക്കുക (2+) multiPdfPrompt=PDF-കൾ തിരഞ്ഞെടുക്കുക (2+)
multiPdfDropPrompt=നിങ്ങൾക്ക് ആവശ്യമുള്ള എല്ലാ PDF-കളും തിരഞ്ഞെടുക്കുക (അല്ലെങ്കിൽ വലിച്ചിടുക) multiPdfDropPrompt=നിങ്ങൾക്ക് ആവശ്യമുള്ള എല്ലാ PDF-കളും തിരഞ്ഞെടുക്കുക (അല്ലെങ്കിൽ വലിച്ചിടുക)

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Lettertypegrootte addPageNumbers.fontSize=Lettertypegrootte
addPageNumbers.fontName=Lettertypenaam addPageNumbers.fontName=Lettertypenaam
addPageNumbers.fontColor=Font Colour
pdfPrompt=Selecteer PDF('s) pdfPrompt=Selecteer PDF('s)
multiPdfPrompt=Selecteer PDF's (2+) multiPdfPrompt=Selecteer PDF's (2+)
multiPdfDropPrompt=Selecteer (of sleep & zet neer) alle PDF's die je nodig hebt multiPdfDropPrompt=Selecteer (of sleep & zet neer) alle PDF's die je nodig hebt

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Skriftstørrelse addPageNumbers.fontSize=Skriftstørrelse
addPageNumbers.fontName=Skrifttype addPageNumbers.fontName=Skrifttype
addPageNumbers.fontColor=Font Colour
pdfPrompt=Velg PDF(er) pdfPrompt=Velg PDF(er)
multiPdfPrompt=Velg PDF-filer (2+) multiPdfPrompt=Velg PDF-filer (2+)
multiPdfDropPrompt=Velg (eller dra og slipp) alle PDF-ene du trenger multiPdfDropPrompt=Velg (eller dra og slipp) alle PDF-ene du trenger

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Rozmiar Czcionki addPageNumbers.fontSize=Rozmiar Czcionki
addPageNumbers.fontName=Nazwa Czcionki addPageNumbers.fontName=Nazwa Czcionki
addPageNumbers.fontColor=Font Colour
pdfPrompt=Wybierz PDF pdfPrompt=Wybierz PDF
multiPdfPrompt=Wybierz PDF (2+) multiPdfPrompt=Wybierz PDF (2+)
multiPdfDropPrompt=Wybierz (lub przeciągnij i puść) wszystkie dokumenty PDF multiPdfDropPrompt=Wybierz (lub przeciągnij i puść) wszystkie dokumenty PDF

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Tamanho da Fonte addPageNumbers.fontSize=Tamanho da Fonte
addPageNumbers.fontName=Nome da Fonte addPageNumbers.fontName=Nome da Fonte
addPageNumbers.fontColor=Font Colour
pdfPrompt=Selecione o(s) PDF(s) pdfPrompt=Selecione o(s) PDF(s)
multiPdfPrompt=Selecione os PDFs (2+) multiPdfPrompt=Selecione os PDFs (2+)
multiPdfDropPrompt=Selecione (ou arraste e solte) todos os PDFs desejados: multiPdfDropPrompt=Selecione (ou arraste e solte) todos os PDFs desejados:

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Tamanho da Fonte addPageNumbers.fontSize=Tamanho da Fonte
addPageNumbers.fontName=Nome da Fonte addPageNumbers.fontName=Nome da Fonte
addPageNumbers.fontColor=Font Colour
pdfPrompt=Selecione PDF(s) pdfPrompt=Selecione PDF(s)
multiPdfPrompt=Selecione PDFs (2+) multiPdfPrompt=Selecione PDFs (2+)
multiPdfDropPrompt=Selecione (ou arraste e solte) todos os PDFs necessários multiPdfDropPrompt=Selecione (ou arraste e solte) todos os PDFs necessários

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Dimensiune Font addPageNumbers.fontSize=Dimensiune Font
addPageNumbers.fontName=Nume Font addPageNumbers.fontName=Nume Font
addPageNumbers.fontColor=Font Colour
pdfPrompt=Selectează fișiere PDF pdfPrompt=Selectează fișiere PDF
multiPdfPrompt=Selectează mai multe fișiere PDF (2+) multiPdfPrompt=Selectează mai multe fișiere PDF (2+)
multiPdfDropPrompt=Selectează (sau trage și plasează) toate fișierele PDF de care ai nevoie multiPdfDropPrompt=Selectează (sau trage și plasează) toate fișierele PDF de care ai nevoie

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Размер шрифта addPageNumbers.fontSize=Размер шрифта
addPageNumbers.fontName=Название шрифта addPageNumbers.fontName=Название шрифта
addPageNumbers.fontColor=Font Colour
pdfPrompt=Выберите PDF-файл(ы) pdfPrompt=Выберите PDF-файл(ы)
multiPdfPrompt=Выберите PDF-файлы (2+) multiPdfPrompt=Выберите PDF-файлы (2+)
multiPdfDropPrompt=Выберите (или перетащите) все необходимые PDF-файлы multiPdfDropPrompt=Выберите (или перетащите) все необходимые PDF-файлы

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Font Size addPageNumbers.fontSize=Font Size
addPageNumbers.fontName=Font Name addPageNumbers.fontName=Font Name
addPageNumbers.fontColor=Font Colour
pdfPrompt=Vyberte PDF súbor(y) pdfPrompt=Vyberte PDF súbor(y)
multiPdfPrompt=Vyberte PDF súbory (2+) multiPdfPrompt=Vyberte PDF súbory (2+)
multiPdfDropPrompt=Vyberte (alebo pretiahnite) všetky požadované PDF súbory multiPdfDropPrompt=Vyberte (alebo pretiahnite) všetky požadované PDF súbory

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Velikost pisave addPageNumbers.fontSize=Velikost pisave
addPageNumbers.fontName=Ime pisave addPageNumbers.fontName=Ime pisave
addPageNumbers.fontColor=Font Colour
pdfPrompt=Izberi PDF(e) pdfPrompt=Izberi PDF(e)
multiPdfPrompt=Izberi PDF (2+) multiPdfPrompt=Izberi PDF (2+)
multiPdfDropPrompt=Izberite (ali povlecite in spustite) vse datoteke PDF, ki jih potrebujete multiPdfDropPrompt=Izberite (ali povlecite in spustite) vse datoteke PDF, ki jih potrebujete

View File

@ -137,7 +137,6 @@ lang.yor=Joruba
addPageNumbers.fontSize=Veličina fonta addPageNumbers.fontSize=Veličina fonta
addPageNumbers.fontName=Naziv fonta addPageNumbers.fontName=Naziv fonta
addPageNumbers.fontColor=Font Colour
pdfPrompt=Odaberi PDF(ove) pdfPrompt=Odaberi PDF(ove)
multiPdfPrompt=Odaberi PDF-ove (2+) multiPdfPrompt=Odaberi PDF-ove (2+)
multiPdfDropPrompt=Odaberi (ili prevuci i pusti) sve PDF-ove koji su ti potrebni multiPdfDropPrompt=Odaberi (ili prevuci i pusti) sve PDF-ove koji su ti potrebni

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Teckenstorlek addPageNumbers.fontSize=Teckenstorlek
addPageNumbers.fontName=Typsnitt addPageNumbers.fontName=Typsnitt
addPageNumbers.fontColor=Font Colour
pdfPrompt=Välj PDF(er) pdfPrompt=Välj PDF(er)
multiPdfPrompt=Välj PDF-filer (2+) multiPdfPrompt=Välj PDF-filer (2+)
multiPdfDropPrompt=Välj (eller dra och släpp) alla PDF-filer du behöver multiPdfDropPrompt=Välj (eller dra och släpp) alla PDF-filer du behöver

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=ขนาดตัวอักษร addPageNumbers.fontSize=ขนาดตัวอักษร
addPageNumbers.fontName=ชื่อฟอนต์ addPageNumbers.fontName=ชื่อฟอนต์
addPageNumbers.fontColor=Font Colour
pdfPrompt=เลือก PDF pdfPrompt=เลือก PDF
multiPdfPrompt=เลือก PDF หลายไฟล์ (2 ขึ้นไป) multiPdfPrompt=เลือก PDF หลายไฟล์ (2 ขึ้นไป)
multiPdfDropPrompt=เลือก (หรือลากและวาง) PDF ทั้งหมดที่คุณต้องการ multiPdfDropPrompt=เลือก (หรือลากและวาง) PDF ทั้งหมดที่คุณต้องการ

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Розмір шрифту addPageNumbers.fontSize=Розмір шрифту
addPageNumbers.fontName=Назва шрифту addPageNumbers.fontName=Назва шрифту
addPageNumbers.fontColor=Font Colour
pdfPrompt=Оберіть PDF(и) pdfPrompt=Оберіть PDF(и)
multiPdfPrompt=Оберіть PDFи (2+) multiPdfPrompt=Оберіть PDFи (2+)
multiPdfDropPrompt=Оберіть (або перетягніть) всі необхідні PDFи multiPdfDropPrompt=Оберіть (або перетягніть) всі необхідні PDFи

View File

@ -137,7 +137,6 @@ lang.yor=Yoruba
addPageNumbers.fontSize=Font Size addPageNumbers.fontSize=Font Size
addPageNumbers.fontName=Font Name addPageNumbers.fontName=Font Name
addPageNumbers.fontColor=Font Colour
pdfPrompt=Chọn (các) tệp PDF pdfPrompt=Chọn (các) tệp PDF
multiPdfPrompt=Chọn các tệp PDF (2+) multiPdfPrompt=Chọn các tệp PDF (2+)
multiPdfDropPrompt=Chọn (hoặc kéo và thả) tất cả các tệp PDF bạn cần multiPdfDropPrompt=Chọn (hoặc kéo và thả) tất cả các tệp PDF bạn cần

View File

@ -137,7 +137,6 @@ lang.yor=约鲁巴语
addPageNumbers.fontSize=字体大小 addPageNumbers.fontSize=字体大小
addPageNumbers.fontName=字体名称 addPageNumbers.fontName=字体名称
addPageNumbers.fontColor=Font Colour
pdfPrompt=选择 PDF pdfPrompt=选择 PDF
multiPdfPrompt=选择多个 PDF2个或更多 multiPdfPrompt=选择多个 PDF2个或更多
multiPdfDropPrompt=选择(或拖拽)所需的 PDF multiPdfDropPrompt=选择(或拖拽)所需的 PDF

View File

@ -137,7 +137,6 @@ lang.yor=約魯巴語
addPageNumbers.fontSize=字型大小 addPageNumbers.fontSize=字型大小
addPageNumbers.fontName=字型名稱 addPageNumbers.fontName=字型名稱
addPageNumbers.fontColor=Font Colour
pdfPrompt=選擇 PDF 檔案 pdfPrompt=選擇 PDF 檔案
multiPdfPrompt=選擇多個 PDF 檔案 multiPdfPrompt=選擇多個 PDF 檔案
multiPdfDropPrompt=選擇(或拖放)所有需要的 PDF 檔案 multiPdfDropPrompt=選擇(或拖放)所有需要的 PDF 檔案

View File

@ -8,7 +8,6 @@ import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import stirling.software.common.model.ApplicationProperties;
import stirling.software.proprietary.security.database.repository.UserRepository; import stirling.software.proprietary.security.database.repository.UserRepository;
import stirling.software.proprietary.security.model.AuthenticationType; import stirling.software.proprietary.security.model.AuthenticationType;
import stirling.software.proprietary.security.model.User; import stirling.software.proprietary.security.model.User;
@ -21,8 +20,6 @@ public class CustomUserDetailsService implements UserDetailsService {
private final LoginAttemptService loginAttemptService; private final LoginAttemptService loginAttemptService;
private final ApplicationProperties.Security securityProperties;
@Override @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = User user =
@ -38,53 +35,12 @@ public class CustomUserDetailsService implements UserDetailsService {
"Your account has been locked due to too many failed login attempts."); "Your account has been locked due to too many failed login attempts.");
} }
// Handle legacy users without authenticationType (from versions < 1.3.0)
String authTypeStr = user.getAuthenticationType();
if (authTypeStr == null || authTypeStr.isEmpty()) {
// Migrate legacy users by detecting authentication type based on password presence
AuthenticationType detectedType;
if (user.hasPassword()) {
// Users with passwords are likely traditional web authentication users
detectedType = AuthenticationType.WEB;
} else {
// Users without passwords are SSO users (OAuth2/SAML2/etc)
// Choose the appropriate SSO type based on what's enabled
detectedType = determinePreferredSSOType();
}
authTypeStr = detectedType.name();
// Update the user record to set the detected authentication type
user.setAuthenticationType(detectedType);
userRepository.save(user);
}
AuthenticationType userAuthenticationType = AuthenticationType userAuthenticationType =
AuthenticationType.valueOf(authTypeStr.toUpperCase()); AuthenticationType.valueOf(user.getAuthenticationType().toUpperCase());
if (!user.hasPassword() && userAuthenticationType == AuthenticationType.WEB) { if (!user.hasPassword() && userAuthenticationType == AuthenticationType.WEB) {
throw new IllegalArgumentException("Password must not be null"); throw new IllegalArgumentException("Password must not be null");
} }
return user; return user;
} }
/**
* Determines the preferred SSO authentication type based on what's enabled in the application
* configuration.
*
* @return The preferred AuthenticationType for SSO users
*/
private AuthenticationType determinePreferredSSOType() {
// Check what SSO types are enabled and prefer in order: OAUTH2 > SAML2 > fallback to OAUTH2
boolean oauth2Enabled = securityProperties.getOauth2() != null && securityProperties.getOauth2().getEnabled();
boolean saml2Enabled = securityProperties.getSaml2() != null && securityProperties.getSaml2().getEnabled();
if (oauth2Enabled) {
return AuthenticationType.OAUTH2;
} else if (saml2Enabled) {
return AuthenticationType.SAML2;
} else {
// Fallback to OAUTH2 (better than deprecated SSO)
return AuthenticationType.OAUTH2;
}
}
} }

View File

@ -65,7 +65,7 @@ repositories {
allprojects { allprojects {
group = 'stirling.software' group = 'stirling.software'
version = '1.3.2' version = '1.3.0'
configurations.configureEach { configurations.configureEach {
exclude group: 'commons-logging', module: 'commons-logging' exclude group: 'commons-logging', module: 'commons-logging'