diff --git a/book1.PNG b/book1.PNG new file mode 100644 index 0000000..455d1c1 --- /dev/null +++ b/book1.PNG Binary files differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..247c3aa --- /dev/null +++ b/pom.xml @@ -0,0 +1,64 @@ + + + + 4.0.0 + + ru.mcs.udk + udk-pdf-scanner + 1 + jar + + + UTF-8 + 21 + 21 + udk-pdf-scanner + + + + + org.apache.pdfbox + pdfbox + 2.0.29 + + + net.sourceforge.tess4j + tess4j + 5.15.0 + + + + + + + + maven-assembly-plugin + 3.7.1 + + + jar-with-dependencies + + ${project.basedir}/jar + ${jar.finalName} + + + true + ru.mcs.udk.PdfScanner + + + + + + assemble-all + package + + single + + + + + + + + diff --git a/src/main/java/ru/mcs/udk/OCRTest.java b/src/main/java/ru/mcs/udk/OCRTest.java new file mode 100644 index 0000000..5ed4175 --- /dev/null +++ b/src/main/java/ru/mcs/udk/OCRTest.java @@ -0,0 +1,23 @@ +package ru.mcs.udk; + +import net.sourceforge.tess4j.Tesseract; +import net.sourceforge.tess4j.TesseractException; + +import java.io.File; + +public class OCRTest { + public static void main(String[] args) { + Tesseract tesseract = new Tesseract(); + tesseract.setDatapath("d:\\program\\Tesseract-OCR\\tessdata\\"); + tesseract.setLanguage("rus"); + + try { + String text = tesseract.doOCR(new File("book1.PNG")); + System.out.println(text); + String udk = PdfScanner.findUDK(text); + System.out.println("UDK " + udk); + } catch (TesseractException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/ru/mcs/udk/PdfScanner.java b/src/main/java/ru/mcs/udk/PdfScanner.java new file mode 100644 index 0000000..76d684e --- /dev/null +++ b/src/main/java/ru/mcs/udk/PdfScanner.java @@ -0,0 +1,90 @@ +package ru.mcs.udk; + +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.text.PDFTextStripper; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class PdfScanner { + public static void main(String[] args) throws FileNotFoundException { + if (args.length == 0) { + System.out.println("Пожалуйста, укажите путь к папке."); + return; + } + + String directoryPath = args[0]; + Path startDir = Paths.get(directoryPath); + + if (!Files.exists(startDir) || !Files.isDirectory(startDir)) { + System.out.println("Указанный путь не существует или не является папкой."); + return; + } + + System.setOut(new PrintStream(new FileOutputStream("book-list.csv"), true, StandardCharsets.UTF_8)); + try { + Files.walkFileTree(startDir, new SimpleFileVisitor<>() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { + if (file.toAbsolutePath().toString().matches(".*\\.pdf$")) { + // Выводим путь и имя файла + getUdk(file.toAbsolutePath()); + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) { + // Обрабатываем ошибки доступа к файлам + System.err.println("Ошибка доступа к файлу: " + file.toAbsolutePath() + " - " + exc.getMessage()); + return FileVisitResult.CONTINUE; + } + }); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void getUdk(Path filePath) { + File file = filePath.toFile(); + String languageBook = ""; + try (PDDocument document = PDDocument.load(file)) { + PDFTextStripper stripper = new PDFTextStripper(); + // Устанавливаем диапазон страниц для анализа (первые три страницы) + stripper.setStartPage(1); + stripper.setEndPage(Math.min(3, document.getNumberOfPages())); + + String text = stripper.getText(document); + String udk = findUDK(text); + + languageBook = isCyrillic(String.valueOf(filePath.getFileName())) ? "ru" : "en"; + + System.out.printf("%s;%s;%s;%s\n", filePath.toAbsolutePath(), Objects.requireNonNullElse(udk, ""), languageBook,""); + } catch (IOException e) { + System.out.printf("%s;%s;%s;%s\n", filePath.toAbsolutePath(), Objects.requireNonNullElse("", ""), languageBook, e.getMessage()); + } + } + + public static String findUDK(String text) { + // Регулярное выражение для поиска УДК + Pattern pattern = Pattern.compile("[Уу]\\s*[Дд]\\s*[Кк]\\s*([0-9.]+)"); + Matcher matcher = pattern.matcher(text); + + if (matcher.find()) { + return matcher.group(1); + } + return null; + } + + public static boolean isCyrillic(String fileName) { + String regex = ".*[\\p{IsCyrillic}]{3,}.*"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(fileName); + return matcher.matches(); + } +}