mirror of
https://github.com/Frooodle/Stirling-PDF.git
synced 2025-09-08 17:51:20 +02:00
Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a438a15105 | ||
|
8192b1a44f | ||
|
47bce86ae2 | ||
|
5e72dce0de | ||
|
6d03ab27d4 | ||
|
830b346945 | ||
|
e5da63554e |
@ -122,13 +122,13 @@ Stirling-PDF currently supports 40 languages!
|
||||
| Bulgarian (Български) (bg_BG) |  |
|
||||
| Catalan (Català) (ca_CA) |  |
|
||||
| Croatian (Hrvatski) (hr_HR) |  |
|
||||
| Czech (Česky) (cs_CZ) |  |
|
||||
| Czech (Česky) (cs_CZ) |  |
|
||||
| Danish (Dansk) (da_DK) |  |
|
||||
| Dutch (Nederlands) (nl_NL) |  |
|
||||
| English (English) (en_GB) |  |
|
||||
| English (US) (en_US) |  |
|
||||
| French (Français) (fr_FR) |  |
|
||||
| German (Deutsch) (de_DE) |  |
|
||||
| German (Deutsch) (de_DE) |  |
|
||||
| Greek (Ελληνικά) (el_GR) |  |
|
||||
| Hindi (हिंदी) (hi_IN) |  |
|
||||
| Hungarian (Magyar) (hu_HU) |  |
|
||||
@ -144,7 +144,7 @@ Stirling-PDF currently supports 40 languages!
|
||||
| Portuguese Brazilian (Português) (pt_BR) |  |
|
||||
| Romanian (Română) (ro_RO) |  |
|
||||
| Russian (Русский) (ru_RU) |  |
|
||||
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
||||
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
||||
| Simplified Chinese (简体中文) (zh_CN) |  |
|
||||
| Slovakian (Slovensky) (sk_SK) |  |
|
||||
| Slovenian (Slovenščina) (sl_SI) |  |
|
||||
|
@ -124,8 +124,8 @@ public class FileToPdf {
|
||||
private static void zipDirectory(Path sourceDir, Path zipFilePath) throws IOException {
|
||||
try (ZipOutputStream zos =
|
||||
new ZipOutputStream(new FileOutputStream(zipFilePath.toFile()))) {
|
||||
Files.walk(sourceDir)
|
||||
.filter(path -> !Files.isDirectory(path))
|
||||
try (Stream<Path> walk = Files.walk(sourceDir)) {
|
||||
walk.filter(path -> !Files.isDirectory(path))
|
||||
.forEach(
|
||||
path -> {
|
||||
ZipEntry zipEntry =
|
||||
@ -140,6 +140,7 @@ public class FileToPdf {
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void deleteDirectory(Path dir) throws IOException {
|
||||
Files.walkFileTree(
|
||||
|
@ -552,10 +552,10 @@ public class PdfUtils {
|
||||
public boolean containsTextInFile(PDDocument pdfDocument, String text, String pagesToCheck)
|
||||
throws IOException {
|
||||
PDFTextStripper textStripper = new PDFTextStripper();
|
||||
String pdfText = "";
|
||||
StringBuilder pdfText = new StringBuilder();
|
||||
|
||||
if (pagesToCheck == null || "all".equals(pagesToCheck)) {
|
||||
pdfText = textStripper.getText(pdfDocument);
|
||||
pdfText = new StringBuilder(textStripper.getText(pdfDocument));
|
||||
} else {
|
||||
// remove whitespaces
|
||||
pagesToCheck = pagesToCheck.replaceAll("\\s+", "");
|
||||
@ -571,21 +571,21 @@ public class PdfUtils {
|
||||
for (int i = startPage; i <= endPage; i++) {
|
||||
textStripper.setStartPage(i);
|
||||
textStripper.setEndPage(i);
|
||||
pdfText += textStripper.getText(pdfDocument);
|
||||
pdfText.append(textStripper.getText(pdfDocument));
|
||||
}
|
||||
} else {
|
||||
// Handle individual page
|
||||
int page = Integer.parseInt(splitPoint);
|
||||
textStripper.setStartPage(page);
|
||||
textStripper.setEndPage(page);
|
||||
pdfText += textStripper.getText(pdfDocument);
|
||||
pdfText.append(textStripper.getText(pdfDocument));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pdfDocument.close();
|
||||
|
||||
return pdfText.contains(text);
|
||||
return pdfText.toString().contains(text);
|
||||
}
|
||||
|
||||
public boolean pageCount(PDDocument pdfDocument, int pageCount, String comparator)
|
||||
|
@ -17,6 +17,7 @@ import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
|
||||
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
||||
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
|
||||
import org.apache.pdfbox.util.Matrix;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
|
@ -9,6 +9,7 @@ import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
@ -150,10 +151,11 @@ public class ConvertImgPDFController {
|
||||
.runCommandWithOutputHandling(command);
|
||||
|
||||
// Find all WebP files in the output directory
|
||||
List<Path> webpFiles =
|
||||
Files.walk(tempOutputDir)
|
||||
.filter(path -> path.toString().endsWith(".webp"))
|
||||
.toList();
|
||||
List<Path> webpFiles;
|
||||
try (Stream<Path> walkStream = Files.walk(tempOutputDir)) {
|
||||
webpFiles =
|
||||
walkStream.filter(path -> path.toString().endsWith(".webp")).toList();
|
||||
}
|
||||
|
||||
if (webpFiles.isEmpty()) {
|
||||
log.error("No WebP files were created in: {}", tempOutputDir.toString());
|
||||
|
@ -48,10 +48,12 @@ public class FilterController {
|
||||
String text = request.getText();
|
||||
String pageNumber = request.getPageNumbers();
|
||||
|
||||
PDDocument pdfDocument = pdfDocumentFactory.load(inputFile);
|
||||
if (PdfUtils.hasText(pdfDocument, pageNumber, text))
|
||||
try (PDDocument pdfDocument = pdfDocumentFactory.load(inputFile)) {
|
||||
if (PdfUtils.hasText(pdfDocument, pageNumber, text)) {
|
||||
return WebResponseUtils.pdfDocToWebResponse(
|
||||
pdfDocument, Filenames.toSimpleFileName(inputFile.getOriginalFilename()));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -94,14 +94,14 @@ public class AutoRenameController {
|
||||
// Merge lines with same font size
|
||||
List<LineInfo> mergedLineInfos = new ArrayList<>();
|
||||
for (int i = 0; i < lineInfos.size(); i++) {
|
||||
String mergedText = lineInfos.get(i).text;
|
||||
StringBuilder mergedText = new StringBuilder(lineInfos.get(i).text);
|
||||
float fontSize = lineInfos.get(i).fontSize;
|
||||
while (i + 1 < lineInfos.size()
|
||||
&& lineInfos.get(i + 1).fontSize == fontSize) {
|
||||
mergedText += " " + lineInfos.get(i + 1).text;
|
||||
mergedText.append(" ").append(lineInfos.get(i + 1).text);
|
||||
i++;
|
||||
}
|
||||
mergedLineInfos.add(new LineInfo(mergedText, fontSize));
|
||||
mergedLineInfos.add(new LineInfo(mergedText.toString(), fontSize));
|
||||
}
|
||||
|
||||
// Sort lines by font size in descending order and get the first one
|
||||
|
@ -8,6 +8,7 @@ import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
@ -142,7 +143,10 @@ public class ExtractImageScansController {
|
||||
.runCommandWithOutputHandling(command);
|
||||
|
||||
// Read the output photos in temp directory
|
||||
List<Path> tempOutputFiles = Files.list(tempDir).sorted().toList();
|
||||
List<Path> tempOutputFiles;
|
||||
try (Stream<Path> listStream = Files.list(tempDir)) {
|
||||
tempOutputFiles = listStream.sorted().toList();
|
||||
}
|
||||
for (Path tempOutputFile : tempOutputFiles) {
|
||||
byte[] imageBytes = Files.readAllBytes(tempOutputFile);
|
||||
processedImageBytes.add(imageBytes);
|
||||
|
@ -1,8 +1,9 @@
|
||||
package stirling.software.SPDF.controller.api.misc;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Map;
|
||||
|
||||
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 org.apache.pdfbox.pdmodel.PDDocument;
|
||||
import org.apache.pdfbox.pdmodel.common.PDNameTreeNode;
|
||||
import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript;
|
||||
@ -13,17 +14,13 @@ import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import io.github.pixee.security.Filenames;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import stirling.software.common.model.api.PDFFile;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/misc")
|
||||
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||
@ -38,7 +35,8 @@ public class ShowJavascript {
|
||||
description = "desc. Input:PDF Output:JS Type:SISO")
|
||||
public ResponseEntity<byte[]> extractHeader(@ModelAttribute PDFFile file) throws Exception {
|
||||
MultipartFile inputFile = file.getFileInput();
|
||||
String script = "";
|
||||
StringBuilder script = new StringBuilder();
|
||||
boolean foundScript = false;
|
||||
|
||||
try (PDDocument document = pdfDocumentFactory.load(inputFile)) {
|
||||
|
||||
@ -55,28 +53,28 @@ public class ShowJavascript {
|
||||
PDActionJavaScript jsAction = entry.getValue();
|
||||
String jsCodeStr = jsAction.getAction();
|
||||
|
||||
script +=
|
||||
"// File: "
|
||||
+ Filenames.toSimpleFileName(
|
||||
inputFile.getOriginalFilename())
|
||||
+ ", Script: "
|
||||
+ name
|
||||
+ "\n"
|
||||
+ jsCodeStr
|
||||
+ "\n";
|
||||
if (jsCodeStr != null && !jsCodeStr.trim().isEmpty()) {
|
||||
script.append("// File: ")
|
||||
.append(Filenames.toSimpleFileName(inputFile.getOriginalFilename()))
|
||||
.append(", Script: ")
|
||||
.append(name)
|
||||
.append("\n")
|
||||
.append(jsCodeStr)
|
||||
.append("\n");
|
||||
foundScript = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (script.isEmpty()) {
|
||||
script =
|
||||
"PDF '"
|
||||
+ Filenames.toSimpleFileName(inputFile.getOriginalFilename())
|
||||
+ "' does not contain Javascript";
|
||||
if (!foundScript) {
|
||||
script = new StringBuilder("PDF '")
|
||||
.append(Filenames.toSimpleFileName(inputFile.getOriginalFilename()))
|
||||
.append("' does not contain Javascript");
|
||||
}
|
||||
|
||||
return WebResponseUtils.bytesToWebResponse(
|
||||
script.getBytes(StandardCharsets.UTF_8),
|
||||
script.toString().getBytes(StandardCharsets.UTF_8),
|
||||
Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + ".js",
|
||||
MediaType.TEXT_PLAIN);
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thymeleaf.util.StringUtils;
|
||||
@ -66,11 +67,12 @@ public class SignatureService {
|
||||
|
||||
private List<SignatureFile> getSignaturesFromFolder(Path folder, String category)
|
||||
throws IOException {
|
||||
return Files.list(folder)
|
||||
.filter(path -> isImageFile(path))
|
||||
try (Stream<Path> stream = Files.list(folder)) {
|
||||
return stream.filter(this::isImageFile)
|
||||
.map(path -> new SignatureFile(path.getFileName().toString(), category))
|
||||
.toList();
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] getSignatureBytes(String username, String fileName) throws IOException {
|
||||
validateFileName(fileName);
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=حجم الخط
|
||||
addPageNumbers.fontName=اسم الخط
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=اختر PDF
|
||||
multiPdfPrompt=اختر ملفات PDF (2+)
|
||||
multiPdfDropPrompt=حدد (أو اسحب وأفلت) جميع ملفات PDF التي تحتاجها
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Şrift Ölçüsü
|
||||
addPageNumbers.fontName=Şrift Adı
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=PDF(lər)i Seç
|
||||
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)
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Размер на шрифт
|
||||
addPageNumbers.fontName=Име на шрифт
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Изберете PDF(и)
|
||||
multiPdfPrompt=Изберете PDF (2+)
|
||||
multiPdfDropPrompt=Изберете (или плъзнете и пуснете) всички PDF файлове, от които се нуждаете
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=ཡིག་གཟུགས་ཆེ་ཆུང་
|
||||
addPageNumbers.fontName=ཡིག་གཟུགས་མིང་
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=PDF འདེམས་རོགས།
|
||||
multiPdfPrompt=PDF གཉིས་ཡན་འདེམས་རོགས།
|
||||
multiPdfDropPrompt=དགོས་མཁོ་འདི་ PDF ཡིག་ཆ་ཚང་མ་འདེམས་པའམ་འཐེན་རོགས།
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Mida del tipus de lletra
|
||||
addPageNumbers.fontName=Nom del tipus de lletra
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Selecciona PDF(s)
|
||||
multiPdfPrompt=Selecciona PDFs (2+)
|
||||
multiPdfDropPrompt=Selecciona (o arrossega) els documents PDF
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Velikost písma
|
||||
addPageNumbers.fontName=Název písma
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Vyberte PDF soubor(y)
|
||||
multiPdfPrompt=Vyberte PDF soubory (2+)
|
||||
multiPdfDropPrompt=Vyberte (nebo přetáhněte) všechny požadované PDF soubory
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Skriftstørrelse
|
||||
addPageNumbers.fontName=Skriftnavn
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Vælg PDF-fil(er)
|
||||
multiPdfPrompt=Vælg PDF-filerne (2+)
|
||||
multiPdfDropPrompt=Vælg (eller drag & drop) alle PDF-filerne du skal bruge
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Schriftgröße
|
||||
addPageNumbers.fontName=Schriftart
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=PDF(s) auswählen
|
||||
multiPdfPrompt=PDFs auswählen (2+)
|
||||
multiPdfDropPrompt=Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin)
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Μέγεθος γραμματοσειράς
|
||||
addPageNumbers.fontName=Όνομα γραμματοσειράς
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Επιλέξτε PDF(s)
|
||||
multiPdfPrompt=Επιλέξτε PDFs (2+)
|
||||
multiPdfDropPrompt=Επιλέξτε (ή σύρετε & αφήστε) όλα τα PDF που χρειάζεστε
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Font Size
|
||||
addPageNumbers.fontName=Font Name
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Select PDF(s)
|
||||
multiPdfPrompt=Select PDFs (2+)
|
||||
multiPdfDropPrompt=Select (or drag & drop) all PDFs you require
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Tamaño de Letra
|
||||
addPageNumbers.fontName=Nombre de Letra
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Seleccionar PDF(s)
|
||||
multiPdfPrompt=Seleccionar PDFs (2+)
|
||||
multiPdfDropPrompt=Seleccione (o arrastre y suelte) todos los PDFs que quiera
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Font Size
|
||||
addPageNumbers.fontName=Font Name
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Hautatu PDFa(k)
|
||||
multiPdfPrompt=Hautatu PDFak (2+)
|
||||
multiPdfDropPrompt=Hautatu (edo arrastatu eta jaregin) nahi dituzun PDFak
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=اندازه فونت
|
||||
addPageNumbers.fontName=نام فونت
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=انتخاب فایل(های) PDF
|
||||
multiPdfPrompt=انتخاب فایلهای PDF (دو یا بیشتر)
|
||||
multiPdfDropPrompt=انتخاب (یا کشیدن و رها کردن) تمام فایلهای PDF مورد نیاز
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Taille de Police
|
||||
addPageNumbers.fontName=Nom de la Police
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Sélectionnez le(s) PDF
|
||||
multiPdfPrompt=Sélectionnez les PDF
|
||||
multiPdfDropPrompt=Sélectionnez (ou glissez-déposez) tous les PDF dont vous avez besoin
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Méid an Chló
|
||||
addPageNumbers.fontName=Ainm Cló
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Roghnaigh PDF(anna)
|
||||
multiPdfPrompt=Roghnaigh PDFs (2+)
|
||||
multiPdfDropPrompt=Roghnaigh (nó tarraing & scaoil) gach PDF atá uait
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=फ़ॉन्ट आकार
|
||||
addPageNumbers.fontName=फ़ॉन्ट नाम
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=पीडीएफ फ़ाइल(ें) चुनें
|
||||
multiPdfPrompt=पीडीएफ फ़ाइलें चुनें (2+)
|
||||
multiPdfDropPrompt=आवश्यक सभी पीडीएफ फ़ाइलों को चुनें (या खींच कर छोड़ें)
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Veličina pisma
|
||||
addPageNumbers.fontName=Ime pisma
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Odaberi PDF(ove)
|
||||
multiPdfPrompt=Odaberi PDF-ove (2+)
|
||||
multiPdfDropPrompt=Odaberi (ili povuci i ispusti) sve potrebne PDF-ove
|
||||
|
@ -137,6 +137,7 @@ lang.yor=joruba
|
||||
|
||||
addPageNumbers.fontSize=Betűméret
|
||||
addPageNumbers.fontName=Betűtípus
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=PDF-fájl kiválasztása
|
||||
multiPdfPrompt=PDF-fájlok kiválasztása (2+)
|
||||
multiPdfDropPrompt=Válassza ki (vagy húzza ide) az összes szükséges PDF-fájlt
|
||||
@ -1895,12 +1896,12 @@ editTableOfContents.replaceExisting=Meglévő könyvjelzők cseréje (törölje
|
||||
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.addBookmark=Új könyvjelző hozzáadása
|
||||
editTableOfContents.importBookmarksDefault=Import
|
||||
editTableOfContents.importBookmarksFromJsonFile=Upload JSON file
|
||||
editTableOfContents.importBookmarksFromClipboard=Paste from clipboard
|
||||
editTableOfContents.exportBookmarksDefault=Export
|
||||
editTableOfContents.exportBookmarksAsJson=Download as JSON
|
||||
editTableOfContents.exportBookmarksAsText=Copy as text
|
||||
editTableOfContents.importBookmarksDefault=Importálás
|
||||
editTableOfContents.importBookmarksFromJsonFile=JSON fájl feltöltése
|
||||
editTableOfContents.importBookmarksFromClipboard=Beillesztés vágólapról
|
||||
editTableOfContents.exportBookmarksDefault=Exportálás
|
||||
editTableOfContents.exportBookmarksAsJson=Letöltés JSON formátumban
|
||||
editTableOfContents.exportBookmarksAsText=Másolás szövegként
|
||||
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.3=Minden könyvjelzőhöz szükséges egy cím és egy céloldalszám.
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Ukuran Fonta
|
||||
addPageNumbers.fontName=Nama Fonta
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Pilih PDF
|
||||
multiPdfPrompt=Pilih PDF (2+)
|
||||
multiPdfDropPrompt=Pilih (atau seret & letakkan)) semua PDF yang Anda butuhkan
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Dimensione del font
|
||||
addPageNumbers.fontName=Nome del font
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Scegli PDF
|
||||
multiPdfPrompt=Scegli 2 o più PDF
|
||||
multiPdfDropPrompt=Scegli (o trascina e rilascia) uno o più PDF
|
||||
|
@ -137,6 +137,7 @@ lang.yor=ヨルバ語
|
||||
|
||||
addPageNumbers.fontSize=フォントサイズ
|
||||
addPageNumbers.fontName=フォント名
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=PDFを選択
|
||||
multiPdfPrompt=PDFを選択(2つ以上)
|
||||
multiPdfDropPrompt=PDFを選択(又はドラッグ&ドロップ)
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=글꼴 크기
|
||||
addPageNumbers.fontName=글꼴 이름
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=PDF 선택
|
||||
multiPdfPrompt=PDF 선택 (2개 이상)
|
||||
multiPdfDropPrompt=필요한 모든 PDF를 선택(또는 끌어다 놓기)하세요
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=അക്ഷര വലുപ്പം
|
||||
addPageNumbers.fontName=അക്ഷരത്തിന്റെ പേര്
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=PDF(കൾ) തിരഞ്ഞെടുക്കുക
|
||||
multiPdfPrompt=PDF-കൾ തിരഞ്ഞെടുക്കുക (2+)
|
||||
multiPdfDropPrompt=നിങ്ങൾക്ക് ആവശ്യമുള്ള എല്ലാ PDF-കളും തിരഞ്ഞെടുക്കുക (അല്ലെങ്കിൽ വലിച്ചിടുക)
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Lettertypegrootte
|
||||
addPageNumbers.fontName=Lettertypenaam
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Selecteer PDF('s)
|
||||
multiPdfPrompt=Selecteer PDF's (2+)
|
||||
multiPdfDropPrompt=Selecteer (of sleep & zet neer) alle PDF's die je nodig hebt
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Skriftstørrelse
|
||||
addPageNumbers.fontName=Skrifttype
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Velg PDF(er)
|
||||
multiPdfPrompt=Velg PDF-filer (2+)
|
||||
multiPdfDropPrompt=Velg (eller dra og slipp) alle PDF-ene du trenger
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Rozmiar Czcionki
|
||||
addPageNumbers.fontName=Nazwa Czcionki
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Wybierz PDF
|
||||
multiPdfPrompt=Wybierz PDF (2+)
|
||||
multiPdfDropPrompt=Wybierz (lub przeciągnij i puść) wszystkie dokumenty PDF
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Tamanho da Fonte
|
||||
addPageNumbers.fontName=Nome da Fonte
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Selecione o(s) PDF(s)
|
||||
multiPdfPrompt=Selecione os PDFs (2+)
|
||||
multiPdfDropPrompt=Selecione (ou arraste e solte) todos os PDFs desejados:
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Tamanho da Fonte
|
||||
addPageNumbers.fontName=Nome da Fonte
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Selecione PDF(s)
|
||||
multiPdfPrompt=Selecione PDFs (2+)
|
||||
multiPdfDropPrompt=Selecione (ou arraste e solte) todos os PDFs necessários
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Dimensiune Font
|
||||
addPageNumbers.fontName=Nume Font
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Selectează fișiere PDF
|
||||
multiPdfPrompt=Selectează mai multe fișiere PDF (2+)
|
||||
multiPdfDropPrompt=Selectează (sau trage și plasează) toate fișierele PDF de care ai nevoie
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Размер шрифта
|
||||
addPageNumbers.fontName=Название шрифта
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Выберите PDF-файл(ы)
|
||||
multiPdfPrompt=Выберите PDF-файлы (2+)
|
||||
multiPdfDropPrompt=Выберите (или перетащите) все необходимые PDF-файлы
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Font Size
|
||||
addPageNumbers.fontName=Font Name
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Vyberte PDF súbor(y)
|
||||
multiPdfPrompt=Vyberte PDF súbory (2+)
|
||||
multiPdfDropPrompt=Vyberte (alebo pretiahnite) všetky požadované PDF súbory
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Velikost pisave
|
||||
addPageNumbers.fontName=Ime pisave
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Izberi PDF(e)
|
||||
multiPdfPrompt=Izberi PDF (2+)
|
||||
multiPdfDropPrompt=Izberite (ali povlecite in spustite) vse datoteke PDF, ki jih potrebujete
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Joruba
|
||||
|
||||
addPageNumbers.fontSize=Veličina fonta
|
||||
addPageNumbers.fontName=Naziv fonta
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Odaberi PDF(ove)
|
||||
multiPdfPrompt=Odaberi PDF-ove (2+)
|
||||
multiPdfDropPrompt=Odaberi (ili prevuci i pusti) sve PDF-ove koji su ti potrebni
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Teckenstorlek
|
||||
addPageNumbers.fontName=Typsnitt
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Välj PDF(er)
|
||||
multiPdfPrompt=Välj PDF-filer (2+)
|
||||
multiPdfDropPrompt=Välj (eller dra och släpp) alla PDF-filer du behöver
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=ขนาดตัวอักษร
|
||||
addPageNumbers.fontName=ชื่อฟอนต์
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=เลือก PDF
|
||||
multiPdfPrompt=เลือก PDF หลายไฟล์ (2 ขึ้นไป)
|
||||
multiPdfDropPrompt=เลือก (หรือลากและวาง) PDF ทั้งหมดที่คุณต้องการ
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Розмір шрифту
|
||||
addPageNumbers.fontName=Назва шрифту
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Оберіть PDF(и)
|
||||
multiPdfPrompt=Оберіть PDFи (2+)
|
||||
multiPdfDropPrompt=Оберіть (або перетягніть) всі необхідні PDFи
|
||||
|
@ -137,6 +137,7 @@ lang.yor=Yoruba
|
||||
|
||||
addPageNumbers.fontSize=Font Size
|
||||
addPageNumbers.fontName=Font Name
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=Chọn (các) tệp PDF
|
||||
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
|
||||
|
@ -137,6 +137,7 @@ lang.yor=约鲁巴语
|
||||
|
||||
addPageNumbers.fontSize=字体大小
|
||||
addPageNumbers.fontName=字体名称
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=选择 PDF
|
||||
multiPdfPrompt=选择多个 PDF(2个或更多)
|
||||
multiPdfDropPrompt=选择(或拖拽)所需的 PDF
|
||||
|
@ -137,6 +137,7 @@ lang.yor=約魯巴語
|
||||
|
||||
addPageNumbers.fontSize=字型大小
|
||||
addPageNumbers.fontName=字型名稱
|
||||
addPageNumbers.fontColor=Font Colour
|
||||
pdfPrompt=選擇 PDF 檔案
|
||||
multiPdfPrompt=選擇多個 PDF 檔案
|
||||
multiPdfDropPrompt=選擇(或拖放)所有需要的 PDF 檔案
|
||||
|
@ -8,6 +8,7 @@ import org.springframework.stereotype.Service;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import stirling.software.common.model.ApplicationProperties;
|
||||
import stirling.software.proprietary.security.database.repository.UserRepository;
|
||||
import stirling.software.proprietary.security.model.AuthenticationType;
|
||||
import stirling.software.proprietary.security.model.User;
|
||||
@ -20,6 +21,8 @@ public class CustomUserDetailsService implements UserDetailsService {
|
||||
|
||||
private final LoginAttemptService loginAttemptService;
|
||||
|
||||
private final ApplicationProperties.Security securityProperties;
|
||||
|
||||
@Override
|
||||
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
|
||||
User user =
|
||||
@ -35,12 +38,53 @@ public class CustomUserDetailsService implements UserDetailsService {
|
||||
"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.valueOf(user.getAuthenticationType().toUpperCase());
|
||||
AuthenticationType.valueOf(authTypeStr.toUpperCase());
|
||||
if (!user.hasPassword() && userAuthenticationType == AuthenticationType.WEB) {
|
||||
throw new IllegalArgumentException("Password must not be null");
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ repositories {
|
||||
|
||||
allprojects {
|
||||
group = 'stirling.software'
|
||||
version = '1.3.0'
|
||||
version = '1.3.2'
|
||||
|
||||
configurations.configureEach {
|
||||
exclude group: 'commons-logging', module: 'commons-logging'
|
||||
|
Loading…
Reference in New Issue
Block a user