diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java b/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java index 42a99850..834c8711 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java @@ -1,10 +1,14 @@ package stirling.software.SPDF.controller.api.misc; import java.awt.AlphaComposite; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics2D; +import java.awt.RenderingHints; import java.awt.geom.AffineTransform; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Path2D; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.awt.image.BufferedImageOp; @@ -47,12 +51,11 @@ public class FakeScanControllerWIP { private static final Logger logger = LoggerFactory.getLogger(FakeScanControllerWIP.class); - //TODO - //@PostMapping(consumes = "multipart/form-data", value = "/fake-scan") - //@Operation( - // summary = "Repair a PDF file", - // description = - // "This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response.") + @PostMapping(consumes = "multipart/form-data", value = "/fake-scan") + @Operation( + summary = "Repair a PDF file", + description = + "This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response.") public ResponseEntity fakeScan(@ModelAttribute PDFFile request) throws IOException { MultipartFile inputFile = request.getFileInput(); @@ -91,18 +94,20 @@ public class FakeScanControllerWIP { public BufferedImage processImage(BufferedImage image) { // Rotation - image = rotate(image); + addDustAndHairs(image, 50); + // image = rotate(image, 1); + // image = softenEdges(image, 5); image = applyGaussianBlur(image, 0.5); - addGaussianNoise(image, 0.25); + addGaussianNoise(image, 0.8); image = linearStretch(image); return image; } - private BufferedImage rotate(BufferedImage image) { + private BufferedImage rotate(BufferedImage image, double rotation) { - double rotationRequired = Math.toRadians(1.0); + double rotationRequired = Math.toRadians(rotation); double locationX = image.getWidth() / 2; double locationY = image.getHeight() / 2; AffineTransform tx = @@ -144,6 +149,11 @@ public class FakeScanControllerWIP { BufferedImage output = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = output.createGraphics(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g2.setRenderingHint( + RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); + g2.drawImage(image, 0, 0, null); g2.setComposite(AlphaComposite.DstIn); g2.setPaint( @@ -177,6 +187,49 @@ public class FakeScanControllerWIP { return output; } + private void addDustAndHairs(BufferedImage image, float intensity) { + int width = image.getWidth(); + int height = image.getHeight(); + Graphics2D g2d = image.createGraphics(); + Random random = new SecureRandom(); + + // Set rendering hints for better quality + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + // Calculate the number of artifacts based on intensity + int numSpots = (int) (intensity * 10); + int numHairs = (int) (intensity * 20); + + // Add spots with more variable sizes + g2d.setColor(new Color(100, 100, 100, 50)); // Semi-transparent gray + for (int i = 0; i < numSpots; i++) { + int x = random.nextInt(width); + int y = random.nextInt(height); + int ovalSize = 1 + random.nextInt(3); // Base size + variable component + if (random.nextFloat() > 0.9) { + // 10% chance to get a larger spot + ovalSize += random.nextInt(3); + } + g2d.fill(new Ellipse2D.Double(x, y, ovalSize, ovalSize)); + } + + // Add hairs + g2d.setStroke(new BasicStroke(0.5f)); // Thin stroke for hairs + g2d.setColor(new Color(80, 80, 80, 40)); // Slightly lighter and more transparent + for (int i = 0; i < numHairs; i++) { + int x1 = random.nextInt(width); + int y1 = random.nextInt(height); + int x2 = x1 + random.nextInt(20) - 10; // Random length and direction + int y2 = y1 + random.nextInt(20) - 10; + Path2D.Double hair = new Path2D.Double(); + hair.moveTo(x1, y1); + hair.curveTo(x1, y1, (x1 + x2) / 2, (y1 + y2) / 2, x2, y2); + g2d.draw(hair); + } + + g2d.dispose(); + } + private void addGaussianNoise(BufferedImage image, double strength) { Random rand = new SecureRandom(); int width = image.getWidth(); diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index ac90792a..9591a3ed 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF إلى PDF / A pdfToPDFA.credit=تستخدم هذه الخدمة OCRmyPDF لتحويل PDF / A. pdfToPDFA.submit=تحويل pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index 6262d46d..ce3f8d60 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF към PDF/A pdfToPDFA.credit=Тази услуга използва OCRmyPDF за PDF/A преобразуване. pdfToPDFA.submit=Преобразуване pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 6071b16b..2a57ac2c 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF a PDF/A pdfToPDFA.credit=Utilitza OCRmyPDF per la conversió a PDF/A pdfToPDFA.submit=Converteix pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index 93ab31e2..452dcc12 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF σε PDF/A pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί OCRmyPDF για PDF/A μετατροπή pdfToPDFA.submit=Μετατροπή pdfToPDFA.tip=Προς το παρόν δεν λειτουργεί για πολλαπλές εισόδους ταυτόχρονα +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 867df9ac..4255b8e5 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF a PDF/A pdfToPDFA.credit=Este servicio usa OCRmyPDF para la conversión a PDF/A pdfToPDFA.submit=Convertir pdfToPDFA.tip=Actualmente no funciona para múltiples entrada a la vez +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 1f8f6b6d..2585b35b 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDFa PDF/A bihurtu pdfToPDFA.credit=Zerbitzu honek OCRmyPDF erabiltzen du PDFak PDF/A bihurtzeko pdfToPDFA.submit=Bihurtu pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index 3aa55d09..0ca7afc2 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF en PDF/A pdfToPDFA.credit=Ce service utilise OCRmyPDF pour la conversion en PDF/A. pdfToPDFA.submit=Convertir pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index b660d678..d10f61c3 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF से PDF/A में pdfToPDFA.credit=इस सेवा में PDF/A परिवर्तन के लिए OCRmyPDF का उपयोग किया जाता है। pdfToPDFA.submit=परिवर्तित करें pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index c9a4957b..4aa381f1 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF >> PDF/A pdfToPDFA.credit=Ez a szolgáltatás az OCRmyPDF-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 #PDFToWord diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index 3cbcc872..e0c4bdf7 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF ke PDF/A pdfToPDFA.credit=Layanan ini menggunakan OCRmyPDF untuk konversi PDF/A. pdfToPDFA.submit=Konversi pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 140a27f7..2456c454 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=Da PDF a PDF/A pdfToPDFA.credit=Questo servizio utilizza OCRmyPDF per la conversione in PDF/A. pdfToPDFA.submit=Converti pdfToPDFA.tip=Attualmente non funziona per più input contemporaneamente +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index fed17883..1d208b2e 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDFをPDF/Aに変換 pdfToPDFA.credit=本サービスはPDF/Aの変換にOCRmyPDFを使用しています。 pdfToPDFA.submit=変換 pdfToPDFA.tip=現在、一度に複数の入力に対して機能しません +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 3b1d3441..282d6801 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF 문서를 PDF/A로 변환 pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 OCRmyPDF 문서를 사용합니다. pdfToPDFA.submit=변환 pdfToPDFA.tip=현재 한 번에 여러 입력에 대해 작동하지 않습니다. +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index e5668210..a80c4eb4 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF naar PDF/A pdfToPDFA.credit=Deze service gebruikt OCRmyPDF voor PDF/A-conversie pdfToPDFA.submit=Converteren pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index c94f72cb..20a12405 100644 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF na PDF/A pdfToPDFA.credit=Ta usługa używa OCRmyPDF do konwersji PDF/A pdfToPDFA.submit=Konwertuj pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index b03402be..b615f286 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF para PDF/A pdfToPDFA.credit=Este serviço usa OCRmyPDF para Conversão de PDF/A pdfToPDFA.submit=Converter pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index c1662afe..4e2b196a 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF para PDF/A pdfToPDFA.credit=Este serviço usa OCRmyPDF para Conversão de PDF/A pdfToPDFA.submit=Converter pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 949f34cf..94fff40d 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF către PDF/A pdfToPDFA.credit=Acest serviciu utilizează OCRmyPDF pentru conversia în PDF/A pdfToPDFA.submit=Convert pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 3d20fc0b..446ab288 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF в PDF/A pdfToPDFA.credit=Этот сервис использует OCRmyPDF для преобразования PDF/A pdfToPDFA.submit=Конвертировать pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index 7cdd2f24..03a10d77 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF u PDF/A pdfToPDFA.credit=Ova usluga koristi OCRmyPDF za konverziju u PDF/A format pdfToPDFA.submit=Konvertuj pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index afa34270..445bce87 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF till PDF/A pdfToPDFA.credit=Denna tjänst använder OCRmyPDF för PDF/A-konvertering pdfToPDFA.submit=Konvertera pdfToPDFA.tip=Currently does not work for multiple inputs at once +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 2ec0bd6b..5d5c70f4 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF'den PDF/A'ya pdfToPDFA.credit=Bu hizmet PDF/A dönüşümü için OCRmyPDF kullanır pdfToPDFA.submit=Dönüştür pdfToPDFA.tip=Şu anda aynı anda birden fazla giriş için çalışmıyor +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index 8a77d064..b4ad1f42 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF в PDF/A pdfToPDFA.credit=Цей сервіс використовує OCRmyPDF для перетворення у формат PDF/A pdfToPDFA.submit=Конвертувати pdfToPDFA.tip=Наразі не працює для кількох вхідних файлів одночасно +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index f10f3930..8c38e232 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF转换为PDF/A pdfToPDFA.credit=此服务使用OCRmyPDF进行PDF/A转换 pdfToPDFA.submit=转换 pdfToPDFA.tip=目前不支持上传多个 +pdfToPDFA.outputFormat=Output format #PDFToWord diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index c2cfbadb..70aaff46 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -941,6 +941,7 @@ pdfToPDFA.header=PDF 轉 PDF/A pdfToPDFA.credit=此服務使用 OCRmyPDF 進行 PDF/A 轉換 pdfToPDFA.submit=轉換 pdfToPDFA.tip=目前不支援上傳多個 +pdfToPDFA.outputFormat=Output format #PDFToWord