mirror of
				https://github.com/Frooodle/Stirling-PDF.git
				synced 2025-10-25 11:17:28 +02:00 
			
		
		
		
	Extract images enhancements (#1757)
* fix * extarct images * langs * logging * cuke fix --------- Co-authored-by: a <a>
This commit is contained in:
		
							parent
							
								
									63dfcfe688
								
							
						
					
					
						commit
						47314a0f38
					
				
										
											Binary file not shown.
										
									
								
							| @ -95,7 +95,7 @@ Feature: API Validation | ||||
| 
 | ||||
| 
 | ||||
|   @extract-images | ||||
|   Scenario Outline: Extract Image Scans | ||||
|   Scenario Outline: Extract Image Scans duplicates | ||||
|     Given I use an example file at "exampleFiles/images.pdf" as parameter "fileInput" | ||||
|     And the request data includes | ||||
|       | parameter        | value       | | ||||
| @ -103,7 +103,7 @@ Feature: API Validation | ||||
|     When I send the API request to the endpoint "/api/v1/misc/extract-images" | ||||
|     Then the response content type should be "application/octet-stream" | ||||
| 	And the response file should have extension ".zip" | ||||
| 	And the response ZIP should contain 20 files | ||||
| 	And the response ZIP should contain 2 files | ||||
|     And the response file should have size greater than 0 | ||||
| 	And the response status code should be 200 | ||||
| 	 | ||||
| @ -112,5 +112,3 @@ Feature: API Validation | ||||
|     | png        |  | ||||
|     | gif         | | ||||
|     | jpeg        |  | ||||
| 
 | ||||
| 	 | ||||
|  | ||||
| @ -5,6 +5,9 @@ import java.awt.image.BufferedImage; | ||||
| import java.awt.image.RenderedImage; | ||||
| import java.io.ByteArrayOutputStream; | ||||
| import java.io.IOException; | ||||
| import java.security.MessageDigest; | ||||
| import java.security.NoSuchAlgorithmException; | ||||
| import java.util.Arrays; | ||||
| import java.util.HashSet; | ||||
| import java.util.Set; | ||||
| import java.util.concurrent.ExecutionException; | ||||
| @ -36,7 +39,8 @@ import io.github.pixee.security.Filenames; | ||||
| import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.PDFWithImageFormatRequest; | ||||
| import stirling.software.SPDF.model.api.PDFExtractImagesRequest; | ||||
| import stirling.software.SPDF.utils.ImageProcessingUtils; | ||||
| import stirling.software.SPDF.utils.WebResponseUtils; | ||||
| 
 | ||||
| @RestController | ||||
| @ -51,11 +55,11 @@ public class ExtractImagesController { | ||||
|             summary = "Extract images from a PDF file", | ||||
|             description = | ||||
|                     "This endpoint extracts images from a given PDF file and returns them in a zip file. Users can specify the output image format. Input: PDF Output: IMAGE/ZIP Type: SIMO") | ||||
|     public ResponseEntity<byte[]> extractImages(@ModelAttribute PDFWithImageFormatRequest request) | ||||
|     public ResponseEntity<byte[]> extractImages(@ModelAttribute PDFExtractImagesRequest request) | ||||
|             throws IOException, InterruptedException, ExecutionException { | ||||
|         MultipartFile file = request.getFileInput(); | ||||
|         String format = request.getFormat(); | ||||
| 
 | ||||
|         boolean allowDuplicates = request.isAllowDuplicates(); | ||||
|         System.out.println( | ||||
|                 System.currentTimeMillis() + " file=" + file.getName() + ", format=" + format); | ||||
|         PDDocument document = Loader.loadPDF(file.getBytes()); | ||||
| @ -75,7 +79,7 @@ public class ExtractImagesController { | ||||
|         String filename = | ||||
|                 Filenames.toSimpleFileName(file.getOriginalFilename()) | ||||
|                         .replaceFirst("[.][^.]+$", ""); | ||||
|         Set<Integer> processedImages = new HashSet<>(); | ||||
|         Set<byte[]> processedImages = new HashSet<>(); | ||||
| 
 | ||||
|         if (useMultithreading) { | ||||
|             // Executor service to handle multithreading | ||||
| @ -92,7 +96,13 @@ public class ExtractImagesController { | ||||
|                         executor.submit( | ||||
|                                 () -> { | ||||
|                                     extractImagesFromPage( | ||||
|                                             page, format, filename, pageNum, processedImages, zos); | ||||
|                                             page, | ||||
|                                             format, | ||||
|                                             filename, | ||||
|                                             pageNum, | ||||
|                                             processedImages, | ||||
|                                             zos, | ||||
|                                             allowDuplicates); | ||||
|                                     return null; | ||||
|                                 }); | ||||
| 
 | ||||
| @ -110,7 +120,8 @@ public class ExtractImagesController { | ||||
|             // Single-threaded extraction | ||||
|             for (int pgNum = 0; pgNum < document.getPages().getCount(); pgNum++) { | ||||
|                 PDPage page = document.getPage(pgNum); | ||||
|                 extractImagesFromPage(page, format, filename, pgNum + 1, processedImages, zos); | ||||
|                 extractImagesFromPage( | ||||
|                         page, format, filename, pgNum + 1, processedImages, zos, allowDuplicates); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| @ -137,21 +148,34 @@ public class ExtractImagesController { | ||||
|             String format, | ||||
|             String filename, | ||||
|             int pageNum, | ||||
|             Set<Integer> processedImages, | ||||
|             ZipOutputStream zos) | ||||
|             Set<byte[]> processedImages, | ||||
|             ZipOutputStream zos, | ||||
|             boolean allowDuplicates) | ||||
|             throws IOException { | ||||
|         MessageDigest md; | ||||
|         try { | ||||
|             md = MessageDigest.getInstance("MD5"); | ||||
|         } catch (NoSuchAlgorithmException e) { | ||||
|             logger.error("MD5 algorithm not available for extractImages hash.", e); | ||||
|             return; | ||||
|         } | ||||
|         if (page.getResources() == null || page.getResources().getXObjectNames() == null) { | ||||
|             return; | ||||
|         } | ||||
|         int count = 1; | ||||
|         for (COSName name : page.getResources().getXObjectNames()) { | ||||
|             if (page.getResources().isImageXObject(name)) { | ||||
|                 PDImageXObject image = (PDImageXObject) page.getResources().getXObject(name); | ||||
|                 int imageHash = image.hashCode(); | ||||
|                 synchronized (processedImages) { | ||||
|                     if (processedImages.contains(imageHash)) { | ||||
|                         continue; // Skip already processed images | ||||
|                 if (!allowDuplicates) { | ||||
|                     byte[] data = ImageProcessingUtils.getImageData(image.getImage()); | ||||
|                     byte[] imageHash = md.digest(data); | ||||
|                     synchronized (processedImages) { | ||||
|                         if (processedImages.stream() | ||||
|                                 .anyMatch(hash -> Arrays.equals(hash, imageHash))) { | ||||
|                             continue; // Skip already processed images | ||||
|                         } | ||||
|                         processedImages.add(imageHash); | ||||
|                     } | ||||
|                     processedImages.add(imageHash); | ||||
|                 } | ||||
| 
 | ||||
|                 RenderedImage renderedImage = image.getImage(); | ||||
| @ -160,7 +184,7 @@ public class ExtractImagesController { | ||||
|                 BufferedImage bufferedImage = convertToRGB(renderedImage, format); | ||||
| 
 | ||||
|                 // Write image to zip file | ||||
|                 String imageName = filename + "_" + imageHash + " (Page " + pageNum + ")." + format; | ||||
|                 String imageName = filename + "_page_" + pageNum + "_" + count++ + "." + format; | ||||
|                 synchronized (zos) { | ||||
|                     zos.putNextEntry(new ZipEntry(imageName)); | ||||
|                     ByteArrayOutputStream imageBaos = new ByteArrayOutputStream(); | ||||
|  | ||||
| @ -0,0 +1,16 @@ | ||||
| package stirling.software.SPDF.model.api; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| 
 | ||||
| @Data | ||||
| @EqualsAndHashCode(callSuper = true) | ||||
| public class PDFExtractImagesRequest extends PDFWithImageFormatRequest { | ||||
| 
 | ||||
|     @Schema( | ||||
|             description = | ||||
|                     "Boolean to enable/disable the saving of duplicate images, true to enable duplicates") | ||||
|     private boolean allowDuplicates; | ||||
| } | ||||
| @ -262,4 +262,5 @@ public class GeneralUtils { | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,10 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| 
 | ||||
| import java.awt.image.BufferedImage; | ||||
| import java.awt.image.DataBuffer; | ||||
| import java.awt.image.DataBufferByte; | ||||
| import java.awt.image.DataBufferInt; | ||||
| import java.nio.ByteBuffer; | ||||
| 
 | ||||
| public class ImageProcessingUtils { | ||||
| 
 | ||||
| @ -29,4 +33,30 @@ public class ImageProcessingUtils { | ||||
|         } | ||||
|         return convertedImage; | ||||
|     } | ||||
| 
 | ||||
|     public static byte[] getImageData(BufferedImage image) { | ||||
|         DataBuffer dataBuffer = image.getRaster().getDataBuffer(); | ||||
|         if (dataBuffer instanceof DataBufferByte) { | ||||
|             return ((DataBufferByte) dataBuffer).getData(); | ||||
|         } else if (dataBuffer instanceof DataBufferInt) { | ||||
|             int[] intData = ((DataBufferInt) dataBuffer).getData(); | ||||
|             ByteBuffer byteBuffer = ByteBuffer.allocate(intData.length * 4); | ||||
|             byteBuffer.asIntBuffer().put(intData); | ||||
|             return byteBuffer.array(); | ||||
|         } else { | ||||
|             int width = image.getWidth(); | ||||
|             int height = image.getHeight(); | ||||
|             byte[] data = new byte[width * height * 3]; | ||||
|             int index = 0; | ||||
|             for (int y = 0; y < height; y++) { | ||||
|                 for (int x = 0; x < width; x++) { | ||||
|                     int rgb = image.getRGB(x, y); | ||||
|                     data[index++] = (byte) ((rgb >> 16) & 0xFF); // Red | ||||
|                     data[index++] = (byte) ((rgb >> 8) & 0xFF); // Green | ||||
|                     data[index++] = (byte) (rgb & 0xFF); // Blue | ||||
|                 } | ||||
|             } | ||||
|             return data; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=معالجة PDF باستخدام OCR | ||||
| extractImages.title=استخراج الصور | ||||
| extractImages.header=استخراج الصور | ||||
| extractImages.selectText=حدد تنسيق الصورة لتحويل الصور المستخرجة إلى | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=استخراج | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Обработка на PDF чрез OCR | ||||
| extractImages.title=Извличане на изображения | ||||
| extractImages.header=Извличане на изображения | ||||
| extractImages.selectText=Изберете формат на изображението, в който да преобразувате извлечените изображения | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Извличане | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Processa PDF amb OCR | ||||
| extractImages.title=Extreu Imatges | ||||
| extractImages.header=Extreu Imatges | ||||
| extractImages.selectText=Selecciona el format d'imatge al qual convertir les imatges extretes | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Extreu | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Zpracovat PDF s OCR | ||||
| extractImages.title=Extrahovat obrázky | ||||
| extractImages.header=Extrahovat obrázky | ||||
| extractImages.selectText=Vyberte formát obrázku pro extrahované obrázky | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Extrahovat | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| ########### | ||||
| # Generic # | ||||
| ########### | ||||
| # the direction that the language is written (ltr = left to right, rtl = right to left) | ||||
| # the direction that the language is written (ltr=left to right, rtl = right to left) | ||||
| language.direction=ltr | ||||
| 
 | ||||
| pdfPrompt=Vælg PDF-fil(er) | ||||
| @ -802,6 +802,7 @@ ocr.submit=Process PDF with OCR | ||||
| extractImages.title=Extract Images | ||||
| extractImages.header=Extract Images | ||||
| extractImages.selectText=Select image format to convert extracted images to | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Extract | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -4,7 +4,7 @@ | ||||
| # the direction that the language is written (ltr=left to right, rtl = right to left) | ||||
| language.direction=ltr | ||||
| 
 | ||||
| pdfPrompwt=PDF auswählen | ||||
| pdfPrompt=Select PDF(s) | ||||
| multiPdfPrompt=PDFs auswählen(2+) | ||||
| multiPdfDropPrompt=Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin) | ||||
| imgPrompt=Wählen Sie ein Bild | ||||
| @ -802,6 +802,7 @@ ocr.submit=PDF mit OCR verarbeiten | ||||
| extractImages.title=Bilder extrahieren | ||||
| extractImages.header=Bilder extrahieren | ||||
| extractImages.selectText=Wählen Sie das Bildformat aus, in das extrahierte Bilder konvertiert werden sollen | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Extrahieren | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Επεξεργασία PDF με OCR | ||||
| extractImages.title=Εξαγωγή Εικόνων | ||||
| extractImages.header=Εξαγωγή Εικόνων | ||||
| extractImages.selectText=Επιλέξτε μορφή εικόνας για να μετατρέψετε τις εξαγόμενες εικόνες | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Εξαγωγή | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Process PDF with OCR | ||||
| extractImages.title=Extract Images | ||||
| extractImages.header=Extract Images | ||||
| extractImages.selectText=Select image format to convert extracted images to | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Extract | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Process PDF with OCR | ||||
| extractImages.title=Extract Images | ||||
| extractImages.header=Extract Images | ||||
| extractImages.selectText=Select image format to convert extracted images to | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Extract | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Procesar PDF con OCR | ||||
| extractImages.title=Extraer imágenes | ||||
| extractImages.header=Extraer imágenes | ||||
| extractImages.selectText=Seleccionar el formato de imagen para convertir las imágenes extraídas | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Extraer | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=PDF prozesatu OCR-rekin | ||||
| extractImages.title=Atera irudiak | ||||
| extractImages.header=Atera irudiak | ||||
| extractImages.selectText=Hautatu irudi-formatua ateratako irudiak bihurtzeko | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Atera | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Traiter | ||||
| extractImages.title=Extraire les images | ||||
| extractImages.header=Extraire les images | ||||
| extractImages.selectText=Format d’image dans lequel convertir les images extraites | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Extraire | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| ########### | ||||
| # Generic # | ||||
| ########### | ||||
| # the direction that the language is written (ltr = left to right, rtl = right to left) | ||||
| # the direction that the language is written (ltr=left to right, rtl = right to left) | ||||
| language.direction=ltr | ||||
| 
 | ||||
| pdfPrompt=Roghnaigh PDF(s) | ||||
| @ -802,6 +802,7 @@ ocr.submit=Próiseáil PDF le OCR | ||||
| extractImages.title=Sliocht Íomhánna | ||||
| extractImages.header=Sliocht Íomhánna | ||||
| extractImages.selectText=Roghnaigh formáid íomhá chun íomhánna bainte a thiontú go | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Sliocht | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=OCR के साथ PDF प्रोसेस करें | ||||
| extractImages.title=छवियां निकालें | ||||
| extractImages.header=छवियां निकालें | ||||
| extractImages.selectText=निकाली गई छवियों को कन्वर्ट करने के लिए छवि प्रारूप चुनें | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=निकालें | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Obradi PDF sa OCR-om | ||||
| extractImages.title=Ekstrakt slika | ||||
| extractImages.header=Ekstrakt slika | ||||
| extractImages.selectText=Odaberite format slike za pretvaranje izdvojenih slika | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Izdvajanje | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=PDF feldolgozása OCR-rel | ||||
| extractImages.title=Képek kinyerése | ||||
| extractImages.header=Képek kinyerése | ||||
| extractImages.selectText=Válassza ki a képformátumot a kinyert képek konvertálásához | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Kinyerés | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Memproses PDF dengan OCR | ||||
| extractImages.title=Ekstrak Gambar | ||||
| extractImages.header=Mengekstrak Gambar | ||||
| extractImages.selectText=Pilih format gambar yang akan dikonversi | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Ekstrak | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Scansiona testo nel PDF con OCR | ||||
| extractImages.title=Estrai immagini | ||||
| extractImages.header=Estrai immagini | ||||
| extractImages.selectText=Seleziona il formato in cui salvare le immagini estratte | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Estrai | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=OCRでPDFを処理する | ||||
| extractImages.title=画像の抽出 | ||||
| extractImages.header=画像の抽出 | ||||
| extractImages.selectText=抽出した画像のフォーマットを選択 | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=抽出 | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=인식 | ||||
| extractImages.title=이미지 추출 | ||||
| extractImages.header=이미지 추출 | ||||
| extractImages.selectText=추출된 이미지를 변환할 이미지 형식을 선택합니다. | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=추출 | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Verwerk PDF met OCR | ||||
| extractImages.title=Afbeeldingen extraheren | ||||
| extractImages.header=Afbeeldingen extraheren | ||||
| extractImages.selectText=Selecteer het beeldformaat voor geëxtraheerde afbeeldingen | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Extraheer | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Behandle PDF med OCR | ||||
| extractImages.title=Hent ut bilder | ||||
| extractImages.header=Hent ut bilder | ||||
| extractImages.selectText=Velg bildeformat for å konvertere de hentede bildene til | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Hent ut | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Przetwarzaj PDF za pomocą OCR | ||||
| extractImages.title=Wyodrębnij obrazy | ||||
| extractImages.header=Wyodrębnij obrazy | ||||
| extractImages.selectText=Wybierz format obrazu, na który chcesz przekonwertować wyodrębniony obraz. | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Wyodrębnij | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,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.submit=Extrair | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,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.submit=Extrair | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Procesează PDF-ul cu OCR | ||||
| extractImages.title=Extrage Imagini | ||||
| extractImages.header=Extrage Imagini | ||||
| extractImages.selectText=Selectați formatul imaginii în care să se convertească imaginile extrase | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Extrage | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Обработка PDF с OCR | ||||
| extractImages.title=Извлечь изображения | ||||
| extractImages.header=Извлечь изображения | ||||
| extractImages.selectText=Выберите формат изображения для преобразования извлеченных изображений в | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Извлечь | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Spracovať PDF s OCR | ||||
| extractImages.title=Extrahovať obrázky | ||||
| extractImages.header=Extrahovať obrázky | ||||
| extractImages.selectText=Vyberte formát obrázka na konverziu extrahovaných obrázkov | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Extrahovať | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Obradi PDF sa OCR-om | ||||
| extractImages.title=Izdvajanje slika | ||||
| extractImages.header=Izdvajanje slika | ||||
| extractImages.selectText=Odaberite format slike za konvertovanje izdvojenih slika | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Izdvajanje | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Bearbeta PDF med OCR | ||||
| extractImages.title=Extrahera bilder | ||||
| extractImages.header=Extrahera bilder | ||||
| extractImages.selectText=Välj bildformat att konvertera extraherade bilder till | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Extrahera | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=ประมวลผล PDF ด้วย OCR | ||||
| extractImages.title=แยกรูปภาพ | ||||
| extractImages.header=แยกรูปภาพ | ||||
| extractImages.selectText=เลือกรูปแบบภาพที่จะใช้ในการแปลงรูปภาพที่แยกได้ | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=แยก | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=PDF'i OCR(Metin Tanıma) ile İşle | ||||
| extractImages.title=Resimleri Çıkar | ||||
| extractImages.header=Resimleri Çıkar | ||||
| extractImages.selectText=Çıkarılan resimleri dönüştürmek için resim formatını seçin | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Çıkar | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=Обробка PDF з OCR | ||||
| extractImages.title=Витягнути зображення | ||||
| extractImages.header=Витягнути зображення | ||||
| extractImages.selectText=Виберіть формат зображення для перетворення витягнутих зображень у | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Витягнути | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| ########### | ||||
| # Generic # | ||||
| ########### | ||||
| # the direction that the language is written (ltr = left to right, rtl = right to left) | ||||
| # the direction that the language is written (ltr=left to right, rtl = right to left) | ||||
| language.direction=ltr | ||||
| 
 | ||||
| pdfPrompt=Chọn (các) tệp PDF | ||||
| @ -802,6 +802,7 @@ ocr.submit=Xử lý PDF với OCR | ||||
| extractImages.title=Trích xuất hình ảnh | ||||
| extractImages.header=Trích xuất hình ảnh | ||||
| extractImages.selectText=Chọn định dạng hình ảnh để chuyển đổi hình ảnh đã trích xuất | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=Trích xuất | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=用OCR处理PDF | ||||
| extractImages.title=提取图像 | ||||
| extractImages.header=提取图像 | ||||
| extractImages.selectText=选择图像格式,将提取的图像转换为 | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=提取 | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -802,6 +802,7 @@ ocr.submit=使用 OCR 處理 PDF | ||||
| extractImages.title=提取圖片 | ||||
| extractImages.header=提取圖片 | ||||
| extractImages.selectText=選擇要轉換提取影像的影像格式 | ||||
| extractImages.allowDuplicates=Save duplicate images | ||||
| extractImages.submit=提取 | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -27,6 +27,10 @@ | ||||
|                     <option value="gif">GIF</option> | ||||
|                   </select> | ||||
|                 </div> | ||||
|                 <div class="mb-3"> | ||||
|                   <input type="checkbox" name="allowDuplicates" id="allowDuplicates"> | ||||
|                   <label for="allowDuplicates" th:text="#{extractImages.allowDuplicates}"></label> | ||||
|                 </div> | ||||
|                 <button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{extractImages.submit}"></button> | ||||
|               </form> | ||||
|             </div> | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user