Python script that generates a lot of decrees from samples. Скрипт для генерации файлов приказов из образцов.
$ python3 gen.py -h
usage: gen.py [-h] [-i] [-f format] [-s path] [-o path] [-v] size
Decrees generator
positional arguments:
size Max size of output dir. For example: 10KB, 10MB, 10GB
options:
-h, --help show this help message and exit
-i, --image use images (logo, signature, seal) in decree
-f format, --format format
formats to save (docx: d, pdf: p, jpg: j)
-s path, --samples path
path to dir with samples
-o path, --out path path for output files
-v, --verbose verbose output
Example: python3 gen.py 50MB -f dp -s samples -o decrees -vv
$ python3 gen.py 50MB -i -f dp -s samples/ -o output_decrees/
2022-12-04 20:38:42.542 | WARNING | __main__:main:169 - Generation is started...
2022-12-04 20:39:15.208 | WARNING | __main__:generate:136 - Approximate generation time: 1.13 min.
2022-12-04 20:39:52.709 | WARNING | __main__:generate:124 - Size of output_decrees/ dir: 53422132 bytes
2022-12-04 20:39:52.709 | WARNING | __main__:main:171 - Generation is finished!
Проект содержит в себе:
-
raw/img
- директория, в которой содержатся изображения, используемые вREADME.md
; -
samples
– директория, в которой содержатся размеченные данные для генерации приказов; -
.gitignore
; -
README.md
; -
auxil.py
- модуль, содержащий вспомогательные функции; -
change_case.py
– модуль, позволяющий склонять инструкции и ответственных по падежам; -
consts.py
– модуль, содержащий основные константные параметры, используемые при генерации; -
gen.py
- основной файл проекта; -
requirements.txt
; -
russian_datetime.py
- надстройка над классомdate
встроенного модуляdatetime
; -
write.py
– модуль, содержащий функции для создания файлов с приказами.
Модуль с дополнительными функциями, используемыми при работе скрипта.
-
logger_config(v: int) -> None # Конфигурирует логгер.
-
generate_date(standart_format=False, unixtime=False) -> str # Генерирует случайную дату. # standard_format задает формат даты. # При unixtime=True возвращает массив, где 1-ый элемент –str, второй # – float.
-
check_size_format(size: str, pat=re.compile(r"^\d*[KMG]B$")) -> str # Проверяет формат параметра (аргумента) скрипта. Например, 1KB, # 5MB, 10GB. При несоответствии вызывает ArgumentTypeError.
-
size_to_bytes(size: str) -> int # Переводит 1KB в 1024.
-
getsize(out: str) -> int # Возвращает размер файлов в директории out в байтах.
-
to_roman(n: int) -> str # Переводит арабское число в римское.
-
add_numbering(instruction: list) -> list # Нумерует каждую инструкцию, рандомно определяет уровень # вложенности инструкции.
-
check_abiword() -> int # Проверяет наличие abiword в системе. Возвращает 0 при успешном # выполнении или вызывает исключение.
-
check_os() -> str # Возвращает название используемой ОС.
-
parse_formats(fmts: str) -> str # Проверяет расширение файлов в аргументе (параметре) скрипта на # соответствие заданному формату.
-
mm_to_px(mm: int, dpi=300) -> int # Переводит из миллиметров в пиксели.
-
PDFunits_to_px(units: int, dpi=300) -> int # Переводит из pdf units в пиксели.
-
calculate_logo_coords() -> list # Считает координаты логотипа в документе.
-
calculate_sign_coords(tmx: int, tmy: int, new_page=False) -> list # Считает координаты подписи в документе.
-
calculate_seal_coords(sign_coords: list, new_page=False) -> list # Считает координаты печати в документе.
-
calculate_borders(original_coords: list, creator_and_date=False, task=False) -> list # Добавляет смещение к границам текста.
-
calculate_text_coords(pdf_path: str, data: tuple) -> list # Считает координаты параграфов с текстом.
Модуль для изменения падежей в тексте ответственных.
Модуль с основными константными параметрами, использующимися при генерации приказов.
Массив formats
содержит форматы дат, аналогичные форматам в библиотеке datetime
.
Основной файл проекта, запускается для генерации приказов.
-
load_samples(samples_dir: str) -> tuple # Загружает образцы из указанной директории. Возвращает кортеж с # данными.
-
generate(data: tuple, out: str, formats: str, size: int, samples_dir: str, is_image: bool) -> None # Запускает процесс генерации приказов, вызывая функции из других # модулей.
-
get_args() -> argparse.Namespace # Парсит флаги скрипта
-
main() -> None # Главная функция скритпа.
Модуль, переопределяющий метод класса date
стандартной библиотеки datetime
. Нужен, чтобы метод strftime
переводил месяц из числа в строку на рускком языке.
Модуль, содержащий функции для записи приказов в файл.
-
extend_instruction(instruction: list, samples_dir: str) -> list # Добавляет ответственных и дедлайн в задачу с шансом 25%, если они # отсутствуют.
-
write_docx(header: str, name: str, intro: str, instruction: list, responsible: str, creator: str, date: str, out: str, count: int, logo: str, sign: str, seal: str) -> str # Создает docx документ с приказом. Через аргументы функция # принимает полный текст с приказом (шапка, название, введение…), # директорию с выходными файлами, порядковый номер приказа, пути к # изображениям (логотип, подпись, печать). Возвращает путь к # сгенерированному документу.
-
write_json(instruction: list, responsible_arr: list, date: list, out: str, count: int) -> str # Создает разметку для приказа. Возвращает путь к сгенерированному # файлу.
-
write_pdf_linux(docx_path: str, out: str, count: int) -> str # Конвертирует docx в pdf. Возвращает путь к сгенерированному # документу.
-
write_jpg(out: str, count: int) -> None # Конвертирует pdf в jpg.
-
extract_tm(pdf_path: str, page_num: int) -> tuple # Функция для метода extract_text. # Считает координаты последнего параграфа в документе.
-
write_coords(json_path: str, pdf_path: str) -> None # Добавляет координаты изображений в pdf файле в json разметку.
Контроль над исполнением распоряжения оставить за {ablt}
– на место
фигурных скобок будет подставляться ответственный в заданном падеже (ablt
– творительный, accs – винительный).
[
"{Министр} {генерал} полиции Российской Федерации В.{{КОЛОКОЛЬЦЕВ}}",
"КОЛОКОЛЬЦЕВ",
"В.",
"",
"Министр генерал полиции Российской Федерации"
]
Первый элемент массива – строка с ответственным, которая пойдет в приказ.
В одинарных фигурных скобках – слово из должности (профессии), у которого нужно изменить падеж.
В двойных фигурных скобках – слово из имени, у которого нужно изменить падеж.
Это сделано так, потому что профессии и имена склоняют две разные библиотеки.
Следующие элементы заносятся в разметку:
-
Второй элемент массива – фамилия;
-
Третий элемент массива – имя;
-
Четвертый элемент массива – отчество;
-
Пятый элемент массива – должность.