diff --git a/src/main/java/ru/mcs/udk/DJVUScanner.java b/src/main/java/ru/mcs/udk/DJVUScanner.java index d6d0b2a..3a3148d 100644 --- a/src/main/java/ru/mcs/udk/DJVUScanner.java +++ b/src/main/java/ru/mcs/udk/DJVUScanner.java @@ -11,8 +11,8 @@ public class DJVUScanner implements DocumentScanner { @Override - public void getUDK(File djvuFile) { - String udk = ""; + public DocumentInfo getUDK(File djvuFile) { + DocumentInfo documentInfo = new DocumentInfo(); for (int pageIndex = 0; pageIndex < 6; pageIndex++) { String outputFile = String.format("temp/page_%d.tiff", pageIndex); Process process; @@ -27,15 +27,12 @@ if (exitCode == 0) { BufferedImage image = ImageIO.read(new File(outputFile)); String text = DocumentUtils.getText(image); - udk = findUDK(text); + documentInfo.setUdk(findUDK(text)); } - } catch (InterruptedException | IOException e) { - throw new RuntimeException(e); - } catch (TesseractException e) { - e.printStackTrace(); + } catch (InterruptedException | IOException | TesseractException e) { + documentInfo.setError(e.getMessage()); } - } - System.out.printf("%s;%s;%s;%s\n", djvuFile.getPath(), udk, (udk != null && !udk.isEmpty()) ? "ru" : "", ""); + return documentInfo; } } diff --git a/src/main/java/ru/mcs/udk/DocumentInfo.java b/src/main/java/ru/mcs/udk/DocumentInfo.java new file mode 100644 index 0000000..19d1beb --- /dev/null +++ b/src/main/java/ru/mcs/udk/DocumentInfo.java @@ -0,0 +1,49 @@ +package ru.mcs.udk; + +public class DocumentInfo { + String language; + String udk; + long time; + String error; + String fileSize; + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getUdk() { + return udk; + } + + public void setUdk(String udk) { + this.udk = udk; + } + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getFileSize() { + return fileSize; + } + + public void setFileSize(String fileSize) { + this.fileSize = fileSize; + } +} diff --git a/src/main/java/ru/mcs/udk/DocumentScanner.java b/src/main/java/ru/mcs/udk/DocumentScanner.java index 5bdddef..3ce3016 100644 --- a/src/main/java/ru/mcs/udk/DocumentScanner.java +++ b/src/main/java/ru/mcs/udk/DocumentScanner.java @@ -5,5 +5,5 @@ public interface DocumentScanner { - void getUDK(File file) throws IOException, InterruptedException; + DocumentInfo getUDK(File file); } diff --git a/src/main/java/ru/mcs/udk/DocumentUtils.java b/src/main/java/ru/mcs/udk/DocumentUtils.java index 478d22f..585dc39 100644 --- a/src/main/java/ru/mcs/udk/DocumentUtils.java +++ b/src/main/java/ru/mcs/udk/DocumentUtils.java @@ -28,6 +28,10 @@ Tesseract tesseract = new Tesseract(); tesseract.setDatapath("d:\\program\\Tesseract-OCR\\tessdata\\"); tesseract.setLanguage("rus"); + tesseract.setVariable("user_defined_dpi", "300"); + // Настройки для маленьких изображений +// tesseract.setPageSegMode(7); // PSM_SINGLE_LINE (распознавание одной строки) +// tesseract.setVariable("tessedit_min_characters", "1"); // Минимальное количество символов return tesseract.doOCR(image); } diff --git a/src/main/java/ru/mcs/udk/PDFScanner.java b/src/main/java/ru/mcs/udk/PDFScanner.java index d043d29..6182db6 100644 --- a/src/main/java/ru/mcs/udk/PDFScanner.java +++ b/src/main/java/ru/mcs/udk/PDFScanner.java @@ -9,7 +9,7 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; -import java.util.Objects; +import java.text.DecimalFormat; import static ru.mcs.udk.DocumentUtils.findUDK; import static ru.mcs.udk.DocumentUtils.isCyrillic; @@ -17,33 +17,45 @@ public class PDFScanner implements DocumentScanner { @Override - public void getUDK(File file) { - String languageBook = ""; + public DocumentInfo getUDK(File file) { + // Засекаем время начала поиска + long startTime = System.currentTimeMillis(); + DocumentInfo documentInfo = new DocumentInfo(); + documentInfo.setError(""); + documentInfo.setUdk(""); + documentInfo.setFileSize(getSizeFile(file)); try (PDDocument document = Loader.loadPDF(file)) { PDFTextStripper stripper = new PDFTextStripper(); // Устанавливаем диапазон страниц для анализа (первые три страницы) stripper.setStartPage(1); stripper.setEndPage(Math.min(3, document.getNumberOfPages())); String text = stripper.getText(document); - String udk = findUDK(text); + documentInfo.setUdk(findUDK(text)); - languageBook = isCyrillic(file.getName()) ? "ru" : "en"; + documentInfo.setLanguage(isCyrillic(file.getName()) ? "ru" : "en"); - if ((udk == null || udk.isBlank()) && languageBook.equals("ru")) { - udk = getUdkByImage(document); + if ((documentInfo.getUdk() == null || documentInfo.getUdk().isBlank()) && documentInfo.getLanguage().equals("ru")) { + documentInfo.setUdk(getUdkByImage(document)); } - -// System.out.printf("%s;%s;%s;%s\n", file.getPath(), Objects.requireNonNullElse(udk, ""), languageBook, ""); } catch (IOException | TesseractException e) { - e.printStackTrace(); -// System.out.printf("%s;%s;%s;%s\n", file.getPath(), "", languageBook, e.getMessage()); + documentInfo.setError(e.getMessage()); } + long endTime = System.currentTimeMillis(); + documentInfo.setTime(endTime - startTime); + return documentInfo; + } + + private String getSizeFile(File file) { + double sizeInMB = (double) file.length() / (1024 * 1024); // Размер в мегабайтах + DecimalFormat df = new DecimalFormat("#.##"); // Форматирование до двух знаков после запятой + + return df.format(sizeInMB) + " Mb"; } private static String getUdkByImage(PDDocument document) throws IOException, TesseractException { PDFRenderer renderer = new PDFRenderer(document); - for (int pageIndex = 0; pageIndex < 5; pageIndex++) { + for (int pageIndex = 0; pageIndex < 6; pageIndex++) { BufferedImage image = renderer.renderImageWithDPI(pageIndex, 300); String text = DocumentUtils.getText(image); String udk = findUDK(text); diff --git a/src/main/java/ru/mcs/udk/UDKSearcher.java b/src/main/java/ru/mcs/udk/UDKSearcher.java index 0b82154..1903d73 100644 --- a/src/main/java/ru/mcs/udk/UDKSearcher.java +++ b/src/main/java/ru/mcs/udk/UDKSearcher.java @@ -1,16 +1,24 @@ package ru.mcs.udk; -import org.apache.commons.cli.*; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; -import java.io.*; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintStream; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; -import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; + public class UDKSearcher { @@ -55,7 +63,6 @@ findUdk(outputFile); - } catch (ParseException e) { System.out.println("Ошибка при разборе аргументов: " + e.getMessage()); printHelp(options); @@ -100,55 +107,39 @@ private static void findUdk(String outputFile) { try { - // Чтение всех строк из файла + // Чтение всех строк из CSV-файла List lines = Files.readAllLines(Paths.get(outputFile)); - AtomicInteger processedFiles = new AtomicInteger(); // Количество обработанных файлов + List updatedLines = new ArrayList<>(); + int processedFiles = 0; // Количество обработанных файлов int totalFiles = lines.size(); // Общее количество файлов + DocumentInfo documentInfo; + // Проход по каждой строке в CSV + for (String line : lines) { + String filePath = line.trim(); // Получаем путь к файлу + File file = new File(filePath); - // Обработка каждой строки - List updatedLines = lines.stream() - .map(line -> { - String filePath = line.trim(); // Получаем путь к файлу - File file = new File(filePath); + // Проверка, существует ли файл + if (file.exists() && file.isFile()) { + processedFiles++; - // Проверка, существует ли файл - if (file.exists() && file.isFile()) { - processedFiles.getAndIncrement(); - // Засекаем время начала поиска - long startTime = System.currentTimeMillis(); + // Получаем нужную реализацию сканера + DocumentScanner scanner = DocumentScannerFactory.getScanner(filePath); + // Ищем УДК номер + documentInfo = scanner.getUDK(file); - // Получаем нужную реализацию сканера - DocumentScanner scanner = DocumentScannerFactory.getScanner(filePath); - // Ищем в УДК номер - try { - scanner.getUDK(file); - } catch (IOException | InterruptedException e) { - System.out.println("Ошибка при работе с файлом: " + e.getMessage()); - } + // Вычисляем процент завершения + double progress = (double) processedFiles / totalFiles * 100; + System.out.printf("Прогресс: %.2f%%\r", progress); - // Засекаем время окончания поиска - long endTime = System.currentTimeMillis(); + updatedLines.add(String.format("%s;%s;%s;%s;%s;%s", line, documentInfo.getFileSize(), documentInfo.getTime(), documentInfo.getLanguage(), documentInfo.getUdk(), documentInfo.getError())); + } else { + updatedLines.add(String.format("%s;%s;%s;%s;%s;%s", line, "File not found", "", "", "", "")); // Если файл не найден + } - double sizeInMB = (double) file.length() / (1024 * 1024); // Размер в мегабайтах - DecimalFormat df = new DecimalFormat("#.##"); // Форматирование до двух знаков после запятой - - // Вычисляем процент завершения - double progress = (double) processedFiles.get() / totalFiles * 100; - System.out.printf("Прогресс: %.2f%%\r", progress); - - return String.format("%s;%s;%s", line, df.format(sizeInMB) + " MB", endTime - startTime); - } else { - return String.format("%s;%s;%s", line, "File not found", ""); // Если файл не найден - } - }) - .collect(Collectors.toList()); - - // Запись обновленных строк обратно в тот же файл - Files.write(Paths.get(outputFile), updatedLines); - - System.out.println("Результат записан в файл: " + outputFile); - + // Запись обновленных строк обратно в файл после обработки каждой строки + Files.write(Paths.get(outputFile), updatedLines); + } } catch (IOException e) { System.out.println("Ошибка при работе с файлом: " + e.getMessage()); }