я использую код ниже для чтения pdf в свое программе на flask. Мне необходимо написать скрипт, который будет делать всё то же но для всех файлов pdf в указанном каталоге.
# app/loaders/akt_loader.py

import os
import pytesseract
from pdf2image import convert_from_path
from PIL import Image
from app.models import db, Akt, Hardware, UESTable
from datetime import datetime
import re
from config import Config
from app.utils import parse_date, parse_int, parse_float, replace_similar_letters
from app.utils_db import get_or_create, process_cheked_hw
import pymorphy2
import logging


pytesseract.pytesseract.tesseract_cmd = r'D:\Program\Tesseract-OCR\tesseract.exe'
#pytesseract.pytesseract.tesseract_cmd = r'c:\Users\grum77\AppData\Local\Programs\Tesseract-OCR\tesseract.exe'
#morph = pymorphy2.MorphAnalyzer()

# Создаем логгер
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)

def parse_pdf_for_akt(filepath: str, page_type: str, rotation: int):
    """
    Функция для обработки PDF с актами, используя SQLAlchemy.
    Параметры:
    - filepath: путь к PDF файлу
    - page_type: тип обработки страниц ('split' или 'single')
    - rotation: угол поворота
    """
    logger.debug(f"[DEBUG] parse_pdf_for_akt: Обрабатываем файл {filepath}")
    if not os.path.exists(filepath):
        logger.error(f"[ERROR] Файл PDF не найден: {filepath}")
        return

    # Конвертация PDF в изображения
    try:
        pages = convert_from_path(filepath, dpi=300)
    except Exception as e:
        logger.error(f"[ERROR] Ошибка при конвертации PDF в изображения: {e}")
        return
    
    # Папка для сохранения изображений актов
    images_folder = os.path.join(Config.UPLOAD_FOLDER, 'akt_images')
    if not os.path.exists(images_folder):
        os.makedirs(images_folder)

    page_count = 0
    akt_count = 0
    for page_index, page_img in enumerate(pages):
        page_count += 1

        # Поворот изображения на указанный угол
        if rotation != 0:
            page_img = page_img.rotate(rotation, expand=True)
        else:
            # для определения ориентации
            try:
                osd = pytesseract.image_to_osd(page_img)
                rotation = int(re.search('Orientation in degrees: (\d+)', osd).group(1))
                if rotation != 0:
                    page_img = page_img.rotate(rotation, expand=True)
            except pytesseract.TesseractError as e:
                page_img = page_img.rotate(90, expand=True)
                logger.warning(f"[WARNING] Ошибка при определении поворота страницы: {e}. Поворачиваем на 90 влево.")
            # Размер изображения
            w, h = page_img.size

        # Размер изображения
        w, h = page_img.size
        
        if page_type == 'split':
            # Разделяем изображение на левую и правую половины только если режим 'split'
            mid_x = w // 2
            left_img = page_img.crop((0, 0, mid_x, h))
            right_img = page_img.crop((mid_x, 0, w, h))

            for side, img in [('left', left_img), ('right', right_img)]:
                process_image(img, images_folder)
        else:
            # Если режим 'single', просто обрабатываем одно изображение
            process_image(page_img, images_folder)

    logger.debug(f"[DEBUG] parse_pdf_for_akt: обработка завершена. Найдено страниц: {page_count}, актов: {akt_count}.")

def process_image(page_img, images_folder):
    """Processing the image to extract data and perform OCR."""
    try:
        text = pytesseract.image_to_string(page_img, lang="rus+eng")
        #logger.debug(f"[DEBUG] Обрабатываем страницу.")
    except pytesseract.TesseractError as e:
        #logger.warning(f"[WARNING] Ошибка при обработке страницы: {e}. Пропускаем страницу.")
        return
    
    #logger.debug(text)
    number_akt = find_number_akt_in_text(text)
    date_akt = find_date_in_text(text)
    
    image_name = save_akt_image(page_img, number_akt, date_akt, images_folder)
    #logger.debug(f"[DEBUG] Имя файла:{image_name}")

    # Извлекаем дополнительные данные из текста
    description = find_description_in_text(text)
    akt = insert_or_update_akt(
        number_akt=number_akt,
        date_akt=date_akt,
        description=description,
        image_name=image_name
    )
    print(number_akt, image_name)

# ------------------------------------------------------------------------------
# Вспомогательные функции
# ------------------------------------------------------------------------------
def save_akt_image(img: Image.Image, number_akt: str, date_akt: str, images_folder: str, size=(1280, 1280)) -> str:
    """
    Сохраняет изображение акта с именем, содержащим номер акта и стороны.
    Уменьшает изображение и преобразует в градации серого.
    Возвращает имя файла изображения.
    
    :param img: Исходное изображение
    :param number_akt: Номер акта
    :param images_folder: Папка для сохранения изображения
    :param size: Размер для уменьшения изображения (ширина, высота)
    """
    if not os.path.exists(images_folder):
        os.makedirs(images_folder)

    if number_akt:
        image_filename = f"akt_{number_akt}_{date_akt}.png"
    else:
        # Используем текущее время, если номер акта неизвестен
        timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
        image_filename = f"akt_{timestamp}.png"

    if not (isinstance(size, tuple) and len(size) == 2 and all(isinstance(i, (int, float)) for i in size)):
        raise ValueError("Параметр size должен быть кортежем из двух чисел (ширина, высота).")

    # Уменьшаем изображение
    img = img.convert("L")  # Преобразуем изображение в градации серого
    img.thumbnail(size, Image.LANCZOS)  # Уменьшаем изображение в соответствии с заданным размером

    image_path = os.path.join(images_folder, image_filename)
    img.save(image_path, format='PNG')  # Сохраняем в формате PNG
    logger.debug(f"[DEBUG] Изображение сохранено: {image_path}")
    return image_filename  # Сохраняем только имя файла, путь может быть стандартизирован


def find_number_akt_in_text(text: str) -> str:
    # Шаблон для поиска подходящих чисел
    #pattern = re.compile(r"\s*№\s*(\d+)\s*от\s*", re.IGNORECASE)
    #pattern = re.compile(r"\s*(?:№|О|N|Ne|Н|НЕ)?\s*(\d+)[^\d]*", re.IGNORECASE)

    pattern = re.compile(r"\s*(стоянии)?\s*№?\s*(\d+)\s*(от|OT)\s*", re.IGNORECASE)
    
    # Поиск первого совпадения
    match = pattern.search(text)

    # Если найдено первое совпадение, проверяем его
    if match:
        primary_number = match.group(2)
        
        # Проверяем, что это число и его длина в диапазоне от 3 до 7
        if primary_number.isdigit() and 2 <= len(primary_number) <= 7:
            return parse_int(primary_number)

    # Поиск любых чисел в строке длиной от 4 до 5
    length_pattern = re.compile(r'\b\d{4,5}\b')
    secondary_match = length_pattern.search(text)

    if secondary_match:
        secondary_number = secondary_match.group(0)
        # Проверяем, что это число
        if secondary_number.isdigit():
            return parse_int(secondary_number)
    
    return ""

def find_date_in_text(text: str) -> str:
    """
    Извлекает дату из OCR-текста.
    """
    #pattern = re.compile(r"\b\d{1,2}[.\-/]\d{1,2}[.\-/]\d{2,4}\b")
    
    pattern = re.compile(r"\b(\d{2})[.\-/](\d{2})[.\-/](\d{4})\b")
    match = pattern.search(text)

    if match:
        #logger.debug('match дату:','.'.join(match.groups(1)))
        return '.'.join(match.groups(1))
    return ""

def find_description_in_text(text: str) -> str:
    """
    Сохраняет весь распознанный текст.
    """
    return text

def insert_or_update_akt(number_akt: str, date_akt: str,
                         description: str = None, image_name: str = None):
    """
    Создает или обновляет запись в таблице Akt с использованием ORM.
    Возвращает объект Akt.
    """

    date_akt_parsed = parse_date(date_akt)
    akt = Akt.query.filter_by(number_akt=number_akt, date_akt=date_akt_parsed).first()
    if akt:
        akt.number_akt = number_akt
        akt.date_akt = date_akt_parsed
        akt.description = description
        akt.image_name = image_name
        try:
            db.session.commit()
        except Exception as e:
            db.session.rollback()
            print(f"[ERROR] Ошибка при обновлении Akt: {e}")
    else:
        akt = Akt(
            number_akt=number_akt,
            date_akt=date_akt_parsed,
            description=description,
            image_name=image_name
        )
        db.session.add(akt)
        try:
            db.session.commit()
        except Exception as e:
            db.session.rollback()
            print(f"[ERROR] Ошибка при вставке Akt: {e}")
    return akt