/
Ded_fed
/
AutoConverter
Обзор
Документация
Войти
/
Ded_fed
/
AutoConverter
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
func.py
196 строк
13 KB
Ded_fed
Дописал проверку изменения файлов
08 май 2026, 13:14
08 май 2026, 13:14
c8baace
Код
Авторство
О чём код?
import os import subprocess import shutil import logging import time #import configparser from datetime import datetime from weasyprint import HTML # apt install weasyprint # apt install imagemagick # apt install poppler-utils # apt install libreoffice # apt install djvulibre-bin # apt install unoconv size_img = int('1100') checked_num = 3 sleep_time_sec = 1 find_str = 'JPEG' grey_dir = 'ЧБ' temp = "Временные_файлы" List_of_files = ["PDF","JPG", "JPEG", "PNG", "GIF", "TIF", "TIFF", "BMP", "WEBP", "PSD", "ODT", "DOC", "DOCX", "ODS", "HTML", "HTM", "DJVU", "DJV", "XLS", "XLSX", "CSV"] def get_file_list(dir_input, dir_output, orig_dir) : # Получаем список файлов в директории for file in os.listdir(dir_input): # Получаем полный путь к файлу fullname_file = os.path.join(dir_input, file) # Получаем размер и времени изменения файла old_file_size = os.path.getsize(fullname_file) old_file_modify = os.path.getmtime(fullname_file) # Проверка на наличии не докаченных данных test_num = 0 # Проверяем файл ли это if os.path.isfile(fullname_file): logging.debug(f'Файл {file} готов к обработке') # Цикл проверяющий наличие изменений до завершения работы функции for _ in range(checked_num): # Переменная для отслеживания отсутствия изменений check_bool = False # Время ожидания после проверки time.sleep(sleep_time_sec) # Проверяет существование файла if not os.path.exists(fullname_file): logging.debug('Файл был удалён во время обработки') # Переменной присваивается значение true если файла нет больше check_bool = True else: # Проверяет изменения размера файла if old_file_size != os.path.getsize(fullname_file): logging.debug('Файл изменялся во время выполнения программы') # Присвоить переменной истину при обнаружении отличной длины файла check_bool = True # Проверяет изменения времени последнего редактирования if old_file_modify != os.path.getmtime(fullname_file): logging.debug('Файл модифицируется во время выполнения программы') # Присвоит переменной истину при различающихся значениях времени модификации check_bool = True # Проверка если файла нет или изменялись данные тогда переменная будет равна нулевому значению в противном случае увеличиваем счетчик if check_bool == True : test_num = 0 else: test_num += 1 logging.debug(f"Прошло тестов успешно: {test_num} из {checked_num}.") # Если счетчик совпал с количеством попыток тогда продолжается работа функции if test_num == checked_num : # Проверяем, что файл имеет расширение из списка List_of_files if not os.path.isfile(os.path.join(dir_input ,str(file))) : logging.info(f"Пропущен объект (не файл): {file}") continue var = False for file_type in List_of_files: if file.upper().endswith(file_type): # Получаем дату и время работы с файлом (для создания папки в выходном каталоге) datetime_run_work_file = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") # Создаем папку для конвертации файла dir_output_file = os.path.join(str(dir_output), str(datetime_run_work_file) + '-' + str(file)) if not os.path.exists(dir_output_file): os.makedirs(dir_output_file, exist_ok=True) # Создаем временную папку в папке для конвертации файла temp_dir = os.path.join(str(dir_output_file), str(temp)) os.makedirs(temp_dir, exist_ok=True) # Передача параметров в функцию for_converter for_converter(fullname_file, dir_output_file, temp_dir, file_type, file) # Создаёт директорию для исходного файла и перемещает его туда logging.info(f'Файл обработан {file}') orig_dir_file = os.path.join(orig_dir, str(datetime_run_work_file)) os.makedirs(orig_dir_file, exist_ok=True) # Перемещение исходных данных в архив shutil.move(fullname_file, orig_dir_file) var = True break if not var: # Если не найдено подходящего формата, тогда создаётся новая папка с "НЕПОДХОДИТ" и переносится оригинальный файл в неё fullname_file = os.path.join(str(dir_input), str(file)) datetime_run_work_file = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") orig_dir_file = os.path.join(orig_dir, str(datetime_run_work_file) + "_НЕПОДХОДИТ") os.makedirs(orig_dir_file, exist_ok=True) shutil.move(fullname_file, orig_dir_file) logging.info(f"Файл пропущен (неподдерживаемый формат): {file}") def for_converter(fullname_file, dir_output_file, temp_dir, file_type, file) : # Сравнивает тип документа и запускаем соответствующую программу if str(file_type) == "PDF": try: subprocess.run(["pdftocairo", str(fullname_file), "-jpeg", os.path.join(str(temp_dir), file)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True) except subprocess.CalledProcessError as e: logging.error(f"Ошибка при обработке файла {file}: {e}") return converter(temp_dir, file, dir_output_file) elif str(file_type) in {"JPG", "JPEG", "PNG", "GIF", "TIF", "TIFF", "BMP", "WEBP", "PSD" } : try: subprocess.run(["convert", str(fullname_file), "-auto-orient", os.path.join(str(temp_dir), file + ".jpg")], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True) except subprocess.CalledProcessError as e: logging.error(f"Ошибка при обработке файла {file}: {e}") return converter(temp_dir, file, dir_output_file) elif str(file_type) in {"ODT", "DOC", "DOCX", "ODS", "XLS", "XLSX", "CSV"} : try: full_output=os.path.join(dir_output_file, file + ".pdf") subprocess.run(["unoconv", "-f", "pdf", "-o", full_output , fullname_file],stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True, timeout=300) except subprocess.CalledProcessError as e: logging.error(f"Ошибка при обработке файла {file}: {e}") return elif str(file_type) in {"HTML", "HTM"} : try: HTML(fullname_file).write_pdf(os.path.join(dir_output_file, file + ".pdf")) except Exception as e: logging.error(f"Ошибка при конвертации HTML в PDF {file}: {e}") return elif str(file_type) in {"DJVU", "DJV"} : try: subprocess.run(["ddjvu", "-format=pdf", fullname_file, os.path.join(dir_output_file, file + ".pdf")], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True) except subprocess.CalledProcessError as e: logging.error(f"Ошибка при обработке файла {file}: {e}") return try: subprocess.run(["pdftocairo", os.path.join(dir_output_file, file + ".pdf"), "-jpeg", os.path.join(str(temp_dir), file)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True) except subprocess.CalledProcessError as e: logging.error(f"Ошибка при обработке файла {file}: {e}") return converter(temp_dir, file, dir_output_file) try : shutil.rmtree(temp_dir) logging.debug(f"Временная папка удалена: {temp_dir}") except Exception as e: logging.error(f"Не удалось удалить временную папку {temp_dir}: {e}") def converter(temp_dir, file_name, dir_output_file) : grey_dir_output = os.path.join(str(dir_output_file), str(grey_dir)) os.makedirs(grey_dir_output, exist_ok=True) # Получить размеры изображения files = os.listdir(temp_dir) # Пройтись по всем картинкам for file in files: # Название входного файла full_path_to_temp_file = os.path.join(temp_dir,file) # Получим ширину и высоту изображения try : process = subprocess.check_output(["identify", "-format", "%w %h", full_path_to_temp_file]) except subprocess.CalledProcessError as e: logging.error(f"Ошибка при определении размера {file}: {e}") continue # Переведёт строку в число и проверить на соответствие размерам w, h = map(int, process.split()) # Проверка размера изображений. if (size_img >= w) and (size_img >= h) : logging.debug(f"Изображения не изменены, тк меньше или равно заданного значения: {file}") else: # Приводит изображение до нужных пропорций try: subprocess.run(["convert", full_path_to_temp_file, "-resize", str(size_img)+"x"+str(size_img), full_path_to_temp_file], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True) except subprocess.CalledProcessError as e: logging.error(f"Ошибка выполняющая resize у {file}: {e}") return # Преобразуем файл в чёрно-белый и сохраняет его в новую папку # Копирование изображения в исходную папку в папку готового. for name_img_file in os.listdir(str(temp_dir)) : try: subprocess.run(["convert", os.path.join(str(temp_dir), name_img_file), "-colorspace", "Gray", os.path.join(str(grey_dir_output), name_img_file)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True) except subprocess.CalledProcessError as e: logging.error(f"Ошибка при конвертации в ЧБ {file_name}: {e}") return shutil.copyfile(os.path.join(temp_dir, name_img_file), os.path.join(dir_output_file, name_img_file)) # Переводит все jpg в pdf. try: subprocess.run(["convert", str(temp_dir) + "/*.jpg", "-auto-orient", os.path.join(str(dir_output_file), file_name+".pdf")], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True) except subprocess.CalledProcessError as e: logging.error(f"Ошибка при создании PDF из JPEG {file_name}: {e}") return # Переводит всё Чб.jpg в PDF try: subprocess.run(["convert", str(grey_dir_output) + "/*.jpg", "-auto-orient", os.path.join(str(grey_dir_output), file_name+".pdf")], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True) except subprocess.CalledProcessError as e: logging.error(f"Ошибка при создании чёрно-белого PDF {file_name}: {e}") return