Как заблюрить текст в скриншоте документа

У меня есть папка с документами, которые имеют одинаковое оформление. Документы выглядят примерно так:

Документ №1

Условие

Вопрос

Решение

Мне необходимо сделать скриншот первой страницы в каждом документе, и заблюрить (размыть) текст "Решения".

  • Каким образом это можно автоматизировать?

Я понимаю, что с помощью Python и библиотеки Spire.Doc я могу сделать скриншоты документов. И даже заблюрить текст с помощью библиотеки Pillow/ OpenCV возможно, но не понимаю как определить конкретные координаты, на которых нужно нарисовать прямоугольник с эффектом блюра. Если это вообще разумно или возможно.


Ответы (1 шт):

Автор решения: Urest

Может кому-то пригодится. Для начала прикладываю реализацию first page of .DOCX to PNG. Файлы написаны транслитом, потому что в проекте использую OpenCV, а он ругается на кириллицу.

Написал, как смог, прошу не ругаться - я совсем не программист.

import os
import docx2pdf
import pdf2image

# Создаем директорию для выходных PNG-файлов, если ее еще нет
if not os.path.exists('doc_to_png_output'):
    os.makedirs('doc_to_png_output')

os.chdir('document_split_output')
# Получаем список всех файлов Word в текущей директории
word_files = [f for f in os.listdir('.') if f.startswith("Zadacha") and f.endswith(".docx")]

for word_file in word_files:
    # Извлекаем номер задачи из имени файла
    task_number = word_file[7:-5]

    # Конвертируем Word в PDF
    pdf_file = f"temp_{task_number}.pdf"
    docx2pdf.convert(word_file, pdf_file)

    # Конвертируем PDF в PNG

    png_file = f"3. doc_to_png_output/Zadacha{task_number}.png"
    images = pdf2image.convert_from_path(pdf_file, poppler_path='poppler-24.02.0\\Library\\bin')
    os.chdir('..')
    images[0].save(png_file, "PNG")

    # Удаляем временный PDF-файл
    os.chdir('document_split_output')
    os.remove(pdf_file)
    print(f'Zadacha{task_number}.png has been successfully saved')

И реализация blur image region. Полуавтоматическая работа, регион для блюра выбираю сам.

import os


# Функция для получения координат прямоугольной области из изображения
def get_roi(image):
    height, width = image.shape[:2]
    aspect_ratio = width / height

    # Установите начальный размер окна с учетом соотношения сторон
    window_width = 880
    window_height = int(window_width / aspect_ratio)
    cv2.namedWindow('Select ROI', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('Select ROI', window_width, window_height)

    roi = cv2.selectROI('Select ROI', image)
    cv2.destroyWindow('Select ROI')
    return roi


# Функция для размытия выбранной области с помощью GaussianBlur
def blur_roi(image, roi):
    x, y, w, h = roi
    if w > 0 and h > 0:
        roi_region = image[y:y + h, x:x + w]
        blurred = cv2.GaussianBlur(roi_region, (51, 51), 0)
        image[y:y + h, x:x + w] = blurred
    return image


# Обработка всех PNG файлов в текущей директории
for filename in os.listdir('doc_to_png_output'):
    if filename.endswith('.png'):
        # Открытие изображения
        image = cv2.imread(os.path.join('doc_to_png_output', filename))

        # Отображение изображения и выбор области для размытия
        clone = image.copy()
        roi = get_roi(clone)

        # Применение Гауссова размытия к выбранной области
        blurred = blur_roi(image, roi)

        # Сохранение обработанного изображения
        output_filename = os.path.splitext(filename)[0] + '.png'
        cv2.imwrite(os.path.join('blurred_images_output', output_filename), blurred)

        # Закрытие окон с изображениями
        cv2.destroyAllWindows()
→ Ссылка