diff --git a/README.md b/README.md index 7773e7380..1ac27bb8e 100644 --- a/README.md +++ b/README.md @@ -183,19 +183,19 @@ Stirling PDF currently supports 38! | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | French (Français) (fr_FR) | ![90%](https://geps.dev/progress/90) | -| German (Deutsch) (de_DE) | ![98%](https://geps.dev/progress/98) | +| German (Deutsch) (de_DE) | ![99%](https://geps.dev/progress/99) | | Greek (Ελληνικά) (el_GR) | ![79%](https://geps.dev/progress/79) | | Hindi (हिंदी) (hi_IN) | ![76%](https://geps.dev/progress/76) | | Hungarian (Magyar) (hu_HU) | ![73%](https://geps.dev/progress/73) | | Indonesia (Bahasa Indonesia) (id_ID) | ![74%](https://geps.dev/progress/74) | | Irish (Gaeilge) (ga_IE) | ![95%](https://geps.dev/progress/95) | | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | -| Japanese (日本語) (ja_JP) | ![89%](https://geps.dev/progress/89) | +| Japanese (日本語) (ja_JP) | ![92%](https://geps.dev/progress/92) | | Korean (한국어) (ko_KR) | ![81%](https://geps.dev/progress/81) | | Norwegian (Norsk) (no_NB) | ![95%](https://geps.dev/progress/95) | | Polish (Polski) (pl_PL) | ![89%](https://geps.dev/progress/89) | | Portuguese (Português) (pt_PT) | ![76%](https://geps.dev/progress/76) | -| Portuguese Brazilian (Português) (pt_BR) | ![98%](https://geps.dev/progress/98) | +| Portuguese Brazilian (Português) (pt_BR) | ![99%](https://geps.dev/progress/99) | | Romanian (Română) (ro_RO) | ![97%](https://geps.dev/progress/97) | | Russian (Русский) (ru_RU) | ![81%](https://geps.dev/progress/81) | | Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![76%](https://geps.dev/progress/76) | diff --git a/scripts/replace_translation_line.sh b/scripts/replace_translation_line.sh new file mode 100644 index 000000000..d5161d36a --- /dev/null +++ b/scripts/replace_translation_line.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +translation_key="pdfToPDFA.credit" +old_value="OCRmyPDF" +new_value="ghostscript" + +for file in ../src/main/resources/messages_*.properties; do + sed -i "/^$translation_key=/s/$old_value/$new_value/" "$file" + echo "Updated $file" +done diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java index eaaf04bc5..14aef7346 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java @@ -1,22 +1,15 @@ package stirling.software.SPDF.controller.api.converters; -import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDDocumentCatalog; -import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; -import org.apache.pdfbox.pdmodel.interactive.form.PDField; -import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -29,7 +22,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import stirling.software.SPDF.model.api.converters.PdfToPdfARequest; -import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; import stirling.software.SPDF.utils.WebResponseUtils; @@ -41,13 +33,6 @@ public class ConvertPDFToPDFA { private static final Logger logger = LoggerFactory.getLogger(ConvertPDFToPDFA.class); - private final CustomPDDocumentFactory pdfDocumentFactory; - - @Autowired - public ConvertPDFToPDFA(CustomPDDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/pdf/pdfa") @Operation( summary = "Convert a PDF to a PDF/A", @@ -61,32 +46,7 @@ public class ConvertPDFToPDFA { // Convert MultipartFile to byte[] byte[] pdfBytes = inputFile.getBytes(); - // Load the PDF document - PDDocument document = pdfDocumentFactory.load(pdfBytes); - - // Get the document catalog - PDDocumentCatalog catalog = document.getDocumentCatalog(); - - // Get the AcroForm - PDAcroForm acroForm = catalog.getAcroForm(); - if (acroForm != null) { - // Remove signature fields safely - List fieldsToRemove = - acroForm.getFields().stream() - .filter(field -> field instanceof PDSignatureField) - .collect(Collectors.toList()); - - if (!fieldsToRemove.isEmpty()) { - acroForm.flatten(fieldsToRemove, false); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - document.save(baos); - pdfBytes = baos.toByteArray(); - } - } - document.close(); - - // Save the uploaded (and possibly modified) file to a temporary location + // Save the uploaded file to a temporary location Path tempInputFile = Files.createTempFile("input_", ".pdf"); try (OutputStream outputStream = new FileOutputStream(tempInputFile.toFile())) { outputStream.write(pdfBytes); @@ -95,28 +55,37 @@ public class ConvertPDFToPDFA { // Prepare the output file path Path tempOutputFile = Files.createTempFile("output_", ".pdf"); - // Prepare the OCRmyPDF command + // Prepare the ghostscript command List command = new ArrayList<>(); - command.add("ocrmypdf"); - command.add("--skip-text"); - command.add("--tesseract-timeout=0"); - command.add("--output-type"); - command.add(outputFormat.toString()); - command.add(tempInputFile.toString()); + command.add("gs"); + command.add("-dPDFA=" + ("pdfa".equals(outputFormat) ? "2" : "1")); + command.add("-dNOPAUSE"); + command.add("-dBATCH"); + command.add("-sColorConversionStrategy=UseDeviceIndependentColor"); + command.add("-sDEVICE=pdfwrite"); + command.add("-dPDFACompatibilityPolicy=2"); + command.add("-o"); command.add(tempOutputFile.toString()); + command.add(tempInputFile.toString()); ProcessExecutorResult returnCode = - ProcessExecutor.getInstance(ProcessExecutor.Processes.OCR_MY_PDF) + ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT) .runCommandWithOutputHandling(command); + if (returnCode.getRc() != 0) { + logger.info( + outputFormat + " conversion failed with return code: " + returnCode.getRc()); + } + try { - PDDocument doc = pdfDocumentFactory.load(tempOutputFile.toFile()); + byte[] pdfBytesOutput = Files.readAllBytes(tempOutputFile); // Return the optimized PDF as a response String outputFilename = Filenames.toSimpleFileName(inputFile.getOriginalFilename()) .replaceFirst("[.][^.]+$", "") + "_PDFA.pdf"; - return WebResponseUtils.pdfDocToWebResponse(doc, outputFilename); + return WebResponseUtils.bytesToWebResponse( + pdfBytesOutput, outputFilename, MediaType.APPLICATION_PDF); } finally { // Clean up the temporary files Files.deleteIfExists(tempInputFile); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java index 266fbd35b..3dff43e84 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java @@ -90,22 +90,35 @@ public class ExtractImagesController { // Iterate over each page for (int pgNum = 0; pgNum < document.getPages().getCount(); pgNum++) { PDPage page = document.getPage(pgNum); - int pageNum = document.getPages().indexOf(page) + 1; - // Submit a task for processing each page Future future = executor.submit( () -> { - extractImagesFromPage( - page, - format, - filename, - pageNum, - processedImages, - zos, - allowDuplicates); - return null; + // Use the page number directly from the iterator, so no need to + // calculate manually + int pageNum = document.getPages().indexOf(page) + 1; + + try { + // Call the image extraction method for each page + extractImagesFromPage( + page, + format, + filename, + pageNum, + processedImages, + zos, + allowDuplicates); + } catch (IOException e) { + // Log the error and continue processing other pages + logger.error( + "Error extracting images from page {}: {}", + pageNum, + e.getMessage()); + } + + return null; // Callable requires a return type }); + // Add the Future object to the list to track completion futures.add(future); } diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index edf93176b..284c43534 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=تغيير #pdfToPDFA pdfToPDFA.title=PDF إلى PDF/A pdfToPDFA.header=PDF إلى PDF/A -pdfToPDFA.credit=تستخدم هذه الخدمة OCRmyPDF لتحويل PDF/A. +pdfToPDFA.credit=تستخدم هذه الخدمة ghostscript لتحويل PDF/A. pdfToPDFA.submit=تحويل pdfToPDFA.tip=لا يعمل حاليًا لمدخلات متعددة في وقت واحد pdfToPDFA.outputFormat=تنسيق الإخراج diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index 859fb0a2c..e6df3a6c8 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Промени #pdfToPDFA pdfToPDFA.title=PDF към PDF/A pdfToPDFA.header=PDF към PDF/A -pdfToPDFA.credit=Тази услуга използва OCRmyPDF за PDF/A преобразуване. +pdfToPDFA.credit=Тази услуга използва ghostscript за PDF/A преобразуване. pdfToPDFA.submit=Преобразуване pdfToPDFA.tip=В момента не работи за няколко входа наведнъж pdfToPDFA.outputFormat=Изходен формат diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index afa0eb1d1..43647bd83 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Canvia #pdfToPDFA pdfToPDFA.title=PDF a PDF/A pdfToPDFA.header=PDF a PDF/A -pdfToPDFA.credit=Utilitza OCRmyPDF per la conversió a PDF/A +pdfToPDFA.credit=Utilitza ghostscript per la conversió a PDF/A pdfToPDFA.submit=Converteix pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index ef0cdb264..dba3c988d 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Změnit #pdfToPDFA pdfToPDFA.title=PDF na PDF/A pdfToPDFA.header=PDF na PDF/A -pdfToPDFA.credit=Tato služba používá OCRmyPDF pro konverzi do formátu PDF/A +pdfToPDFA.credit=Tato služba používá ghostscript pro konverzi do formátu PDF/A pdfToPDFA.submit=Převést pdfToPDFA.tip=V současné době nepracuje pro více vstupů najednou pdfToPDFA.outputFormat=Výstupní formát diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties index 1260d104a..4f914d7ed 100644 --- a/src/main/resources/messages_da_DK.properties +++ b/src/main/resources/messages_da_DK.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Ændre #pdfToPDFA pdfToPDFA.title=PDF Til PDF/A pdfToPDFA.header=PDF Til PDF/A -pdfToPDFA.credit=Denne tjeneste bruger OCRmyPDF til PDF/A-konvertering +pdfToPDFA.credit=Denne tjeneste bruger ghostscript til PDF/A-konvertering pdfToPDFA.submit=Konvertér pdfToPDFA.tip=Fungerer i øjeblikket ikke for flere input på én gang pdfToPDFA.outputFormat=Outputformat diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index ceaf679ca..754745a29 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -77,10 +77,10 @@ color=Farbe sponsor=Sponsor info=Informationen -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy +legal.privacy=Datenschutz +legal.terms=AGB +legal.accessibility=Barrierefreiheit +legal.cookie=Cookie-Richtlinie legal.impressum=Impressum ############### @@ -1023,7 +1023,7 @@ changeMetadata.submit=Ändern #pdfToPDFA pdfToPDFA.title=PDF zu PDF/A pdfToPDFA.header=PDF zu PDF/A -pdfToPDFA.credit=Dieser Dienst verwendet OCRmyPDF für die PDF/A-Konvertierung +pdfToPDFA.credit=Dieser Dienst verwendet ghostscript für die PDF/A-Konvertierung pdfToPDFA.submit=Konvertieren pdfToPDFA.tip=Dieser Dienst kann nur einzelne Eingangsdateien verarbeiten. pdfToPDFA.outputFormat=Ausgabeformat diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index 6e4c1df4b..c48b8564d 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Αλλαγή #pdfToPDFA pdfToPDFA.title=PDF σε PDF/A pdfToPDFA.header=PDF σε PDF/A -pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί OCRmyPDF για PDF/A μετατροπή +pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί ghostscript για PDF/A μετατροπή pdfToPDFA.submit=Μετατροπή pdfToPDFA.tip=Προς το παρόν δεν λειτουργεί για πολλαπλές εισόδους ταυτόχρονα pdfToPDFA.outputFormat=Output format diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index 51f91898e..d1ef95c76 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -1028,7 +1028,7 @@ changeMetadata.submit=Change #pdfToPDFA pdfToPDFA.title=PDF To PDF/A pdfToPDFA.header=PDF To PDF/A -pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion +pdfToPDFA.credit=This service uses ghostscript for PDF/A conversion pdfToPDFA.submit=Convert pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index 3fcfa3d5b..027530b22 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Change #pdfToPDFA pdfToPDFA.title=PDF To PDF/A pdfToPDFA.header=PDF To PDF/A -pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion +pdfToPDFA.credit=This service uses ghostscript for PDF/A conversion pdfToPDFA.submit=Convert pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 31dcacd51..7c0e8b0c3 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Cambiar #pdfToPDFA pdfToPDFA.title=PDF a PDF/A pdfToPDFA.header=PDF a PDF/A -pdfToPDFA.credit=Este servicio usa OCRmyPDF para la conversión a PDF/A +pdfToPDFA.credit=Este servicio usa ghostscript para la conversión a PDF/A pdfToPDFA.submit=Convertir pdfToPDFA.tip=Actualmente no funciona para múltiples entrada a la vez pdfToPDFA.outputFormat=Formato de salida diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 1ebbf542e..c8e3b8f3a 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Aldatu #pdfToPDFA pdfToPDFA.title=PDFa PDF/A bihurtu pdfToPDFA.header=PDFa PDF/A bihurtu -pdfToPDFA.credit=Zerbitzu honek OCRmyPDF erabiltzen du PDFak PDF/A bihurtzeko +pdfToPDFA.credit=Zerbitzu honek ghostscript erabiltzen du PDFak PDF/A bihurtzeko pdfToPDFA.submit=Bihurtu pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index b563103ea..3e78e7a3f 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Modifier #pdfToPDFA pdfToPDFA.title=PDF en PDF/A pdfToPDFA.header=PDF en PDF/A -pdfToPDFA.credit=Ce service utilise OCRmyPDF pour la conversion en PDF/A. +pdfToPDFA.credit=Ce service utilise ghostscript pour la conversion en PDF/A. pdfToPDFA.submit=Convertir pdfToPDFA.tip=Ne fonctionne actuellement pas pour plusieurs entrées à la fois pdfToPDFA.outputFormat=Format de sortie diff --git a/src/main/resources/messages_ga_IE.properties b/src/main/resources/messages_ga_IE.properties index 8223da8af..07d728165 100644 --- a/src/main/resources/messages_ga_IE.properties +++ b/src/main/resources/messages_ga_IE.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Athrú #pdfToPDFA pdfToPDFA.title=PDF Go PDF/A pdfToPDFA.header=PDF Go PDF/A -pdfToPDFA.credit=Úsáideann an tseirbhís seo OCRmyPDF chun PDF/A a thiontú +pdfToPDFA.credit=Úsáideann an tseirbhís seo ghostscript chun PDF/A a thiontú pdfToPDFA.submit=Tiontaigh pdfToPDFA.tip=Faoi láthair ní oibríonn sé le haghaidh ionchuir iolracha ag an am céanna pdfToPDFA.outputFormat=Formáid aschuir diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 4c7137a1a..1cda37128 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=बदलें #pdfToPDFA pdfToPDFA.title=PDF से PDF/A में pdfToPDFA.header=PDF से PDF/A में -pdfToPDFA.credit=इस सेवा में PDF/A परिवर्तन के लिए OCRmyPDF का उपयोग किया जाता है। +pdfToPDFA.credit=इस सेवा में PDF/A परिवर्तन के लिए ghostscript का उपयोग किया जाता है। pdfToPDFA.submit=परिवर्तित करें pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index 980bda1a9..fd69ac86f 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Promijeniti #pdfToPDFA pdfToPDFA.title=PDF u PDF/A pdfToPDFA.header=PDF u PDF/A -pdfToPDFA.credit=Ova usluga koristi OCRmyPDF za PDF/A pretvorbu +pdfToPDFA.credit=Ova usluga koristi ghostscript za PDF/A pretvorbu pdfToPDFA.submit=Pretvoriti pdfToPDFA.tip=Trenutno ne radi za više unosa odjednom pdfToPDFA.outputFormat=Izlazni format diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index 11f1d8bac..c2c53163d 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Módosítás #pdfToPDFA pdfToPDFA.title=PDF >> PDF/A pdfToPDFA.header=PDF >> PDF/A -pdfToPDFA.credit=Ez a szolgáltatás az OCRmyPDF-t használja a PDF/A konverzióhoz +pdfToPDFA.credit=Ez a szolgáltatás az ghostscript-t használja a PDF/A konverzióhoz pdfToPDFA.submit=Konvertálás pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index dba627cd9..fcf8e5e82 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Ganti #pdfToPDFA pdfToPDFA.title=PDF Ke PDF/A pdfToPDFA.header=PDF ke PDF/A -pdfToPDFA.credit=Layanan ini menggunakan OCRmyPDF untuk konversi PDF/A. +pdfToPDFA.credit=Layanan ini menggunakan ghostscript untuk konversi PDF/A. pdfToPDFA.submit=Konversi pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 9798fb348..6191f7a0d 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -81,7 +81,7 @@ legal.privacy=Informativa sulla privacy legal.terms=Termini e Condizioni legal.accessibility=Accessibilità legal.cookie=Informativa sui cookie -legal.impressum=Impressum +legal.impressum=Informazioni legali ############### # Pipeline # @@ -1023,7 +1023,7 @@ changeMetadata.submit=Cambia proprietà #pdfToPDFA pdfToPDFA.title=Da PDF a PDF/A pdfToPDFA.header=Da PDF a PDF/A -pdfToPDFA.credit=Questo servizio utilizza OCRmyPDF per la conversione in PDF/A. +pdfToPDFA.credit=Questo servizio utilizza ghostscript per la conversione in PDF/A. pdfToPDFA.submit=Converti pdfToPDFA.tip=Attualmente non funziona per più input contemporaneamente pdfToPDFA.outputFormat=Formato di output diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index c0a441b8d..afb8ff548 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=フォントサイズ +addPageNumbers.fontName=フォント名 pdfPrompt=PDFを選択 multiPdfPrompt=PDFを選択 (2つ以上) multiPdfDropPrompt=PDFを選択 (又はドラッグ&ドロップ) @@ -77,11 +77,11 @@ color=色 sponsor=スポンサー info=Info -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=プライバシーポリシー +legal.terms=利用規約 +legal.accessibility=アクセシビリティ +legal.cookie=Cookieポリシー +legal.impressum=著作権利者情報 ############### # Pipeline # @@ -198,13 +198,13 @@ adminUserSettings.forceChange=ログイン時にユーザー名/パスワード adminUserSettings.submit=ユーザーの保存 adminUserSettings.changeUserRole=ユーザーの役割を変更する adminUserSettings.authenticated=認証済 -adminUserSettings.editOwnProfil=Edit own profile -adminUserSettings.enabledUser=enabled user -adminUserSettings.disabledUser=disabled user -adminUserSettings.activeUsers=Active Users: -adminUserSettings.disabledUsers=Disabled Users: -adminUserSettings.totalUsers=Total Users: -adminUserSettings.lastRequest=Last Request +adminUserSettings.editOwnProfil=プロフィールの編集 +adminUserSettings.enabledUser=有効なユーザー +adminUserSettings.disabledUser=無効なユーザー +adminUserSettings.activeUsers=アクティブユーザー: +adminUserSettings.disabledUsers=無効なユーザー: +adminUserSettings.totalUsers=ユーザー合計: +adminUserSettings.lastRequest=最後のリクエスト database.title=データベースのインポート/エクスポート @@ -496,21 +496,21 @@ login.locked=あなたのアカウントはロックされています。 login.signinTitle=サインインしてください login.ssoSignIn=シングルサインオンでログイン login.oauth2AutoCreateDisabled=OAuth 2自動作成ユーザーが無効 -login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. +login.oauth2AdminBlockedUser=現在、未登録ユーザーの登録またはログインはブロックされています。管理者にお問い合わせください。 login.oauth2RequestNotFound=認証リクエストが見つかりません login.oauth2InvalidUserInfoResponse=無効なユーザー情報の応答 login.oauth2invalidRequest=無効なリクエスト login.oauth2AccessDenied=アクセス拒否 login.oauth2InvalidTokenResponse=無効なトークン応答 login.oauth2InvalidIdToken=無効なIDトークン -login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. +login.userIsDisabled=ユーザーは非アクティブ化されており、現在このユーザー名でのログインはブロックされています。管理者に連絡してください。 #auto-redact autoRedact.title=自動塗りつぶし autoRedact.header=自動塗りつぶし autoRedact.colorLabel=カラー -autoRedact.textsToRedactLabel=編集するテキスト (line-separated) +autoRedact.textsToRedactLabel=編集するテキスト(行区切り) autoRedact.textsToRedactPlaceholder=例 \n機密 \n極秘 autoRedact.useRegexLabel=正規表現を使用する autoRedact.wholeWordSearchLabel=単語単位の検索 @@ -679,7 +679,7 @@ pageLayout.submit=送信 scalePages.title=ページの縮尺の調整 scalePages.header=ページの縮尺の調整 scalePages.pageSize=1ページのサイズ -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=元のサイズ scalePages.scaleFactor=1ページの拡大レベル (トリミング)。 scalePages.submit=送信 @@ -728,8 +728,8 @@ removeAnnotations.submit=削除 #compare compare.title=比較 compare.header=PDFの比較 -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=ハイライトカラー 1: +compare.highlightColor.2=ハイライトカラー 2: compare.document.1=ドキュメント 1 compare.document.2=ドキュメント 2 compare.submit=比較 @@ -781,7 +781,7 @@ ScannerImageSplit.selectText.7=最小輪郭面積: ScannerImageSplit.selectText.8=画像の最小の輪郭面積のしきい値を設定。 ScannerImageSplit.selectText.9=境界線サイズ: ScannerImageSplit.selectText.10=出力に白い縁取りが出ないように追加・削除される境界線の大きさを設定 (初期値:1)。 -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=Pythonがインストールされていません。実行する必要があります。 #OCR @@ -808,7 +808,7 @@ ocr.submit=OCRでPDFを処理する extractImages.title=画像の抽出 extractImages.header=画像の抽出 extractImages.selectText=抽出した画像のフォーマットを選択 -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=重複した画像を保存する extractImages.submit=抽出 @@ -864,7 +864,7 @@ pdfOrganiser.mode.6=奇数-偶数分割 pdfOrganiser.mode.7=最初に削除 pdfOrganiser.mode.8=最後を削除 pdfOrganiser.mode.9=最初と最後を削除 -pdfOrganiser.mode.10=Odd-Even Merge +pdfOrganiser.mode.10=奇数-偶数の結合 pdfOrganiser.placeholder=(例:1,3,2または4-8,2,10-12または2n-1) @@ -933,7 +933,7 @@ pdfToImage.color=カラー pdfToImage.grey=グレースケール pdfToImage.blackwhite=白黒 (データが失われる可能性があります!) pdfToImage.submit=変換 -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=Pythonがインストールされていません。WebPの変換に必要です。 #addPassword @@ -970,7 +970,7 @@ watermark.selectText.6=高さスペース (各透かし間の垂直方向のス watermark.selectText.7=不透明度 (0% - 100%): watermark.selectText.8=透かしの種類: watermark.selectText.9=透かしの画像: -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.10=PDFをPDFイメージに変換する watermark.submit=透かしを追加 watermark.type.1=テキスト watermark.type.2=画像 @@ -1023,7 +1023,7 @@ changeMetadata.submit=変更 #pdfToPDFA pdfToPDFA.title=PDFをPDF/Aに変換 pdfToPDFA.header=PDFをPDF/Aに変換 -pdfToPDFA.credit=本サービスはPDF/Aの変換にOCRmyPDFを使用しています。 +pdfToPDFA.credit=本サービスはPDF/Aの変換にghostscriptを使用しています。 pdfToPDFA.submit=変換 pdfToPDFA.tip=現在、一度に複数の入力に対して機能しません pdfToPDFA.outputFormat=Output format diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 3c47f3c5e..02d5c3da2 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=변경 #pdfToPDFA pdfToPDFA.title=PDF를 PDF/A로 pdfToPDFA.header=PDF 문서를 PDF/A로 변환 -pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 OCRmyPDF 문서를 사용합니다. +pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 ghostscript 문서를 사용합니다. pdfToPDFA.submit=변환 pdfToPDFA.tip=현재 한 번에 여러 입력에 대해 작동하지 않습니다. pdfToPDFA.outputFormat=Output format diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index 643e9ebef..391c7e696 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Wijzigen #pdfToPDFA pdfToPDFA.title=PDF naar PDF/A pdfToPDFA.header=PDF naar PDF/A -pdfToPDFA.credit=Deze service gebruikt OCRmyPDF voor PDF/A-conversie +pdfToPDFA.credit=Deze service gebruikt ghostscript voor PDF/A-conversie pdfToPDFA.submit=Converteren pdfToPDFA.tip=Werkt momenteel niet voor meerdere inputs tegelijkertijd. pdfToPDFA.outputFormat=Output format diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index 73309cb22..1592c3e13 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Endre #pdfToPDFA pdfToPDFA.title=PDF til PDF/A pdfToPDFA.header=PDF til PDF/A -pdfToPDFA.credit=Denne tjenesten bruker OCRmyPDF for PDF/A-konvertering +pdfToPDFA.credit=Denne tjenesten bruker ghostscript for PDF/A-konvertering pdfToPDFA.submit=Konverter pdfToPDFA.tip=Fungere for øyeblikket ikke for flere innganger samtidig pdfToPDFA.outputFormat=Utdataformat diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 0800397aa..76a98ad36 100755 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Zmień #pdfToPDFA pdfToPDFA.title=PDF na PDF/A pdfToPDFA.header=PDF na PDF/A -pdfToPDFA.credit=Ta usługa używa OCRmyPDF do konwersji PDF/A +pdfToPDFA.credit=Ta usługa używa ghostscript do konwersji PDF/A pdfToPDFA.submit=Konwertuj pdfToPDFA.tip=Tylko jeden plik na raz pdfToPDFA.outputFormat=Format wyjściowy: diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index f6e93ba25..61a6d7fa0 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=Tamanho da fonte +addPageNumbers.fontName=Nome da fonte pdfPrompt=Selecione PDF(s) multiPdfPrompt=Selecione PDFs (2+) multiPdfDropPrompt=Selecione (ou arraste e solte) todos os PDFs necessários @@ -77,11 +77,11 @@ color=Cor sponsor=Patrocine info=Informações -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=Política de Privacidade +legal.terms=Termos e Condições +legal.accessibility=Acessibilidade +legal.cookie=Política de Cookies +legal.impressum=Informações legais ############### # Pipeline # @@ -507,12 +507,12 @@ login.userIsDisabled=O usuário está desativado, o login está atualmente bloqu #auto-redact -autoRedact.title=Auto ocultar -autoRedact.header=Auto ocultar +autoRedact.title=Redigir automaticamente +autoRedact.header=Redigir automaticamente autoRedact.colorLabel=Cor -autoRedact.textsToRedactLabel=Text para ocultar (separado por linha) +autoRedact.textsToRedactLabel=Texto para redigir (separado por linha) autoRedact.textsToRedactPlaceholder=por exemplo: \nConfidencial \nSecreto -autoRedact.useRegexLabel=Usar Regex (Regular Expressions) +autoRedact.useRegexLabel=Usar Regex (expressão regular) autoRedact.wholeWordSearchLabel=Pesquisa de palavras inteiras autoRedact.customPaddingLabel=Preenchimento extra personalizado autoRedact.convertPDFToImageLabel=Converter PDF em imagem PDF (Usado para remover o texto atrás da caixa) @@ -679,7 +679,7 @@ pageLayout.submit=Enviar scalePages.title=Ajustar Tamanho/Escala da Página scalePages.header=Ajustar Tamanho/Escala da Página scalePages.pageSize=Tamanho de uma página do documento. -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=Tamanho original scalePages.scaleFactor=Fator de zoom (corte) de uma página. scalePages.submit=Enviar @@ -781,7 +781,7 @@ ScannerImageSplit.selectText.7=Área mínima de contorno: ScannerImageSplit.selectText.8=Define o limite mínimo da área de contorno para uma foto ScannerImageSplit.selectText.9=Tamanho da borda: ScannerImageSplit.selectText.10=Define o tamanho da borda adicionada e removida para evitar bordas brancas na saída (padrão: 1). -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=Python não está instalado. É necessário para executar. #OCR @@ -808,7 +808,7 @@ ocr.submit=Processar PDF com OCR extractImages.title=Extrair imagens extractImages.header=Extrair imagens extractImages.selectText=Selecione o formato de imagem para converter as imagens extraídas -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=Salvar imagens duplicadas extractImages.submit=Extrair @@ -933,7 +933,7 @@ pdfToImage.color=Colorida pdfToImage.grey=Escala de Cinza pdfToImage.blackwhite=Preto e Branco (pode perder de dados!) pdfToImage.submit=Converter -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=Python não está instalado. Necessário para conversão WebP. #addPassword @@ -1023,7 +1023,7 @@ changeMetadata.submit=Alterar #pdfToPDFA pdfToPDFA.title=PDF para PDF/A pdfToPDFA.header=PDF para PDF/A -pdfToPDFA.credit=Este serviço usa OCRmyPDF para conversão de PDF/A +pdfToPDFA.credit=Este serviço usa ghostscript para conversão de PDF/A pdfToPDFA.submit=Converter pdfToPDFA.tip=Atualmente não funciona para múltiplas entradas ao mesmo tempo pdfToPDFA.outputFormat=Formato de saída diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index bce2fb452..a5f9f48b2 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Mudar #pdfToPDFA pdfToPDFA.title=PDF para PDF/A pdfToPDFA.header=PDF para PDF/A -pdfToPDFA.credit=Este serviço usa OCRmyPDF para Conversão de PDF/A +pdfToPDFA.credit=Este serviço usa ghostscript para Conversão de PDF/A pdfToPDFA.submit=Converter pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 7c8004549..e035ee7fa 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Schimbă #pdfToPDFA pdfToPDFA.title=PDF către PDF/A pdfToPDFA.header=PDF către PDF/A -pdfToPDFA.credit=Acest serviciu utilizează OCRmyPDF pentru conversia în PDF/A +pdfToPDFA.credit=Acest serviciu utilizează ghostscript pentru conversia în PDF/A pdfToPDFA.submit=Convertește pdfToPDFA.tip=În prezent nu funcționează pentru mai multe intrări simultan pdfToPDFA.outputFormat=Format de ieșire diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 4c02d9349..a4001a498 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Изменить #pdfToPDFA pdfToPDFA.title=PDF в PDF/A pdfToPDFA.header=PDF в PDF/A -pdfToPDFA.credit=Этот сервис использует OCRmyPDF для преобразования PDF/A +pdfToPDFA.credit=Этот сервис использует ghostscript для преобразования PDF/A pdfToPDFA.submit=Конвертировать pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index 968f29a85..1b9bb358e 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Zmeniť #pdfToPDFA pdfToPDFA.title=PDF na PDF/A pdfToPDFA.header=PDF na PDF/A -pdfToPDFA.credit=Táto služba používa OCRmyPDF na konverziu PDF/A +pdfToPDFA.credit=Táto služba používa ghostscript na konverziu PDF/A pdfToPDFA.submit=Konvertovať pdfToPDFA.tip=Momentálne nefunguje pre viacero vstupov naraz pdfToPDFA.outputFormat=Výstupný formát diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index 6744321fa..900edc079 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Promeni #pdfToPDFA pdfToPDFA.title=PDF u PDF/A pdfToPDFA.header=PDF u PDF/A -pdfToPDFA.credit=Ova usluga koristi OCRmyPDF za konverziju u PDF/A format +pdfToPDFA.credit=Ova usluga koristi ghostscript za konverziju u PDF/A format pdfToPDFA.submit=Konvertuj pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index 9a6232b41..d13164942 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Ändra #pdfToPDFA pdfToPDFA.title=PDF till PDF/A pdfToPDFA.header=PDF till PDF/A -pdfToPDFA.credit=Denna tjänst använder OCRmyPDF för PDF/A-konvertering +pdfToPDFA.credit=Denna tjänst använder ghostscript för PDF/A-konvertering pdfToPDFA.submit=Konvertera pdfToPDFA.tip=Fungerar för närvarande inte för flera inmatningar samtidigt pdfToPDFA.outputFormat=Utdataformat diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties index c8e6232e9..bcccaad86 100644 --- a/src/main/resources/messages_th_TH.properties +++ b/src/main/resources/messages_th_TH.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=เปลี่ยน #pdfToPDFA pdfToPDFA.title=PDF เป็น PDF/A pdfToPDFA.header=PDF เป็น PDF/A -pdfToPDFA.credit=บริการนี้ใช้ OCRmyPDF สำหรับการแปลง PDF/A +pdfToPDFA.credit=บริการนี้ใช้ ghostscript สำหรับการแปลง PDF/A pdfToPDFA.submit=แปลง pdfToPDFA.tip=ปัจจุบันไม่ทำงานสำหรับการป้อนข้อมูลหลายรายการพร้อมกัน pdfToPDFA.outputFormat=รูปแบบผลลัพธ์ diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 0dd75373f..2958f9dbe 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Değiştir #pdfToPDFA pdfToPDFA.title=PDF'den PDF/A'ya pdfToPDFA.header=PDF'den PDF/A'ya -pdfToPDFA.credit=Bu hizmet PDF/A dönüşümü için OCRmyPDF kullanır +pdfToPDFA.credit=Bu hizmet PDF/A dönüşümü için ghostscript kullanır pdfToPDFA.submit=Dönüştür pdfToPDFA.tip=Şu anda aynı anda birden fazla giriş için çalışmıyor pdfToPDFA.outputFormat=Çıkış formatı diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index e91a09fd5..8a06a720f 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Змінити #pdfToPDFA pdfToPDFA.title=PDF в PDF/A pdfToPDFA.header=PDF в PDF/A -pdfToPDFA.credit=Цей сервіс використовує OCRmyPDF для перетворення у формат PDF/A +pdfToPDFA.credit=Цей сервіс використовує ghostscript для перетворення у формат PDF/A pdfToPDFA.submit=Конвертувати pdfToPDFA.tip=Наразі не працює для кількох вхідних файлів одночасно pdfToPDFA.outputFormat=Вихідний формат diff --git a/src/main/resources/messages_vi_VN.properties b/src/main/resources/messages_vi_VN.properties index 6d417a969..245129e98 100644 --- a/src/main/resources/messages_vi_VN.properties +++ b/src/main/resources/messages_vi_VN.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=Thay đổi #pdfToPDFA pdfToPDFA.title=PDF sang PDF/A pdfToPDFA.header=PDF sang PDF/A -pdfToPDFA.credit=Dịch vụ này sử dụng OCRmyPDF để chuyển đổi PDF/A +pdfToPDFA.credit=Dịch vụ này sử dụng ghostscript để chuyển đổi PDF/A pdfToPDFA.submit=Chuyển đổi pdfToPDFA.tip=Hiện tại không hoạt động với nhiều đầu vào cùng lúc pdfToPDFA.outputFormat=Định dạng đầu ra diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index a1c2059ad..80e9e0cf5 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=更改 #pdfToPDFA pdfToPDFA.title=PDF转PDF/A pdfToPDFA.header=将PDF转换为PDF/A -pdfToPDFA.credit=此服务使用OCRmyPDF进行PDF/A转换 +pdfToPDFA.credit=此服务使用ghostscript进行PDF/A转换 pdfToPDFA.submit=转换 pdfToPDFA.tip=目前不支持上传多个 pdfToPDFA.outputFormat=输出格式 diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index 6b523d134..221e46af4 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -1023,7 +1023,7 @@ changeMetadata.submit=變更 #pdfToPDFA pdfToPDFA.title=PDF 轉 PDF/A pdfToPDFA.header=PDF 轉 PDF/A -pdfToPDFA.credit=此服務使用 OCRmyPDF 進行 PDF/A 轉換 +pdfToPDFA.credit=此服務使用 ghostscript 進行 PDF/A 轉換 pdfToPDFA.submit=轉換 pdfToPDFA.tip=目前不支援上傳多個 pdfToPDFA.outputFormat=輸出格式 diff --git a/src/main/resources/static/css/home.css b/src/main/resources/static/css/home.css index 07a1350fe..782e336da 100644 --- a/src/main/resources/static/css/home.css +++ b/src/main/resources/static/css/home.css @@ -10,6 +10,26 @@ outline-color: var(--md-sys-color-outline-variant); } +#filtersContainer { + display: flex; + width: 100%; + align-items: center; + justify-content: center; + gap: 10px; +} + +.filter-button { + color: var(--md-sys-color-secondary); + user-select: none; + cursor: pointer; + transition: transform 0.3s; + transform-origin: center center; +} + +.filter-button:hover { + transform: scale(1.08); +} + .search-icon { position: absolute; margin: 0.75rem 1rem; @@ -17,9 +37,50 @@ } .features-container { + display: flex; + flex-direction: column; + gap: 30px; +} + +.feature-group { + display: flex; + flex-direction: column; +} + +.feature-group-header { + display: flex; + align-items: center; + justify-content: flex-start; + color: var(--md-sys-color-on-surface); + margin-bottom: 15px; + user-select: none; + cursor: pointer; + gap: 10px; +} + +.feature-group-container { display: grid; grid-template-columns: repeat(auto-fill, minmax(15rem, 3fr)); gap: 30px 30px; + transition: 0.5s all; + overflow: hidden; + margin: -20px; + padding: 20px; +} + +.feature-group.collapsed>.feature-group-container { + max-height: 0 !important; + margin: 0; + padding: 0; +} + +.header-expand-button { + transition: 0.5s all; + transform: rotate(90deg); +} + +.header-expand-button.collapsed { + transform: rotate(0deg); } .feature-card { @@ -151,5 +212,5 @@ } .hidden { - visibility: hidden; + visibility: hidden; } diff --git a/src/main/resources/static/css/navbar.css b/src/main/resources/static/css/navbar.css index a8845f297..ca543ee4a 100644 --- a/src/main/resources/static/css/navbar.css +++ b/src/main/resources/static/css/navbar.css @@ -136,7 +136,7 @@ span.icon-text::after { /* Dropdown Scrollbar*/ .scrollable-y { overflow-y: scroll; - height: 360px; + height: 190px; } .scrollable-y::-webkit-scrollbar { @@ -289,4 +289,4 @@ span.icon-text::after { .icon-hide { display: none; } -} \ No newline at end of file +} diff --git a/src/main/resources/static/js/homecard.js b/src/main/resources/static/js/homecard.js index 818e62e98..4cdecdb7e 100644 --- a/src/main/resources/static/js/homecard.js +++ b/src/main/resources/static/js/homecard.js @@ -22,6 +22,26 @@ function filterCards() { } } +function updateFavoritesSection() { + const favoritesContainer = document.getElementById("groupFavorites").querySelector(".feature-group-container"); + favoritesContainer.innerHTML = ""; + const cards = Array.from(document.querySelectorAll(".feature-card")); + let favoritesAmount = 0; + cards.forEach(card => { + if (localStorage.getItem(card.id) === "favorite") { + const duplicate = card.cloneNode(true); + favoritesContainer.appendChild(duplicate); + favoritesAmount++; + } + }); + if (favoritesAmount === 0) { + document.getElementById("groupFavorites").style.display = "none"; + } else { + document.getElementById("groupFavorites").style.display = "flex"; + }; + reorderCards(favoritesContainer); +}; + function toggleFavorite(element) { var span = element.querySelector("span.material-symbols-rounded"); var card = element.closest(".feature-card"); @@ -37,15 +57,17 @@ function toggleFavorite(element) { card.classList.remove("favorite"); localStorage.removeItem(cardId); } - reorderCards(); + reorderCards(card.parentNode); + updateFavoritesSection(); updateFavoritesDropdown(); filterCards(); } - -function reorderCards() { - var container = document.querySelector(".features-container"); - var cards = Array.from(container.getElementsByClassName("feature-card")); +function reorderCards(container) { + var cards = Array.from(container.querySelectorAll(".feature-card")); + cards.forEach(function (card) { + container.removeChild(card); + }); cards.sort(function (a, b) { var aIsFavorite = localStorage.getItem(a.id) === "favorite"; var bIsFavorite = localStorage.getItem(b.id) === "favorite"; @@ -55,19 +77,29 @@ function reorderCards() { if (b.id === "update-link") { return 1; } + if (aIsFavorite && !bIsFavorite) { return -1; } - if (!aIsFavorite && bIsFavorite) { + else if (!aIsFavorite && bIsFavorite) { return 1; } - return 0; + else { + return a.id > b.id; + } }); cards.forEach(function (card) { container.appendChild(card); }); } +function reorderAllCards() { + const containers = Array.from(document.querySelectorAll(".feature-group-container")); + containers.forEach(function (container) { + reorderCards(container); + }) +} + function initializeCards() { var cards = document.querySelectorAll(".feature-card"); cards.forEach(function (card) { @@ -79,21 +111,107 @@ function initializeCards() { card.classList.add("favorite"); } }); - reorderCards(); + reorderAllCards(); + updateFavoritesSection(); updateFavoritesDropdown(); filterCards(); } +function showFavoritesOnly() { + const groups = Array.from(document.querySelectorAll(".feature-group")); + if (localStorage.getItem("favoritesOnly") === "true") { + groups.forEach((group) => { + if (group.id !== "groupFavorites") { + group.style.display = "none"; + }; + }) + } else { + groups.forEach((group) => { + if (group.id !== "groupFavorites") { + group.style.display = "flex"; + }; + }) + }; +} + +function toggleFavoritesOnly() { + if (localStorage.getItem("favoritesOnly") === "true") { + localStorage.setItem("favoritesOnly", "false"); + } else { + localStorage.setItem("favoritesOnly", "true"); + } + showFavoritesOnly(); +} + +// Expands a feature group on true, collapses it on false and toggles state on null. +function expandCollapseToggle(group, expand = null) { + if (expand === null) { + group.classList.toggle("collapsed"); + group.querySelector(".header-expand-button").classList.toggle("collapsed"); + } else if (expand) { + group.classList.remove("collapsed"); + group.querySelector(".header-expand-button").classList.remove("collapsed"); + } else { + group.classList.add("collapsed"); + group.querySelector(".header-expand-button").classList.add("collapsed"); + } + + const collapsed = localStorage.getItem("collapsedGroups") ? JSON.parse(localStorage.getItem("collapsedGroups")) : []; + const groupIndex = collapsed.indexOf(group.id); + + if (group.classList.contains("collapsed")) { + if (groupIndex === -1) { + collapsed.push(group.id); + } + } else { + if (groupIndex !== -1) { + collapsed.splice(groupIndex, 1); + } + } + + localStorage.setItem("collapsedGroups", JSON.stringify(collapsed)); +} + +function expandCollapseAll(expandAll) { + const groups = Array.from(document.querySelectorAll(".feature-group")); + groups.forEach((group) => { + expandCollapseToggle(group, expandAll); + }) +} + window.onload = initializeCards; - document.addEventListener("DOMContentLoaded", function() { - const materialIcons = new FontFaceObserver('Material Symbols Rounded'); - - materialIcons.load().then(() => { - document.querySelectorAll('.feature-card.hidden').forEach(el => { - el.classList.remove('hidden'); - }); - }).catch(() => { - console.error('Material Symbols Rounded font failed to load.'); +document.addEventListener("DOMContentLoaded", function () { + const materialIcons = new FontFaceObserver('Material Symbols Rounded'); + + materialIcons.load().then(() => { + document.querySelectorAll('.feature-card.hidden').forEach(el => { + el.classList.remove('hidden'); }); + }).catch(() => { + console.error('Material Symbols Rounded font failed to load.'); }); + + Array.from(document.querySelectorAll(".feature-group-header")).forEach(header => { + const parent = header.parentNode; + const container = header.parentNode.querySelector(".feature-group-container"); + if (parent.id !== "groupFavorites") { + container.style.maxHeight = container.clientHeight + "px"; + } else { + container.style.maxHeight = "500px"; + } + header.onclick = () => { + expandCollapseToggle(parent); + }; + }) + + const collapsed = localStorage.getItem("collapsedGroups") ? JSON.parse(localStorage.getItem("collapsedGroups")) : []; + + Array.from(document.querySelectorAll(".feature-group")).forEach(group => { + if (collapsed.indexOf(group.id) !== -1) { + expandCollapseToggle(group, false); + } + }) + + showFavoritesOnly(); +}); diff --git a/src/main/resources/static/js/multitool/ImageHighlighter.js b/src/main/resources/static/js/multitool/ImageHighlighter.js index 7fc53209e..cf5d161a3 100644 --- a/src/main/resources/static/js/multitool/ImageHighlighter.js +++ b/src/main/resources/static/js/multitool/ImageHighlighter.js @@ -29,6 +29,7 @@ class ImageHighlighter { imageClickEvent.stopPropagation(); }; bigImg.src = highlightEvent.target.src; + bigImg.style.rotate = highlightEvent.target.style.rotate; this.imageHighlighter.appendChild(bigImg); } diff --git a/src/main/resources/templates/fragments/featureGroupHeader.html b/src/main/resources/templates/fragments/featureGroupHeader.html new file mode 100644 index 000000000..0a8f7e9b1 --- /dev/null +++ b/src/main/resources/templates/fragments/featureGroupHeader.html @@ -0,0 +1,6 @@ +
+ + + chevron_right + +
\ No newline at end of file diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html index 46189ad06..f8f85440c 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/home.html @@ -7,11 +7,9 @@ -
-
- +
@@ -30,9 +28,26 @@ search + +
+ + star + + + expand_all + + + collapse_all + + +
+
-